据报告,有一台服务器的 SSL 链已损坏这个 SSL 检查:
我知道这是一个问题应该可以在服务器本身上解决,但有时这很难修复(我不是服务器的管理员)。
问题是,Windows 上的 Chrome/Mozilla/Edge无论如何相信网站证书:
但是,在 Gnu/Linux 部署(Docker 中的 Ubuntu 18.04)中,证书是不是值得信赖:
curl: (60) SSL certificate problem: unable to get local issuer certificate
我尝试过update-ca-certificates
甚至导入了 Globalsign 根证书。update-ca-certificates
在这种情况下报告了重复的证书。无论如何,没有任何作用。
如何重现
使用 Docker:
docker run -it ubuntu:18.04
# within container:
apt-get update
apt-get -y install curl
curl https://betriebsheft.vog.it # <---- "unable to get local issuer certificate"
如何让 Gnu/Linux 信任该证书?
PS:同一张证书在另一台服务器上正确部署。
答案1
真正的解决办法是确保您的服务器存在全部链中的证书而不仅仅是最终实体(服务器)证书。
向您的服务器管理员指出RFC 5246 第 7.4.2 节其中明确指出该消息传达服务器的证书链给客户。
如果您的管理员出于某种原因拒绝/无法执行此操作,您的替代选择是尝试处理curl
格式错误的握手。
根据 Curl 邮件列表上的消息:
有人可以确认 cURL 是否支持(或不支持)中间证书吗?
是的,它确实。所有 ca 证书都有一个一直到根的证书链。与 curl 一起使用的 ca 捆绑包需要包含整个链的证书。
/ 丹尼尔.haxx.se
您应该能够将根 CA 和所有中间证书添加到捆绑包中,并curl
使用该选项指向它--cacert <file>
。
当您的浏览器工作时,您可以从那里访问正确的 CA 证书。在“证书”选项卡上(每个浏览器都不同,但我相信您会弄清楚),查看证书链。首先双击根 CAGlobalsign 根 CA - G1并在细节选项卡,单击复制到文件...。将其另存为root.cer
.做同样的事情AlphaSSL CA - SHA256 - G2并将其另存为issuing.cer
.将两者连接到一个文件中(例如chain.cer
)并将其用作 的参数-cacert
。
正如 @AB 善意指出的,丢失的证书也可以找到这里。
您的浏览器可以正常工作是因为它们缓存了 CA 证书。如果您在过去某个时刻导航到正确配置的网站,其证书由与服务器证书相同的 CA 颁发,则浏览器将缓存该网站。当您随后访问配置错误的站点时,您的浏览器将使用其缓存中的 CA 证书来构建链。对您来说,似乎一切都很好,尽管在幕后,服务器配置错误。
请注意,在 Windows 上,IE/Edge 和 Chrome 共享相同的缓存,而 Firefox 使用自己的缓存。
除了上述内容之外,IE/Edge 和 Chrome(因为它们共享相同的加密堆栈)将在证书中使用名为权威信息访问。这有一个开卡人选项提供可从中下载最终实体证书的 CA 证书的 URL。因此,即使这些浏览器之一没有缓存先前浏览中丢失的证书,它也可以在需要时获取它。请注意,Firefox 不会执行此操作,这就是为什么有时 IE/Edge 和 Chrome 似乎可以工作时 Firefox 会显示证书错误。