获取X509证书序列号

4

我需要获取x509证书的序列号。使用"certificate.getSerialNumber()"的结果与预期不同。根据我所看到的X509证书文件规范,它应该遵循以下格式:

    Certificate  ::=  SEQUENCE  {
        tbsCertificate       TBSCertificate,
        signatureAlgorithm   AlgorithmIdentifier,
        signatureValue       BIT STRING  }

   TBSCertificate  ::=  SEQUENCE  {
        version         [0]  EXPLICIT Version DEFAULT v1,
        serialNumber         CertificateSerialNumber,
        signature            AlgorithmIdentifier,
        issuer               Name,
        validity             Validity,
        subject              Name,
        subjectPublicKeyInfo SubjectPublicKeyInfo,
        issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,
                             -- If present, version shall be v2 or v3
        subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,
                             -- If present, version shall be v2 or v3
        extensions      [3]  EXPLICIT Extensions OPTIONAL
                             -- If present, version shall be v3
        }

我找不到文件开头通过certificate.getSerialNumber()方法提供的值。

相关问题:尝试使用openssl显示序列号时,它从文件中获取正确的值,但在每个数字后添加“3”。

所以我的问题是:如何获取存储的序列号值?在哪里可以阅读openssl和java如何修改此数据的原因和方式。

OPENSSL

运行命令:

openssl x509 -serial -noout -inform DER -in mycert.cer

结果:

serial=3030303031303030303030313030373439323639

JAVA

代码:

InputStream in = new FileInputStream("mycert.cer");
BouncyCastleProvider provider = new BouncyCastleProvider();
CertificateFactory certificateFactory = CertificateFactory.getInstance("X509", provider);
X509Certificate certificate = (X509Certificate) certificateFactory.generateCertificate(in);
BigInteger serialNum = certificate.getSerialNumber();
System.out.println(serialNum);

输出:

275106190557734483187066766755592068430195471929

文件

查看文件,我看到:

0...0..r.......000010000001007492690
.   *.H..
..

这似乎是由OpenSSL提供的序列号,但OpenSSL会将它与“3”混合在一起(在每个数字后面)。


1
作为参考,0x30 是 ASCII 码中表示数字 '0' 的代码。同样地,0x31 表示 '1',一直到 0x39 表示 '9'。 - cHao
关于OpenSSL库,https://zakird.com/2013/10/13/certificate-parsing-with-openssl/和http://fm4dd.com/openssl/certserial.htm上有很多有用的内容。 - EpicPandaForce
X509使用Java序列号提供了解决方案:.getSerialNumber().toString(16) - Vadzim
2个回答

2

我曾经在ruby中遇到同样的问题,在这里找到了答案,该答案是基于java实现的:使用Java获取X509证书序列号

对于那些想要ruby解决方案的人:

serial = 275106190557734483187066766755592068430195471929
serial.to_s(16)

这将输出3030303031303030303030313030373439323639。

(注:此为十六进制字符串)

1

Java不会修改这些数据。如果openssl也这样做,我会感到惊讶的。可能是你的期望有误。


你好,我修改了我的问题。我知道我错在哪里了,请帮我找出来。需要从文件中获取数字作为结果。 - Denis
OpenSSL只是打印十六进制值。'0'是0x30,'1'是0x31等等。我不知道Java在做什么,但我现在无法从iPad上看到您的所有代码,明天我会好好看一下。 - user207421
你的Java代码看起来还不错,只要它读取的是同一个文件。 - user207421
是的,这是同一个文件。您还可以帮助投票以使此问题更具标记性。 - Denis

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