4

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

ジャワ

コード:

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」(各番号の後に)と混ぜます。

4

2 に答える 2

2

ルビーでも同じ問題があり、Java X509シリアル番号でJavaを使用して答えを見つけました

rubyで解決したい方へ

serial = 275106190557734483187066766755592068430195471929
serial.to_s(16)

これは 3030303031303030303030313030373439323639 を出力します

于 2013-11-08T17:04:40.547 に答える
1

Java はこのデータを変更しません。opensslがどちらかを行った場合、私は驚かれることでしょう。おそらくあなたの期待は間違っています。

于 2010-08-08T03:32:32.420 に答える