如何使用 openssl 为 Outlook S/MIME 创建有效的电子邮件证书?

信息安全 电子邮件 openssl
2021-08-23 00:26:40

我需要为 Outlook 2003+ 必须使用的电子邮件加密和签名创建证书。我正在使用 OpenSSL,我的自签名根 CA 已经导入到受信任的根 CA 存储中。这些是我创建 Outlook 可导入的 p12 身份文件的步骤:

openssl req -batch -newkey rsa:1024 -keyout KEY.key -out KEY.csr \
  -nodes -config openssl.cnf &&\
openssl x509 -req -sha1 -days 1000 -in KEY.csr -CA ca.crt -CAkey ca.key \
  -set_serial 1 -out KEY.crt -setalias "FRIENDLY_NAME" \
  -clrtrust -addtrust emailProtection \
  -addreject clientAuth -addreject serverAuth -trustout &&\
openssl pkcs12 -export -in KEY.crt -inkey KEY.key" -out KEY.p12 \
  -name "FRIENDLY_NAME" -passout pass:PASSWD &&\
chmod 0600 KEY_CN.{key,p12} &>/dev/null

这是我的相关部分openssl.cnf

[ usr_cert ]
basicConstraints = CA:FALSE
authorityKeyIdentifier = keyid
subjectKeyIdentifier = hash
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = critical, emailProtection
subjectAltName = email:copy
authorityKeyIdentifier = keyid
subjectKeyIdentifier = hash

我检查了另一个有效的 p12 文件以获取这些设置 - 以及-name上面第三个 openssl 语句中的 cli 选项。

我的问题:Outlook 仍然对此感到窒息(不过,它在 Thunderbird 中有效)。我没有英文错误消息(不过可以提供德语错误消息),这些是我看到的对话框的粗略翻译:

  1. “授予应用程序密钥的使用:授予/不授予”(您可以在左下角显示密钥详细信息 - 它表示没有描述,也没有上下文信息)
  2. “重复此过程。无法访问受保护的密钥,请确保指定的密码有效。” (我做到了——我什至在 openssl 和 Outlook 中尝试了所有可能的密码/无密码变体!下一步,我将返回第一个对话框并单击“取消”)
  3. “底层安全系统出错。访问被拒绝!”

我在 Outlook 中的当前设置:签署电子邮件、传输文本和纯文本签名并附加证书。我还将证书的使用限制为secureEmail并禁用了OCSP。导入证书时(以及生成时),我对每个密码请求都使用了完全相同的密码,并使用了与friendlyName、CN 和别名相同的描述(也许这些可能不同,我只是不想在尝试时冒任何风险)。

我真的不明白 Outlook 不喜欢/想要告诉我什么。如果需要,我很乐意提供更多详细信息。

谢谢!

1个回答

在中等安全性下操作时,预计会出现 #1 中的对话框。操作系统应该在第一次使用密钥之前验证 PIN。

#2 和 #3 中的对话框更多地表明了基于文件的权限问题。您是在 Windows 或 Unix 主机下的 Cygwin 中执行此操作并传输文件吗?Cygwin下最后的chmod可能有问题。

考虑删除“-clrtrust -addtrust emailProtection -addreject clientAuth -addreject serverAuth -trustout”选项,并在允许所有预期用途时查看它是否有效。然后开始缩减预期用途。

例如,以下对我有用,但显然具有“所有”预期用途,这可能是不可取的:

$ 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

我使用一个非常基本的 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

将 email.pfx 加载到 Windows 证书管理器到您的个人证书存储中。现在,我在 Windows 7 下运行 Outlook 2010,因此我还必须创建将用于默认安全设置的条目。这涉及到 Outlook 信任管理器(文件 | 选项 | 信任中心 | 信任中心设置 | 电子邮件安全)。您可以在“加密电子邮件”分组中创建新的“默认设置”,其中包括新导入的证书。(Outlook 2010 中的“导入/导出”按钮可用作将 .pfx 导入证书管理器的一种方式。)