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