2010-08-07 87 views
4

我需要獲得x509證書的序列號。使用「certificate.getSerialNumber()」的結果與預期的不同。當我看到X509證書文件的規格,它應該在以下格式:獲得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 

FILE

和查看文件,我看到:

0...0..r.......000010000001007492690 
. *.H.. 
.. 

這似乎是串行的,由OpenSSL的,但OpenSSL的組合提供它與'3'(在每個數字之後)。

+0

作爲參考,'的0x30 '是'0'的ASCII碼。同樣,'0x31'代表'1'...一直到0x39。 – cHao 2011-09-29 10:32:53

+0

https://zakird.com/2013/10/13/certificate-parsing-with-openssl/和http://fm4dd.com/openssl/certserial.htm – EpicPandaForce 2015-03-24 11:51:01

+0

[X509中有許多關於OpenSSL Library的有用資料序列號使用java](http://stackoverflow.com/questions/12582850/x509-serial-number-using-java)提供的解決方案:'.getSerialNumber()。toString(16)' – Vadzim 2015-09-15 11:49:41

回答

1

Java不會修改此數據。如果openssl也這麼做,我會很驚訝。大概你的期望是不正確的。

+0

你好,我修改了我的問題。我知道我錯了某個地方,請幫我找到位置。結果需要來自文件的編號。 – Denis 2010-08-08 07:42:24

+0

OpenSSL只是打印十六進制值。 '0'是0x30,'1'是0x31等等。不知道Java在幹什麼,但是我目前無法從iPad看到你所有的代碼,明天我會看一看。 – EJP 2010-08-08 08:27:56

+0

您的Java代碼對我來說看起來還不錯,前提是它正在讀取同一個文件。 – EJP 2010-08-09 04:29:51

2

我有紅寶石同樣的問題,在這裏找到了答案在Java中X509 serial number using java

對於那些誰想要在紅寶石的解決方案

serial = 275106190557734483187066766755592068430195471929 
serial.to_s(16) 

這將輸出3030303031303030303030313030373439323639