Проблема
Это известная проблема с Microsoft Outlook 2010, но есть исправление - вы можете уведомить отправителя о том, что он должен ее применить.
К сертификатам X.509 прикреплено несколько атрибутов, некоторые из них можно использовать для идентификации сертификатов. Одним из таких способов является использование серийного номера вместе с эмитентом сертификата (вместе они должны формировать уникальный идентификатор). Для сообщений, зашифрованных S/MIME, это называется issuerAndSerialNumber
. Альтернативой является также стандартизированный subjectKeyIdentifier
, который "должен быть" получен из открытого ключа в некоторой форме, но не определен специально.
Outlook 2010 (до SP1) использует subjectKeyIdentifier
и создает его, если такой идентификатор не указан (из статьи базы знаний, указанной выше, с выделением, добавленным мной):
Синтаксис криптографических сообщений (CMS) документирован в RFC 5652. Эта спецификация позволяет использовать в качестве SignerIdentifier subjectKeyIdentifier или isserAndSerialNumber. Релиз (окончательная первоначальная версия) Outlook 2010 использует subjectKeyIdentifier в качестве SignerIdentifier, тогда как в более ранних версиях используется IssueAndSerialNumber. Если расширение subjectKeyIdentifier не определено в сертификате, Outlook 2010 RTM создает его. Некоторые почтовые клиенты или сторонние операционные системы не могут использовать сгенерированный Outlook subjectKeyIdentifier. Это приводит к тому, что получатель не может расшифровать и прочитать сообщение.
Другими словами, в Microsoft Outlook 2010 pre-SP1 используется идентификатор сертификата, который, скорее всего, не понят ни для одного другого почтового приложения. На самом деле мне не удалось использовать последнюю версию Outlook для расшифровки такого сообщения!
Как расшифровать сообщение в любом случае
Это будет непросто и включает в себя переход в командную строку. Это должно работать практически во всех операционных системах (Linux, Windows, macOS, любые BSD), убедитесь, что установлен OpenSSL. Используя OpenSSL, мы можем применить дешифрование с использованием определенного ключа, игнорируя сломанный subjectKeyIdentifier
.
- Сохраните сообщение в какую-нибудь папку (Thunderbird сохранит его в виде файла
.eml
). Я назвал это mail.eml
во всех дальнейших шагах.
- Экспортируйте закрытый ключ (откройте « Настройки», « Дополнительно», « Сертификаты», « Просмотреть сертификаты», выберите соответствующий сертификат, « Резервное копирование», выберите ту же папку, что и для сообщения). Thunderbird запросит кодовую фразу. Теперь у вас должен быть другой файл с расширением
.p12
. Я назвал его certificate.p12
.
- Откройте терминал. Все дальнейшие шаги будут выполнены в командной строке.
- Перейдите в папку с помощью команды
cd
.
- Для расшифровки сообщения нам нужен закрытый ключ в формате PEM. Чтобы преобразовать ключ, запустите
openssl pkcs12 -in certificate.p12
-out privatekey.pem -nodes`. Вам будет предложено ввести пароль, который вы ввели в Thunderbird.
Теперь используйте экспортированный ключ, чтобы фактически расшифровать сообщение:
openssl cms -decrypt -in mail.eml -inkey privatekey.pem -out decrypted.txt
Расшифрованное сообщение будет сохранено в файле decrypted.txt
.
Скорее всего, сообщение будет закодировано как quoted-printable
в кавычках . Если вы сталкиваетесь со странными последовательностями символов, такими как Gr=FC=DFe
и существует заголовок Content-Transfer-Encoding: quoted-printable
заключено в печатную версию , преобразуйте сообщение в простой текст (вам нужен Perl, возможно, ограниченный версией 5, и MIME:: Модуль MIME::QuotedPrint
):
perl -MMIME::QuotedPrint -pe '$_=MIME::QuotedPrint::decode($_);' <decrypted.txt >decoded.txt
Наконец, файл decoded.txt
будет содержать расшифрованное сообщение. Если кодировка специальных символов все еще кажется неправильной, используйте инструменты преобразования по вашему выбору или попробуйте открыть файл в Firefox или другом браузере - обычно они отлично справляются с исправлением испорченной кодировки.
Для создания нового незашифрованного .eml
сообщения требуется удалить все заголовки Content-*
и переместить любые заголовки Content-*
из дешифрованного сообщения в этом месте. Больше подробностей выходит за рамки этого руководства, слишком много разных кодировок, чтобы оказать разумную помощь.