Мне нужно получить серийный номер сертификата x509. Результат использования «certificate.getSerialNumber()» отличается от ожидаемого. Как я вижу, X509 спецификации файла сертификата, он должен идти в следующем формате:получить серийный номер X509Certificate
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
FILE
И просмотрев файл, я вижу:
0...0..r.......000010000001007492690
. *.H..
..
, который, как представляется, серийный, обеспечивается OpenSSL, но OpenSSL смеси он с «3» (после каждого номера).
Для справки, '0x30 '- это код ASCII для '0'. Аналогично '0x31' для '1' ... вплоть до 0x39. – cHao
В библиотеке OpenSSL есть много полезного материала на https://zakird.com/2013/10/13/certificate-parsing-with-openssl/ и http://fm4dd.com/openssl/certserial.htm – EpicPandaForce
[X509 серийный номер с помощью java] (http://stackoverflow.com/questions/12582850/x509-serial-number-using-java) предоставляет решение: '.getSerialNumber(). toString (16)' – Vadzim