Java中使用X509序列号

14

我需要从 X509 证书中获取一些数据。

如果在 Windows 中打开证书文件,它会以这种格式显示其序列号。

ex. 39 65 70 eb d8 9f 28 20 4e c2 a0 6b 98 48 31 0d 

我正在尝试使用Java获取相同的数据。获取数据后,我会使用

x509.getSerialNumber();
and result is : 76292708057987193002565060032465481997

那么这两者有什么区别?我想要的结果是上面那个。

2个回答

29

在Windows中,序列号以十六进制表示,而Java从X509Certificate.getSerialNumber()返回一个BigInteger结果。

要将BigInteger显示为十六进制值,只需调用toString(16)

BigInteger bi = new BigInteger("76292708057987193002565060032465481997");
System.out.println(bi.toString(16));

将输出:

396570ebd89f28204ec2a06b9848310d

我也将其转换为十六进制,但我的错误在于将其转换成字节。 即:**"76292708057987193002565060032465481997".getBytes();** 所以我得到了这个结果 3736323932373038303537393837313933303032353635303630303332343635343831393937。 @Duncan,你肯定救了我,我已经尝试了三个小时... - Ravi A

2

第一个值是证书的十六进制值,另一个是十进制值。

现在取决于您如何转换初始证书字节数组以将其打印出来。

假设这是您的证书:

byte[] cert = { (byte) 0xFD, (byte) 0xB1, (byte) 0xDD, ..., (byte) 0x00 };
BigInteger certVal = new BigInteger(cert);  
System.out.println("And result is  (hex): " + certVal.toString(16));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接