Вопрос 1:
OpenSSL - это утилита и , которая может создавать и проверять сообщения S / MIME, включая заголовки MIME. См. справочную страницу smime (1) для использования версии утилиты - все это построено с использованием версии библиотеки, так что она может сделать это тоже.
Вопрос 2:
Это не только приемлемо, но и способ, которым подписи S / MIME всегда сделаны. Предположительно вы будете создавать подписанное сообщение, используя формат multipart / подписанный (см. Раздел 3.4.3 RFC2311 ). Этот составной MIME-тип содержит отдельную подпись как объект с MIME-типом application / pkcs7-signature. Раздел 3.4.3.1 говорит нам, что он содержит объект подписанного данных PKCS # 7. PKCS # 7 описан в RFC2315 , а объект signatureData описан в разделе 9. Этот раздел говорит нам, что мы создаем дайджест сообщения для подписываемого сообщения (S / MIME говорит, что реализации должны понимать по крайней мере, дайджесты сообщений MD5 и SHA1, поэтому вы должны использовать SHA1 в качестве интероперабельного варианта с максимальной безопасностью) и шифровать его с помощью личного ключа подписавшего.
Пока подписывающее устройство будет радо получить от вас хеш-код SHA1 и зашифровать его с помощью закрытого ключа подписавшего, вы можете самостоятельно выполнить все остальное при создании подписи.
Затем вы взяли бы составной / подписанный MIME-объект и зашифровали его в соответствии со спецификациями S / MIME, а затем снова подписали весь восковой шарик (режим Sign-Encrypt-Sign), чтобы в итоге вы получили:
- multipart / подписанный объект, где первая часть:
- объект application / pkcs7-mime, который при расшифровке следующим PKCS # 7 содержит:
- еще один мультипликационный / подписанный объект, где первая часть:
- объект MIME, представляющий исходное письмо (или просто тело; все, что вам нужно ...)
Добавление:
OpenSSL поддерживает подключаемые криптографические «движки», которые могут выполнять криптографические операции от имени библиотеки. Наилучший способ реализовать это, вероятно, состоит в том, чтобы создать механизм OpenSSL для вашего внешнего устройства подписи и просто вызвать обычные функции S / MIME OpenSSL с включенным этим механизмом. Если ваше внешнее подписывающее устройство уже готово, возможно, уже существует OpenSSL для него.