我正在尝试解密一封S/MIME邮件(最初通过Outlook发送),为此我使用了bouncycastle API。然而,我遇到了一个问题。
在Windows证书存储中,我有收件人的证书。我之前使用它向对方发送了签名和加密的电子邮件,他们又用它给我发送了加密回复。然后,我将证书(带有私钥)导出为.pfx文件,并将该文件加载到Java KeyStore中。但是它不起作用,我怀疑这是因为主题密钥标识符不匹配。
以下是我用于从KeyStore获取主题密钥ID的代码:
在Windows证书存储中,我有收件人的证书。我之前使用它向对方发送了签名和加密的电子邮件,他们又用它给我发送了加密回复。然后,我将证书(带有私钥)导出为.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()
)时,返回的唯一收件人(应该只有一个)具有此主题密钥标识符:
04 14 88 ed bb 7c 64 7b 41 63 48 0a 24 40 2b 3c d0 78 72 3c 30 b3
只有两个额外的字节,而不是四个,我猜这就是为什么我无法使用证书解密电子邮件的原因。
为什么这些主题关键标识符都不匹配?我做错了什么吗?