2009-10-08 1 views
0

Фон: Я унаследовал встроенную систему на основе Linux, содержащую прокси-сервер SMTP и некоторые сумасшедшие ограничения, с которыми мне просто нужно жить. Он находится между SMTP-клиентом и сервером. Когда клиент SMTP подключается, прокси открывает соединение с сервером и передает данные клиента на сервер после обработки «на лету».Нашей электронной почты шифрование/подпись

Задача: мне нужно подписать и/или шифрование электронной почты на своем пути к серверу, используя стандартные методы ИПК и форматы S/MIME (см RFC2311, например). У меня есть доступ ко всем требуемым открытым ключам из соответствующих сертификатов.

дурацких ограничений (пожалуйста, просто принять их, так как они далеко за пределами моего контроля) :

  1. Я не могу хранить электронную почту; он должен должен быть обработан на лету.
  2. Я могу сделать шифрование локально с использованием открытых ключей, но я не могу получить доступ к закрытым ключам напрямую, что означает, что цифровая подпись должна выполняться «подписывающим устройством» через 9600 бит/с.
  3. Типичные сообщения электронной почты: десятки или сотни МБ. (Почтовый сервер и получатели могут обрабатывать эти размеры, единственная проблема - неприемлемая задержка при подписании.)
  4. Любой новый код должен быть быть в C, но это приемлемо, например, для передачи данных на стойку, (например нет временных файлов).
  5. Доставка в течение 14-21 дней.

Вопросы:

  1. Я надеялся найти утилиту с открытым исходным кодом или библиотеку, которая будет генерировать соответствующие заголовки MIME и шифровать/подписывать сгусток данных, но я не нашел что на Sourceforge, код Google, и т. д. Вы использовали тот, который вы могли бы порекомендовать?
  2. Я отчаянно надеялся найти RFC, который говорит, что допустимо хэш 100 Мбайт данных, а затем подписать хеш, поскольку это уменьшит узкое место 9600 бит/с. Но опять же, не повезло. Существует ли стандартная «ярлык» (RFC?), Совместимая с типичными почтовыми клиентами?

Спасибо за ваши мысли.

ответ

5

Вопрос 1:

OpenSSL является как утилита и библиотека, которая может одновременно создавать и проверять S/MIME сообщений, в том числе заголовки MIME. См. the smime(1) man page для использования служебной версии - все это построено с использованием версии библиотеки, поэтому оно тоже может это сделать.

Вопрос 2:

не только в том, что приемлемо, это способ S/MIME подписи являются всегда сделано. Предположительно вы создадите подписанное сообщение, используя формат multipart/signed (см. Раздел 3.4.3 из RFC2311). Этот многостраничный MIME-тип содержит выделенную подпись как объект с типом MIME-приложения/pkcs7-signature. В разделе 3.4.3.1 говорится, что в нем содержится объект PKCS # 7 signedData. PKCS # 7 описан в RFC2315, а объект signedData описан в разделе 9. В этом разделе говорится, что мы создаем дайджест сообщения сообщения, которое должно быть подписано (S/MIME говорит, что реализации должны понимать хотя бы сообщения MD5 и SHA1 дайджесты, поэтому вы бы использовали SHA1 в качестве совместимого варианта с лучшей безопасностью) и шифровали его личным ключом подписывающего лица.

До тех пор, пока устройство подписи с удовольствием возьмет с собой хэш-код SHA1 и зашифрует его личным ключом подписчика, вы можете сделать все остальное из поколения подписи самостоятельно.

После этого вы должны взять объект MIME с множественным/подписанным кодом и зашифровать его в соответствии с спецификациями S/MIME, а затем снова подписать весь шар воска (режим Sign-Encrypt-Sign), чтобы в конечном итоге у вас было:

  • многочастному/подписанный объект, в котором первая часть:
  • приложение/PKCS7-мим объект, который при расшифрованы следующих PKCS # 7 содержит:
  • другой multiplart/подписанный объект, где первый part is:
  • a MIME-объект, представляющий исходное электронное письмо (или просто тело; все, что нужно ...)

Добавление:

OpenSSL поддерживает встраиваемые криптографические «двигатели», которые могут выполнять криптографические операции от имени библиотеки. Лучшим способом реализации этого, вероятно, будет создание механизма OpenSSL для вашего внешнего устройства подписи и просто вызов обычных функций S/MIME OpenSSL с включенным движком. Если ваше внешнее устройство подписи «готово», возможно, OpenSSL может быть оболочкой для этого механизма.

+0

Спасибо, кафе, за ваше четкое и полное описание _exactly_, что мне нужно. Я смущен, чтобы сказать, что, знакомый с OpenSSL для управления сертификатами, я не думал проверять возможности S/MIME. Хотел бы я предложить +5! –