Java 检索x509证书的序列号时缺少前导零

Java 检索x509证书的序列号时缺少前导零,java,x509,java-security,Java,X509,Java Security,我正在尝试从X.509证书获取序列号。。当我将代码生成的序列号与实际序列号(在windows上)进行比较时,实际序列号(X509证书)的前导零丢失 有什么建议或替代方法来获取x.509证书的十六进制序列号和前导零 下面是我当前使用的代码段: InputStream in = new FileInputStream("cert"); CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); X5

我正在尝试从X.509证书获取序列号。。当我将代码生成的序列号与实际序列号(在windows上)进行比较时,实际序列号(X509证书)的前导零丢失

有什么建议或替代方法来获取x.509证书的十六进制序列号和前导零

下面是我当前使用的代码段:

InputStream in = new FileInputStream("cert");
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
X509Certificate certificate = (X509Certificate) certificateFactory.generateCertificate(in);
String serialNum = certificate.getSerialNumber().toString(16);
System.out.println(serialNum);

biginger
有一个
toByteArray()
方法,该方法重新添加前导的00:

byte[] serialNumBA = certificate.getSerialNumber().toByteArray()
现在有几种方法可以将字节数组转换为十六进制字符串:

例如,使用Apache commons编解码器:

String serialNum = Hex.encodeHexString(serialNumBA);

为什么你认为应该有叶子零?能否显示证书的ASN编码序列号?实际序列号如下所示‎00 a6 XX XX XX XX XX XX XX。但是上面的源代码生成的序列号看起来像a6-XX-XX-XX-XX-XX。。缺少前导00。序列号定义为ASN.1整数。前导零不重要。@实际上,前导零是重要的。ASN.1整数是两个补码整数。根据RFC5280,序列号必须为正整数。如果正整数的最高有效位为1,则编码值必须在前面加上额外的零字节,以表示正整数。实际上它不保留00s;它重新添加了签名所需的单个00 iff,这(幸运的)与N.1 DER使用的规则相同。谢谢..,当我使用openssl读取自签名证书的序列号时,它没有显示前导的00。但是当我在windows中读取序列号时,它显示序列号中的前导oo。我可以知道为什么吗?@jAnA当你有一个整数值(一个数字)时,该值总是有几个字符串表示形式。您还可以将证书序列号显示为以10为基数的字符串表示形式。省略前导零并不一定是坏事。如果您只想在屏幕上显示证书序列号,那么它可能没问题,因为应该知道它必须是一个正数,这使得00是多余的。如果您想将序列号作为字符串存储在数据库中,然后在以后搜索它,那么您必须非常小心,始终使用相同的算法进行转换。