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 修改这些数据的原因和方式。

开放式SSL

运行:

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”混合(在每个数字之后)。

4

2 回答 2

2

我对 ruby​​ 有同样的问题,并在使用 java 的 java X509 序列号中找到了答案

对于那些想要红宝石解决方案的人

serial = 275106190557734483187066766755592068430195471929
serial.to_s(16)

这将输出 3030303031303030303030313030373439323639

于 2013-11-08T17:04:40.547 回答
1

Java 不会修改这些数据。如果 openssl 也这样做,我会感到惊讶。大概你的期望是不正确的。

于 2010-08-08T03:32:32.420 回答