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


1

私有Web应用程序需要从大约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                     = 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。

Answers:


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日的OpenSSL 1.0.2d下使用,在Windows 10 build 1057下运行的Cygwin 2.2.1(0.289 / 5/3)下。我使用Thunderbird(38.8.0)发送加密和签名消息的gmail帐户对此进行了测试使用Outlook 15.0.4.4753.1002到Microsoft托管的Exchange服务。


感谢您和+1花时间研究这个老问题。我现在无法验证答案。但是我已经将这个问题加入了书签,以便在我准备重新审视这个问题时可以参考你的答案。
CodeMed 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.