получить серийный номер X509Certificate

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


person Denis    schedule 07.08.2010    source источник
comment
Для справки, 0x30 — это код ASCII для «0». Аналогично 0x31 для '1'... вплоть до 0x39.   -  person cHao    schedule 29.09.2011
comment
серийный номер X509 с использованием java обеспечивает решение: .getSerialNumber().toString(16)   -  person Vadzim    schedule 15.09.2015


Ответы (2)


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

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

serial = 275106190557734483187066766755592068430195471929
serial.to_s(16)

это выведет 3030303031303030303030313030373439323639

person Erick Eduardo Garcia    schedule 08.11.2013

Java не изменяет эти данные. Я был бы удивлен, если бы openssl сделал то же самое. Вероятно, ваши ожидания неверны.

person user207421    schedule 08.08.2010
comment
Здравствуйте, я изменил свой вопрос. Я знаю, что я где-то ошибаюсь, пожалуйста, помогите мне найти, где. В качестве результата требуется номер из файла. - person Denis; 08.08.2010
comment
OpenSSL просто печатает шестнадцатеричные значения. «0» — это 0x30, «1» — это 0x31 и т. д. Понятия не имею, что делает Java, но в данный момент я не вижу весь ваш код с iPad, завтра посмотрю как следует. - person user207421; 08.08.2010
comment
Ваш код Java выглядит нормально для меня, если он читает тот же файл. - person user207421; 09.08.2010
comment
Да, это один и тот же файл. Вы также можете помочь проголосовать за этот вопрос, чтобы сделать его более заметным. - person Denis; 09.08.2010