私人网络应用程序需要接收来自大约 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 服务发送加密和签名的消息。