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