自签名 SSL 证书中的颁发者证书无效

Posted

技术标签:

【中文标题】自签名 SSL 证书中的颁发者证书无效【英文标题】:Issuer certificate is invalid in self signed SSL certificate 【发布时间】:2019-08-04 00:13:12 【问题描述】:

我已经使用这些命令创建了一个 SSl 证书:

openssl genrsa -out kc_ca-key 2048
openssl req -new -out san_domain.csr -key kc_ca-key -config openssl.cnf
openssl x509 -req -days 3650 -in san_domain.csr -signkey kc_ca-key -out kc_ca-cert -extensions v3_req -extfile openssl.cnf

openssl.cnf 文件包含通用名称、国家名称、主题替代名称和所有此类信息。 在浏览器中,我可以在导入此证书后安全连接,但是当我使用相同的证书运行 curl 命令时,出现以下错误:

NSS 错误 -8156 (SEC_ERROR_CA_CERT_INVALID) * 颁发者证书无效。 * 关闭连接 0 curl: (60) 颁发者证书无效。 更多细节在这里:http://curl.haxx.se/docs/sslcerts.html

curl 默认执行 SSL 证书验证,使用“bundle” 证书颁发机构 (CA) 公钥(CA 证书)。如果默认 捆绑文件不够用,您可以指定一个备用文件 使用 --cacert 选项。 如果此 HTTPS 服务器使用由 CA 签名的证书 捆绑包,证书验证可能由于以下原因而失败 证书有问题(它可能已过期,或者名称可能 与 URL 中的域名不匹配)。

如何解决此错误

【问题讨论】:

有问题吗? 【参考方案1】:

没有足够的信息来确定您的问题是什么。

我做出以下假设:

    您将证书请求 (CSR) 发送给 CA 提供商并取回了证书。 您使用该证书设置了某种网络服务器 我还假设您使用的是“Windows”网络浏览器,例如 IE 或 Chrome,它使用 Windows 证书存储来测试证书。 签署您的证书的 CA 是众所周知的 CA,在所有常见 CA 列表中都有根证书。

如果上述情况属实,并且像 Firefox 这样的网络浏览器(使用其内部 CA 列表)失败,那是因为网络服务器使用的证书没有任何中间证书。

您需要为您的 CA 签名证书找到中间证书,将它们组合成一个证书链,并使用此证书链设置您的 Web 服务器。具体操作方法取决于您的网络服务器。

使用正确的证书链设置 Web 服务器后,您的 curl 命令(和 firefox)应该可以正常工作。

windows 工作正常的原因是因为 windows 保留了一个可以用来验证证书链的常见中间证书列表。基于 openssl 的客户端不会,因此中间证书必须从 SSL 套接字服务器(例如 Web 服务器)向下传递到客户端,才能将证书链验证回客户端 CA 列表中的受信任根证书。

【讨论】:

以上是关于自签名 SSL 证书中的颁发者证书无效的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个自签名的SSL证书

确定 SSL 证书是不是使用 Python 自签名

自签名证书颁发及验证

ssl

自签名SSL证书介绍及其缺点

如何获取颁发者证书的指纹或公钥?