如何使Gnu / Linux信任开箱即用的Windows信任的证书?


11

如此SSL检查所报告,服务器的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:同一证书已正确部署在另一台服务器上


为什么要下票?
Udo G

1
我投票结束这个问题是题外话,因为OP要求他不能影响自己的事情。他说他不能在服务器端进行任何修改,所以我认为这可能属于超级用户,因为它描述了没有解决方案客户端的问题。
LinuxSecurityFreak

2
我专门要求一种客户端解决方案。我无法影响服务器,但是我可以完全控制客户端O / S(Ubuntu),并且我希望此特定的O / S安装像其他O / S(Windows)一样信任证书。这与为其他人修复HTTPS网站无关。
Udo G


1
您不控制服务器,但是您仍然可以将问题报告给控制服务器的人。
迈克尔·汉普顿

Answers:


11

真正的解决方法是确保您的服务器提供链中的所有证书,而不仅仅是终端实体(服务器)证书。

将您的服务器管理员指向RFC 5246第7.4.2节明确指出:该消息将服务器的证书传达给客户端。


如果您的管理员出于某些原因拒绝/无法执行此操作,则您的替代选择是尝试curl使用格式错误的握手。

根据卷曲邮件列表上的消息:

有人可以确认cURL是否支持(或不支持)中间证书?

是的,它确实。所有ca证书都有一条证书链,直达根。您与curl一起使用的ca捆绑软件必须包含整个链的证书。

/ daniel.haxx.se

您应该能够将Root CA和所有中间证书添加到捆绑包中,并curl使用该--cacert <file>选项指向它。

随着浏览器的工作,您可以从那里访问正确的CA证书。在“证书”选项卡上(每种浏览器各不相同,但是我确定您会发现其中的一个),查看证书链。首先双击根CA,然后在“ 详细信息”选项卡上,单击“ 复制到文件...”。另存为root.cer。对AlphaSSL CA-SHA256-G2执行相同操作,并将其另存为issuing.cer。将两者合并为一个文件(例如chain.cer),并将其用作的参数-cacert

如@AB所指出的,丢失的证书也可以在这里找到。


您的浏览器可以缓存CA证书,因此可以正常工作。如果您过去曾经导航到配置正确的网站,并且其证书是由与服务器证书相同的CA颁发的,则它将被浏览器缓存。当您随后访问配置错误的站点时,浏览器将使用其缓存中的CA证书来构建链。对您来说,似乎一切都很好,尽管在后台,服务器配置错误。

请注意,在Windows上,IE / Edge和Chrome共享相同的缓存,而Firefox使用自己的缓存。

除此之外,IE / Edge和Chrome(因为它们共享相同的密码栈)将在证书中使用称为AuthorityInformationAccess的扩展。它具有caIssuer选项,该选项提供一个URL,可以从该URL下载最终实体证书的CA证书。因此,即使这些浏览器之一没有缓存以前浏览时丢失的证书,也可以根据需要获取它。请注意,Firefox不会执行此操作,这就是为什么有时IE / Edge和Chrome似乎可以正常工作时Firefox可能显示证书错误的原因。


1
这不是我的服务器,因此无法在服务器端进行任何修改。我尝试使用curl.haxx.se/docs/caextract.html中的CA软件包(因为Firefox信任证书),并使用传递了证书,--cacert cacert.pem但CURL仍然不接受证书。
Udo G

1
您的服务器。运行echo q | openssl s_client -showcerts -connect betriebsheft.vog.it:443,您将看到服务器仅提供一个证书。应该有两个-最终实体证书(已提供)和颁发CA的Alpha SSL-SHA256-G2证书。后者不是服务器发送的,但是应该发送。
garethTheRed

2
@garethTheRed:我知道服务器不会提供所有证书,但是服务器不在我的控制之下(这就是我所说的“不是我的服务器”的意思)。我只是想访问外部服务器上的API。在Windows下,我的浏览器都没有抱怨该证书的,只有Linux / Debian / Ubuntu可以。
Udo G

@AB:非常感谢!从该页面安装所有根证书可以解决此问题。但是,我想了解为什么需要手动操作。
Udo G

2
缺少的中间证书(如@garethTheRed所述)可以在以下位置找到:support.globalsign.com/customer/portal/articles/…。OP最初仅尝试添加可能已经存在的证书,因此一无所获。
AB
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.