S/MIME メール (もともと Outlook 経由で送信されたもの) を復号化しようとしています。そのために、bouncycastle API を使用しています。しかし、私は思わぬ障害に遭遇しています。
Windows 証明書ストアに、受信者の証明書があります。私は以前、署名付きで暗号化された電子メールを相手方に送信するためにそれを使用していました。次に、証明書 (秘密鍵付き) を .pfx ファイルとしてエクスポートし、この pfx ファイルを Java KeyStore にロードしました。しかし、それは機能しません。これは、サブジェクトのキー識別子が一致しないためだと思われます。
KeyStore からサブジェクト キー ID を取得するために使用しているコードは次のとおりです。
KeyStore ks = KeyStore.getInstance("PKCS12");
char[] pw = "password".toCharArray();
ks.load(new FileInputStream("d:\\cert_priv_key.pfx"), pw);
Enumeration en = ks.aliases();
while( en.hasMoreElements() )
{
String alias = (String)en.nextElement();
System.out.println(alias);
if( ks.isKeyEntry(alias) )
{
Certificate[] chain = ks.getCertificateChain(alias);
X509Certificate cert = (X509Certificate)chain[0];
byte[] id = cert.getExtensionValue("2.5.29.14");
System.out.println(" " + toHex(id));
}
}
これにより、次のキー識別子が出力されます。
04 16 04 14 88 ed bb 7c 64 7b 41 63 48 0a 24 40 2b 3c d0 78 72 3c 30 b3
ただし、Windows 証明書ストアを確認すると、キー識別子が異なります。
88 ed bb 7c 64 7b 41 63 48 0a 24 40 2b 3c d0 78 72 3c 30 b3
KeyStore は前に余分な 4 バイトを返します (対象のキー識別子は、キーの 160 ビット SHA1 ハッシュである必要があるため、長さは 20 バイトですよね?)。
さらに紛らわしいのは、bouncycastle API を使用して S/MIME 電子メールを解析し、受信者 ( SMIMEEnveloped.getRecipientInfos().getRecipients()
) を調べると、返された唯一の受信者 (1 つだけである必要があります) がこのサブジェクト キー識別子を持っているという事実です。
04 14 88 ed bb 7c 64 7b 41 63 48 0a 24 40 2b 3c d0 78 72 3c 30 b3
...余分なバイトは4バイトではなく2バイトだけです。これが、証明書で電子メールを復号化できない理由だと思います。
これらのサブジェクト キー識別子がどれも一致しないのはなぜですか? 私は何を間違っていますか?