gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:59:22 24 4
gpt4 key购买 nike

我得到一个代表 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 编码的 byte[] 的正确方法是什么?

(我正在使用 Java 7,我对为此使用第 3 方库不感兴趣,我正在寻找一种 JDK7 的方式。)

最佳答案

重要

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

所以你可以用它来获取证书对象详见 How to load public certificate from pem file..? (这是@dave 对同一主题的较早回答,所以如果您觉得有用,请点赞它,而不是这个!),然后访问其编码 (DER) 形式。

但是,如果您的 PEM 文件是原始的“RSA 公钥”(如附加到此问题的那个),或者 SunJCE 实现无法直接解析的其他实体,您仍然可以手动解析和解码它,详情如下。


从技术上讲,您在这里拥有的不是证书,而只是公钥。

你可以像这样简单地将它解码为 DER 字节:

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

请注意,您将获得原始 RSA (PKCS#1) key :

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 encode and decode a string .

例如那里描述的 java.xml.bind 方法不需要 Java 7 上的任何额外库(这似乎符合 OP 的要求)

关于java - 将证书字符串转换为字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40442777/

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