2010-08-07 2 views
4

Мне нужно получить серийный номер сертификата 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» (после каждого номера).

+0

Для справки, '0x30 '- это код ASCII для '0'. Аналогично '0x31' для '1' ... вплоть до 0x39. – cHao

+0

В библиотеке OpenSSL есть много полезного материала на https://zakird.com/2013/10/13/certificate-parsing-with-openssl/ и http://fm4dd.com/openssl/certserial.htm – EpicPandaForce

+0

[X509 серийный номер с помощью java] (http://stackoverflow.com/questions/12582850/x509-serial-number-using-java) предоставляет решение: '.getSerialNumber(). toString (16)' – Vadzim

ответ

1

Java не модифицирует эти данные. Я был бы поражен, если бы открыл это. Предположительно, ваши ожидания неверны.

+0

Здравствуйте, я изменил свой вопрос. Я знаю, что я где-то не прав, пожалуйста, помогите мне найти, где. В результате требуется число из файла. – Denis

+0

OpenSSL просто печатает шестнадцатеричные значения. «0» - 0x30, «1» - 0x31 и т. Д. Не знаю, что делает Java, но я не могу сейчас увидеть весь ваш код с iPad, я буду выглядеть хорошо. – EJP

+0

Ваш код Java выглядит хорошо для меня, если он читает тот же файл. – EJP

2

У меня была такая же проблема с рубином и нашел ответ здесь в Java X509 serial number using java

Для тех, кто хочет решение в рубин

serial = 275106190557734483187066766755592068430195471929 
serial.to_s(16) 

это Выведет 3030303031303030303030313030373439323639