java - 如何将JAVA中的x509证书的公钥转换为十六进制

标签 java x509certificate

我们需要在项目中获取“x509 证书的公钥”。我们使用 x509Certificate.getPublicKey() API 来获取 byte[],然后计算它的十六进制形式。例如,用java计算的证书的十六进制形式的公钥如下

30820122300d06092a864886f70d01010105000382010f003082010a0282010100af240808297a359e600caae74b3b4edc7cbc3c451cbb2be0fe2902f95708a36 4851527f5f1adc831895d22e82aaaa642b38ff8b955b7b1b74bb3fe8f7e0757ecef43db66621561cf600da4d8def8e0c362083d5413eb49ca59548526e52b8f1b9febf5a191 c23349d843636a524bd28fe870514dd189697bc770f6b3dc1274db7b5d4b56d396bf1577a1b0f4a225f2af1c926718e5f40604ef90b9e400e4dd3ab519ff02baf43ceee08be b378becf4d7acf2f6f03dafdd759133191d1c40cb7424192193d914feac2a52c78fd50449e48d6347883c6983cbfe47bd2b7e4fc595ae0e9dd4d143c06773e314087ee53 f9f73b8330acf5d3f3487968aee53e825150203010001

但是当我们双击证书并在详细信息选项卡中看到公钥的值时,它如下:

3082010a0282010100af240808297a359e600caae74b3b4edc7cbc3c451cbb2be0fe2902f95708a364851527f5f1adc831895d22e82aaaa642b38ff8b955b7b1b74 bb3fe8f7e0757ecef43db66621561cf600da4d8def8e0c362083d5413eb49ca59548526e52b8f1b9febf5a191c23349d843636a524bd28fe870514dd189697bc770f6b3dc1274 db7b5d4b56d396bf1577a1b0f4a225f2af1c926718e5f40604ef90b9e400e4dd3ab519ff02baf43ceee08beb378becf4d7acf2f6f03dafdd759133191d1c40cb7424192193d9 14feac2a52c78fd50449e48d6347883c6983cbfe47bd2b7e4fc595ae0e9dd4d143c06773e314087ee53f9f73b8330acf5d3f3487968aee53e825150203010001

我们发现JAVA api计算的值在开头多了44个字符,从第45个字符开始数据与windows计算的值相同。

任何人都可以帮我确定如何计算证书的公钥,这与Windows计算的相同。

谢谢。

最佳答案

在 X509 证书中,公钥被编码到名为 SubjectPublicKeyInfo 的 ASN.1 结构中。看起来像这样:

SubjectPublicKeyInfo  ::=  SEQUENCE  {
     algorithm            AlgorithmIdentifier,
     subjectPublicKey     BIT STRING  }

算法字段标识 key 的类型(RSA、DSA、Diffie Hellman...),位串包含编码为取决于 key 类型的结构的公钥数据。

在您的情况下,第一个字节[]包含SubjectPublicKeyInfo的所有数据,包括顶级SEQUENCE标记、长度和algorithm字段以及subjectPublicKey 字段。

第二个字节[]仅包含第二个字段(即位串)。在您的示例中,这是一个 RSA 公钥 encoded with this structure :

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

关于java - 如何将JAVA中的x509证书的公钥转换为十六进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9767309/

相关文章:

mysql - 在 delphi 中将 ca.pem 文件的内容作为硬编码字符串提供给 SSL 连接

java - 为什么 Tomcat 无法显示实际的堆栈跟踪?

java - Jhipster 或 Spring Data JPA

.net - Mono 在 Linux 中哪里安装 X509 证书?

c# - 解码X509Certificate2的序列号?

java - 我如何检查证书 A 是否获得证书 B 作为 Java 的颁发者? --> X509Certificates

java - 寻找 4 个元素的共同元素

java - 基于参数的通用转换

java - 属性值的自定义类型转换

c# - 使用 C# 从 CA 证书创 build 备的 X509 证书