使用 OpenSSL 为 Outlook 用户生成加密密钥

使用 OpenSSL 为 Outlook 用户生成加密密钥

私人网络应用程序需要接收来自大约 20 个已知用户的加密电子邮件。 如何使用 OpenSSL 生成有效的加密证书,Outlook 用户可以导入并使用该证书加密电子邮件,该证书可在连接到我的应用程序的电子邮件地址收到后解密?

为此,我开始使用以下代码@logicalscope 对另一篇文章的回答,我在这里总结如下:

$ 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                     = [email protected]
emailAddress           = [email protected]  

问题在于上面的代码不知道在哪里寻找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/[email protected]/[email protected]
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

下面的脚本创建了一个证书颁发机构 (CA) 和一个电子邮件证书。电子邮件证书由创建的 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 中,您需要先将 CA 导入到您信任的机构,然后导入证书下的电子邮件证书以进行签名。如果该证书未链接到受信任的 CA,则在尝试向已签名的电子邮件发送加密回复时也是如此。因此,如果另一方正在使用 Thunderbird,您将需要向他们发送您的 ca.crt。如果您正在加密电子邮件给另一方,您将需要他们的 .crt(链中的任何 .cer)才能向他们发送消息。如果您明确信任证书,则在 Outlook 下回复已签名的邮件时不需要这样做。

如果我将密钥同时放在 Thunderbird 的数字签名和加密框中,我仍然会收到一个奇怪的错误。尽管如此,我可以使用另一个帐户发送签名和加密的邮件,但不能同时发送。此外,在 Thunderbird 中加载 CA 时,它告诉我该 CA 可用于 SSL 签名。将来的某个时候,我需要弄清楚为什么标签会这样说。

该代码于 2015 年 7 月 9 日在 Windows 10 build 1057 下运行的 Cygwin 2.2.1(0.289/5/3) 下的 OpenSSL 1.0.2d 上使用。我使用 Thunderbird (38.8.0) 通过 Gmail 帐户对此进行了测试,使用 Outlook 15.0.4.4753.1002 向 Microsoft 托管的 Exchange 服务发送加密和签名的消息。

相关内容