我需要获取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”混合在一起(在每个数字后面)。
0x30
是 ASCII 码中表示数字 '0' 的代码。同样地,0x31
表示 '1',一直到0x39
表示 '9'。 - cHao.getSerialNumber().toString(16)
。 - Vadzim