1

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

С этой целью я начал использовать код из ответа @ logicscope к этой другой публикации, который я здесь обобщу следующим образом:

$ openssl genrsa -aes128 -out email.key 2048
$ openssl req -new -key email.key -out email.csr -config email.cnf
$ openssl x509 -req -days 365 -in email.csr -CA ca.crt -CAkey ca.key -set_serial 10 -out email.crt
$ openssl pkcs12 -export -in email.crt -inkey email.key -out email.pfx  

Где email.cnf создан перед предыдущими шагами как:

[ req ]
default_bits           = 2048
distinguished_name     = req_distinguished_name
prompt                 = no

[ req_distinguished_name ]
C                      = {Country}
ST                     = {Provice/State}
L                      = {City}
O                      = {Org}
OU                     = {Org Unit}
CN                     = user@domain.com
emailAddress           = user@domain.com  

Проблема в том, что код выше не знает, где искать ca.crt . Поэтому строка openssl x509 -req -days 365 -in email.csr -CA ca.crt -CAkey ca.key -set_serial 10 -out email.crt приводит к следующему:

Signature ok
subject=/C=US/ST=CA/L=MyCity/O=MyOrganization/OU=MyUnit/CN=me@serverdomain.com/emailAddress=me@serverdomain.com
Error opening CA Certificate ca.crt
140570916620192:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('ca.crt','r')
140570916620192:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:
unable to load certificate

Как создать действительный ca.crt таким образом, чтобы пользователи Outlook могли использовать email.pfx для шифрования электронной почты, которую мое приложение может расшифровать при получении? Нужно ли покупать сертификат? Это только для сервера разработки на данный момент. Было бы неплохо получить что-то на работу бесплатно. Например, пользователи Thunderbird могут отправлять электронные письма, зашифрованные с помощью ключа GPG, которые мое приложение может расшифровать.

Мой devbox работает под управлением Windows 7 и Outlook 2010.

1 ответ1

1

Сценарий ниже создает центр сертификации (CA) и сертификат электронной почты. Сертификат электронной почты подписан созданным центром сертификации. Я использовал шаблон для email.cnf, который вы указали выше. Обратите внимание, что я обновил криптографию до 4096-битных ключей RSA, SHA256 и AES256. Также все места, где вам нужно поменять предметы, окружены <>. Он попросит вас ввести локальные пароли при запуске скрипта.

#!/bin/sh
RSA_size=4096
Certauth_key=ca.key 
Certauth_crt=ca.crt
Key_name=email.key
CSR_name=email.csr
Config_file=email.cnf
Lifespan_in_days=365
Serial_number_CA=<Serial number you want to use>
Serial_number_leaf=<Serial number you want to use>
CRT_name=email.crt
Email_PFX_name=email.p12
Frendily_name=MyEmailKey
Passphrase=<password you want to use>
PasswordPhrase=pass:$Passphrase

echo openssl genrsa -aes256 -out $Certauth_key $RSA_size
openssl genrsa -aes256 -out $Certauth_key $RSA_size

echo openssl req -new -x509 -set_serial $Serial_number_CA -days $Lifespan_in_days -config $Config_file -key $Certauth_key -out $Certauth_crt
openssl req -new -x509 -set_serial $Serial_number_CA -days $Lifespan_in_days -config $Config_file -key $Certauth_key -out $Certauth_crt



echo openssl genrsa -aes256 -out $Key_name $RSA_size
openssl genrsa -aes256 -out $Key_name $RSA_size 

echo openssl req -new -key $Key_name -out $CSR_name -config $Config_file 
openssl req -new -key $Key_name -out $CSR_name -config $Config_file 

echo openssl x509 -req -sha256 -days $Lifespan_in_days -in $CSR_name -CA $Certauth_crt -CAkey $Certauth_key -set_serial $Serial_number_leaf -out $CRT_name -setalias $Frendily_name -clrtrust -addtrust emailProtection -addreject clientAuth -addreject serverAuth -trustout
openssl x509 -req -sha256 -days $Lifespan_in_days -in $CSR_name -CA $Certauth_crt -CAkey $Certauth_key -set_serial $Serial_number_leaf -out $CRT_name -setalias $Frendily_name -clrtrust -addtrust emailProtection -addreject clientAuth -addreject serverAuth -trustout

echo openssl pkcs12 -export -aes256 -in $CRT_name -inkey $Key_name -out $Email_PFX_name -name $Frendily_name -passout $PasswordPhrase
openssl pkcs12 -export -aes256 -in $CRT_name -inkey $Key_name -out $Email_PFX_name -name $Frendily_name -passout $PasswordPhrase 

В Thunderbid вам необходимо сначала импортировать ЦС в доверенные органы, а затем импортировать сертификат электронной почты под своими сертификатами для подписания. Это также верно при попытке отправить зашифрованный ответ на подписанное электронное письмо, если этот сертификат не связан с доверенным центром сертификации. Поэтому, если другая сторона использует Thunderbird, вам нужно будет отправить им свой ca.crt. Если вы шифруете электронную почту для другой стороны, вам понадобится их .crt (любые любые .cer в цепочке), прежде чем вам будет разрешено отправить им сообщение. Это не было необходимо при ответе на подписанное письмо в Outlook, если вы явно доверяете сертификату.

Я все еще получаю странную ошибку, если помещаю ключ в поле Цифровая подпись и Шифрование в Thunderbird. Несмотря на это, я могу отправлять подписанную и зашифрованную почту с другой учетной записи, но не обе сразу. Кроме того, при загрузке CA в Thunderbird, он говорит мне, что CA можно использовать для подписи SSL. В какой-то момент в будущем мне нужно выяснить, почему лейбл так говорит.

Этот код использовался в OpenSSL 1.0.2d 9 июля 2015 года в Cygwin 2.2.1(0.289/5/3), работающей под Windows 10 build 1057. Я протестировал это с учетной записью Gmail, используя Thunderbird (38.8.0), отправляя зашифрованные и подписанные сообщения в службу обмена Microsoft, используя Outlook 15.0.4.4753.1002.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .