我们在混合 Windows/Linux 环境中运行由 Ubuntu 16.04 服务器提供支持的内部证书颁发机构和用于内部资源的 OpenSSL 后端。
该 CA 与一些内部网站一起使用,试图为内部网站、软件部署等提供有效、可信的站点证书。我们有一个问题。
CA 根证书由 GPO 推送到我们所有的 Windows 系统,或手动安装。但是,该 CA 签名的每个证书最终都会出现一些问题 - Chrome 和 Firefox 都表明证书具有无效的通用名称,而其他实用程序(例如此处的 XMPP 服务器)即使 CA 证书位于信任库中也无法验证证书。
只有 Internet Explorer 会遵守该证书。不幸的是,我们使用的是 Chrome 和 Firefox,因此使用 IE 进行所有操作都会有问题。
有没有人想出一个解决方案来制作 OpenSSL CA 证书及其签名的证书来颁发证书不是Chrome 和 Firefox 上是否存在“无效通用名称”错误,从而允许内部证书被视为“有效”?
答案1
我实际上已经找到了核心问题,并且花了很多时间进行搜索。最后找到了StackOverflow 上的答案结合我对证书本身实际数据的调查,openssl req -text -noout -verify -in CSR.csr
读取CSR中的数据,以及openssl x509 -in certificate.crt -text -noout
对生成的证书的剖析和比较,直指核心问题。
显然OpenSSL 忽略了配置文件中与 V3 扩展相关的部分,并且不会执行 v3 扩展,除非你告诉在实际的 CA 签名步骤中正确执行此操作......
这是传递到openssl req
命令的配置文件数据:
[ req ]
default_bits = 4096
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = v3_req
[ dn ]
C=US
ST=Pennsylvania
L=Somewhere
O=No Man's Land
OU=Internal
CN = chat.foo.bar.baz
[ v3_req ]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage=serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = chat.foo.bar.baz
DNS.2 = chat
DNS.3 = 10.1.2.151
以下标准调用在某种程度上不符合 v3 扩展:
openssl req -new -sha256 -out cert.csr -key cert.key -config csrgen.cnf
...然而,这个确实有效:
openssl req -new -sha256 -out cert.csr -key cert.key -config csrgen.cnf -extensions v3_req
... 什么时候签署CA 的证书,我们必须使用类似这样的方法,从存储所有站点证书的地方执行此操作(包括 CSR 和密钥,用于首先生成证书 - CA 证书和密钥位于/certauthority/...
我们系统的单独部分中):
openssl x509 -req -days 3650 -in ./cert.csr -CA /certauthority/certs/cacert.pem -CAkey /certauthority/private/cakey.pem -CAserial /certauthority/CA/serial -CAcreateserial -out certificate.crt -extfile csrgen.cnf -extensions v3_req
此命令正确地将 v3 扩展放入证书中,并且不知何故被忽略否则,文件中的实际扩展名。这反过来解决了 CN 和 SAN 问题,现在系统将证书返回为对内部站点和(大多数)内部服务的“有效”。