证书链(自签名根 CA)

证书链(自签名根 CA)

我正在创建一个自签名根 CA 供内部使用,我决定使用中间证书。但是,Chromium 和 Firefox 54.0 不信任证书链,这给我带来了问题。

该内容通过 Ubuntu 16.04 上的 Apache 2.4.18 托管,配置如下:

<VirtualHost *:443> DocumentRoot /var/www/html/ SSLCertificateFile /etc/apache2/ssl/server.crt SSLCertificateKeyFile /etc/apache2/ssl/server.key SSLCertificateChainFile /etc/apache2/ssl/fullchain.crt </VirtualHost>

Chromium 报告“网站证书链存在问题”,Firefox 报告“错误代码:SEC_ERROR_CA_CERT_INVALID”。Chromium 和 Firefox 都在其信任库中安装了根 CA,作为验证网站的可信证书。

以下是用于生成、签署和验证证书的设置

#Generate and self-sign the Root CA #=========================================================== openssl genrsa -out ca.key 2048 #openssl genrsa -aes256 -out ca.key 4096 openssl req -new -x509 -days 3650 -key ca.key -subj "/C=UK/ST=London/L=/O=SWS, Inc./CN=X1 SWS Root CA" -out ca.crt #===Generate and sign the intermediate CA #============================================================ openssl req -newkey rsa:2048 -nodes -keyout intermediate.key -subj "/C=UK/ST=London/L=/O=SWS Intermediate, Inc./CN=SWS Intermediate CA" -out intermediate.csr openssl x509 -req -extfile <(printf "subjectAltName=DNS:localhost") -in intermediate.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out intermediate.crt -days 2000 -sha256 #===Generate a certificate and sign with the intermediate CA #============================================================ openssl req -newkey rsa:2048 -nodes -keyout server.key -subj "/C=UK/ST=London/L=/O=SWS, Inc./CN=*.sws.com" -out server.csr openssl x509 -req -extfile <(printf "subjectAltName=DNS:sws.com,DNS:*.sws.com") -days 730 -in server.csr -CA intermediate.crt -CAkey intermediate.key -CAcreateserial -out server.crt #===Generate a certificate chain #=========================================================== cat intermediate.crt ca.crt > fullchain.crt #===Verify the certificate (CRT) info #============================================================ openssl x509 -in server.crt -text -noout #===Verifies the Chain of Trust #============================================================ openssl verify -CAfile ca.crt intermediate.crt openssl verify -verbose -CAfile <(cat intermediate.crt ca.crt) server.crt

这看起来很奇怪,因为证书链是有效的,并且在没有中间人的情况下执行相同的步骤可以在 Chromium 和 Firefox 中提供有效的证书链。

请注意,域名“sws.com”是本地DNS;它是通过hosts文件配置的。

答案1

由于这个主题很大,我选择附加下面的 URL,详细说明配置过程。

使用 Jamie Linux 上的文档,我创建了一个根 CA 和中间 CA。但是,本教程未包含用于替代主题名称的 X509v3 扩展。通过修改模块 [server_cert] 下的中间/openssl.cnf 文件,添加以下几行,可以轻松解决这个问题。

[ server_cert ] ... subjectAltName = @alt_names [ alt_names ] DNS.1 = example.com DNS.2 = www.example.com

修改后的中间配置文件已在下面添加为“Config ICA”。

我在最初的问题中提出的问题是,中间 CA 没有基本约束。因此,它是一个 X509v1 证书,因此它没有约束说明它是否是 CA,并且由于 X509v1 已被弃用,所有浏览器都会自动不信任信任链。


Jamie Linux: https://jamielinux.com/docs/openssl-certificate-authority/create-the-root-pair.html
配置 ICA: https://pastebin.com/gCGcFdiP

相关内容