内部网络 CA:“无效通用名称”或所有内容上的证书无效(Internet Explorer 和 Windows 的证书 mmc snapin 除外)

内部网络 CA:“无效通用名称”或所有内容上的证书无效(Internet Explorer 和 Windows 的证书 mmc snapin 除外)

我们在混合 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 问题,现在系统将证书返回为对内部站点和(大多数)内部服务的“有效”。

相关内容