我正在尝试创建一个 CA 和中级 CA,用于 Outlook 中的 Office 365 签名/加密。我已经能够遵循一系列教程并使用 OpenSSL 生成生成证书的 CA 和中级 CA。我遇到了两个问题:
- 当我生成最终用户 x509 最终用户证书时,它被标记为无效,因为中间 CA 没有颁发证书的权力。
- 如果我使用根 CA 生成最终用户证书,我可以正常签名和加密电子邮件,但过了一段时间它就会停止工作。
我认为问题 2 是由于最终用户证书未由中间 CA 签名而引起的。在 Exchange Online 中,SMIMEExpiredCertificateThumbprint 返回中间证书指纹,而不是根 CA。我仍然可以将根 CA 生成的最终用户证书发布到 GAL 并发送几封快速电子邮件,但 Outlook 与 GAL 同步后,它会发现该证书不是从中间证书生成的,并声明其未经授权。
我认为解决问题 1 可以解决问题 2,但我不知道如何设置中间 CA 颁发证书的权限。有什么帮助吗?
以下是我当前生成根 CA 和中间 CA 的方法:
openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 1826 -key ca.key -out ca.crt
openssl genrsa -out ia.key 4096
openssl req -new -key ia.key -out ia.csr
openssl x509 -req -days 730 -in ia.csr -CA ca.crt -CAkey ca.key -serial -out ia.crt
客户端的生成方式如下:
openssl genrsa -aes128 -out email.key 2048
openssl req -new -key email.key -out email.csr
openssl x509 -req -days 365 -in email.csr -CA ia.crt -CAkey ia.key -CAcreateserial -out email.crt
openssl pkcs12 -export -in email.crt -inkey email.key -out email.pfx
openssl x509 -in email.crt -serial -noout >> email.meta
openssl x509 -in email.crt -fingerprint -noout >> email.meta
答案1
所以基本上我没必要弄清楚如何解决 OpenSSL 的问题,但发现 GnuTLS 以一种易于使用的方式提示使用证书。
我正在生成根 CA,如下所示:
certtool --generate-privkey --bits 4096 --outfile ca.key
certtool --generate-self-signed --load-privkey ca.key --template ca.vars --outfile ca.crt
我的 ca.vars 如下所示:
organization = [Company Name]
unit = [Org Unit]
locality = [City]
state = [State]
country = [Country Code]
challenge_password = [password]
password = [password]
expiration_days = 1825
serial = 1
ca
cert_signing_key
crl_signing_key
cn = '[Company Name] Root CA 000001'
注意:密码列在 ca.vars 文件中,该文件不安全;但对于我的实现,脚本会生成 vars 文件,然后使用 srm 删除工具将其删除。如果您不使用脚本来生成 vars 文件,只需省略 password 和 challenge_password 行,系统就会提示您。
中间CA如下:
certtool --generate-privkey --bits 4096 --outfile ia.key
certtool --generate-request --template ia.vars --load-privkey ia.key --outfile ia.csr
certtool --generate-certificate --template ia.vars --load-request ia.csr --load-ca-certificate ca.crt --load-ca-privkey ca.key --outfile ia.crt
ca.vars 和 ia.vars 的区别在于,我将到期天数设置为 365 天,并添加以下行:
path_len = 1
从那里,我可以使用上述脚本与 openssl 和 ia_[sign/encrypt] 证书颁发机构生成 x509 证书,我可以在 Outlook 和 Office 365 中使用这些证书来签名/加密电子邮件。我再次粘贴它仅供参考:
openssl genrsa -aes128 -out email.key 2048
openssl req -new -key email.key -out email.csr
openssl x509 -req -days 365 -in email.csr -CA ia.crt -CAkey ia.key -CAcreateserial -out email.crt
openssl pkcs12 -export -in email.crt -inkey email.key -out email.pfx
openssl x509 -in email.crt -serial -noout >> email.meta
openssl x509 -in email.crt -fingerprint -noout >> email.meta
希望这能帮助到我以外的人!:)