Как расшифровать испорченное сообщение S/MIME, отправленное Outlook?
Недавно я получил зашифрованное сообщение, отправленное Outlook, которое не могу расшифровать. Вместо этого Thunderbird выводит следующее сообщение об ошибке:
Thunderbird не может расшифровать это сообщение
Отправитель зашифровал это сообщение, используя один из ваших цифровых сертификатов, однако Thunderbird не смог найти этот сертификат и соответствующий закрытый ключ. Возможные решения:
- Если у вас есть смарт-карта, вставьте ее сейчас.
- Если вы используете новую машину или новый профиль Thunderbird, вам потребуется восстановить сертификат и закрытый ключ из резервной копии. Резервные копии сертификатов обычно заканчиваются на ".p12".
Также другие почтовые клиенты (включая последнюю версию Outlook!) Не смогли расшифровать сообщение. Поскольку почта очень важна, и я не хочу просить отправителя повторно отправить письмо, что я могу сделать?
1 ответ
Проблема
Это известная проблема в 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::QuotedPrint
модуль):
perl -MMIME::QuotedPrint -pe '$_=MIME::QuotedPrint::decode($_);' <decrypted.txt >decoded.txt
decoded.txt
файл, наконец, будет включать в себя расшифрованное сообщение. Если кодировка специальных символов все еще кажется неправильной, используйте выбранные вами инструменты преобразования или попробуйте открыть файл в Firefox или другом браузере - обычно они отлично справляются с исправлением испорченной кодировки.
Собираем новый, незашифрованный .eml
сообщение требует удаления всех Content-*
Заголовки и перемещение любого Content-*
заголовки из расшифрованного сообщения в этом месте. Больше деталей выходит за рамки данного руководства, слишком много разных кодировок, чтобы оказать разумную помощь.