将证书字符串转换为字节数组



我得到了一个代表PEM证书的字符串:

-----BEGIN CERTIFICATE-----
MIICUTCCAfugAwIBAgIBADANBgkqhkiG9w0BAQQFADBXMQswCQYDVQQGEwJDTjEL
MAkGA1UECBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMC
VU4xFDASBgNVBAMTC0hlcm9uZyBZYW5nMB4XDTA1MDcxNTIxMTk0N1oXDTA1MDgx
NDIxMTk0N1owVzELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAlBOMQswCQYDVQQHEwJD
TjELMAkGA1UEChMCT04xCzAJBgNVBAsTAlVOMRQwEgYDVQQDEwtIZXJvbmcgWWFu
ZzBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQCp5hnG7ogBhtlynpOS21cBewKE/B7j
V14qeyslnr26xZUsSVko36ZnhiaO/zbMOoRcKK9vEcgMtcLFuQTWDl3RAgMBAAGj
gbEwga4wHQYDVR0OBBYEFFXI70krXeQDxZgbaCQoR4jUDncEMH8GA1UdIwR4MHaA
FFXI70krXeQDxZgbaCQoR4jUDncEoVukWTBXMQswCQYDVQQGEwJDTjELMAkGA1UE
CBMCUE4xCzAJBgNVBAcTAkNOMQswCQYDVQQKEwJPTjELMAkGA1UECxMCVU4xFDAS
BgNVBAMTC0hlcm9uZyBZYW5nggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEE
BQADQQA/ugzBrjjK9jcWnDVfGHlk3icNRq0oV7Ri32z/+HQX67aRfgZu7KWdI+Ju
Wm7DCfrPNGVwFWUQOmsPue9rZBgO
-----END CERTIFICATE-----

我将上述字符串赋值给字符串变量String myCertStr

myCertStr转换为DER编码字节[]的正确方法是什么?

(我正在使用Java 7,我对使用第三方库不感兴趣,我正在寻找一种JDK7的方式来做到这一点。)

重要

正如@dave_thompson_085在评论中指出的,SunJCE CertificateFactory确实能够解析PEM文件。

你可以用它来获取Certificate对象详见如何从pem文件加载公共证书。?(这是@dave关于同一主题的早期答案,所以如果你觉得这个有用,请给它投票,而不是这个!),然后访问它的编码(DER)形式。

然而,如果你的PEM文件是一个原始的"RSA公钥"(就像附在这个问题上的那个),或者是SunJCE实现不能直接解析的其他实体,你仍然可以手动解析和解码它,如下所述。


从技术上讲,您在这里得到的不是证书,而只是一个公钥。

您可以将其解码为DER字节,就像这样简单:

byte[] derBytes = Base64.getDecoder().decode(
    pemText.replaceAll("-----(BEGIN|END) RSA PUBLIC KEY-----", "").replaceAll("n", "")
);

注意,您将得到的将是一个原始的RSA (pkcs# 1)密钥:

RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
}

您可以使用相同的技术来解码X.509证书或私钥。

。解码X.509证书的代码:

byte[] certificateBytes = Base64.getDecoder().decode(
    pemText.replaceAll("-----(BEGIN|END) CERTIFICATE-----", "").replaceAll("n", "").getBytes("UTF-8")
);
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
    X509Certificate certificate = (X509Certificate)(certificateFactory.generateCertificate(
        new ByteArrayInputStream(certificateBytes)
    )
);

上面的代码使用Java 8 Base64解码器。由于问题已经更新,要求提供Java 7解决方案,这里有一个很棒的线程的链接,讨论了各种可用的选项:Base64 Java编码和解码字符串。

。这里描述的Java .xml.bind方法在Java 7上不需要任何额外的库(这似乎与OP想要的相匹配)

最新更新