gpt4 book ai didi

Java无法加载 "BEGIN TRUSTED CERTIFICATE"格式的证书

转载 作者:行者123 更新时间:2023-11-29 07:24:49 28 4
gpt4 key购买 nike

我有一个由 openssl 使用“trustout”生成的 CA 证书,所以它以“-----BEGIN TRUSTED CERTIFICATE-----”开头,当我尝试用 Java 读取它时,异常抛出.Java是否支持这种格式的证书?如果有,怎么读?

public class TestReadCerts {

public static void main(String[] args) {
// TODO Auto-generated method stub
String sslrootcertfile = "F:\\javaworkspace\\opensource\\certs\\ca.pem";

FileInputStream fis=null;
try {
fis = new FileInputStream(sslrootcertfile); // NOSONAR
} catch (FileNotFoundException ex) {
ex.printStackTrace();
}
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");

Object[] certs = cf.generateCertificates(fis).toArray(new Certificate[]{});

} catch (Exception e) {
e.printStackTrace();
}
}

}

异常:java.security.cert.CertificateException: 无法初始化,

java.io.IOException: extra data given to DerValue constructor
at java.base/sun.security.x509.X509CertImpl.<init>(X509CertImpl.java:191)
at java.base/sun.security.provider.X509Factory.parseX509orPKCS7Cert(X509Factory.java:476)
at java.base/sun.security.provider.X509Factory.engineGenerateCertificates(X509Factory.java:361)
at java.base/java.security.cert.CertificateFactory.generateCertificates(CertificateFactory.java:478)
at TestReadCerts.main(TestReadCerts.java:21)
Caused by: java.io.IOException: extra data given to DerValue constructor
at java.base/sun.security.util.DerValue.init(DerValue.java:409)
at java.base/sun.security.util.DerValue.<init>(DerValue.java:294)
at java.base/sun.security.util.DerValue.<init>(DerValue.java:305)
at java.base/sun.security.x509.X509CertImpl.<init>(X509CertImpl.java:188)
... 4 more

证书如下:

-----BEGIN TRUSTED CERTIFICATE-----
MIICATCCAWoCCQDjKSwZBsrQwTANBgkqhkiG9w0BAQsFADBFMQswCQYDVQQGEwJB
VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0
cyBQdHkgTHRkMB4XDTE5MDQwMzE0NDcwMVoXDTIwMDQwMjE0NDcwMVowRTELMAkG
A1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0
IFdpZGdpdHMgUHR5IEx0ZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAyRCB
rbB/FqN6e9IAJ86WUUGxM+8vEyfQ7cn2HWca220NB/Ns3Q+QtvztSe48PUzn9w6s
MNOwsDW4+8lenPLd78J32lG59x1P1R1jpjL3GcjNTwuewW1jIsex8jALzfU9hJzO
prraO/6X+UbKbazXt6GiB7mOlUvneKsWuoGpF5MCAwEAATANBgkqhkiG9w0BAQsF
AAOBgQCN1UJF/FdT84bzEn1kmg77b+LCCrU11DsFg/s/ABvo5TKV+OmilBPj1vML
dbZ4GDQSaXKZAOyJiAp0S5BzHXlXz5YfX9sM4mfhaqZt736WAnKVSnzd55CjMlEk
GxW3TkRFL5cVm5my1UQs3Mfg4MC5QPaoer5kc+0UhMHmTlgyvTAMMAoGCCsGAQUF
BwMB
-----END TRUSTED CERTIFICATE-----

最佳答案

PEM 类型 'TRUSTED CERTIFICATE' 是一种 OpenSSL 特定的非标准格式,Java 无法开箱即用。它实际上包含标准 X.509 证书作为一个 DER block 加上另一个 OpenSSL 定义的 DER 信任信息 block 。

如果您有 OpenSSL,最简单的方法是使用 openssl x509 <in >out 转换为标准的“CERTIFICATE”格式.您可以添加-outform DER正如 Misantorp 所做的那样,但它不是必需的; CertificateFactory可以读取 DER 或 PEM 中的标准格式,因为 OpenSSL 不准确地调用它们。

如果您拥有或可以从 https://www.BouncyCastle.org 获取和使用 bcpkix 和 bcprov ,它们包含处理此 OpenSSL PEM 格式(以及许多其他格式)的例程:

        // assumes filename in args[0], adjust as needed
Object both = new PEMParser(new FileReader(args[0])).readObject();
// should close the FileReader, maybe using try-resources
byte[] cert = ((X509TrustedCertificateBlock)both).getCertificateHolder().getEncoded();
X509Certificate good = (X509Certificate) CertificateFactory.getInstance("X.509")
.generateCertificate(new ByteArrayInputStream(cert));
System.out.println (good.getSubjectX500Principal().getName());

否则,可以手动分解 DER 但笨拙且不稳健:

        String in1 = new String(Files.readAllBytes(new File(args[0]).toPath()));
byte[] both = Base64.getMimeDecoder().decode(in1.replaceAll("-----[A-Z ]*-----\\r?\\n",""));
if( both[0]!=0x30 || both[1]!=(byte)0x82 ) throw new Exception("wrong!"); // or other handling
byte[] cert = Arrays.copyOf(both, (both[2]<<8 | both[3]&0xFF) + 4);
X509Certificate good = (X509Certificate) CertificateFactory.getInstance("X.509")
.generateCertificate(new ByteArrayInputStream(cert));
System.out.println (good.getSubjectX500Principal().getName());

关于Java无法加载 "BEGIN TRUSTED CERTIFICATE"格式的证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55550299/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com