Я пытаюсь расшифровать электронную почту S / MIME (первоначально отправленную через Outlook), и для этого я использую API bouncycastle.Однако я сталкиваюсь с проблемой.
В хранилище сертификатов Windows у меня есть сертификат для получателя.Ранее я использовал его для отправки подписанного и зашифрованного электронного письма другой стороне, а они, в свою очередь, использовали его для отправки мне зашифрованного ответа.Затем я экспортировал сертификат (с закрытым ключом) в виде файла .pfx и загрузил этот файл pfx в хранилище ключей Java.Однако это не работает, и я подозреваю, что это потому, что идентификаторы ключа субъекта не совпадают.
Вот код, который я использую для получения идентификатора ключа субъекта из хранилища ключей:
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 байтов, правильно?).
Еще более запутанным является тот факт, что когда я анализируюS / MIME электронная почта, используя API bouncycastle, и просмотрите получателей (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
... itимеет только два дополнительных байта, а не четыре, и я предполагаю, что именно поэтому я не могу расшифровать письмо с сертификатом.
Почему ни один из этих идентификаторов ключей субъекта не совпадает?Что я делаю не так?