error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

我有一个 FreeBSD 服务器 FreeBSD hotspot.brightlan.net 6.2-RELEASE-p6 FreeBSD 6.2-RELEASE-p6 #0:7 月 21 日星期六 13:42:25 EDT 2007

在这台服务器上,我在 php 中有一个使用 curl 的应用程序,它通过 api 连接到 Authorize.net。最近他们更新了他们的 SSL 证书以支持 sha256,因此 SSL 证书也发生了变化。进行此更改后,应用程序无法连接。如果我做一个 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 假) 它连接成功,但我想在 SSL 握手期间对服务器进行全面验证。 我注意到在通过使用 CURLOPT_CAINFO 选项指定更新 ca 证书文件后,从不同的 Linux ubuntu 服务器连接了相同的内容。

但是在这个 FreeBSD 上,它无法连接。我还注意到 SSL 证书是在通配符上颁发的,即 *.authorize.net。因此,在 ubuntu 服务器上,我也必须禁用 CURLOPT_SSL_VERIFYHOST。但是在这个 FreeBSD 服务器上,它根本无法使用这个选项。 服务器有点旧 php 版本 PHP 4.4.7 (cgi-fcgi)(内置:2007 年 5 月 4 日 13:35:10)

感谢任何帮助。

请注意,您的系统 运行 是一个非常旧的系统,不再受支持,并且可能积累了很多安全问题。我不确定,但我认为此版本的 FreeBSD 附带 openssl 0.9.7,它太旧而无法支持使用 SHA-256 签名的证书。

使用 openssl version 检查您的版本并查看 https://support.globalsign.com/customer/portal/articles/1499561-sha-256-compatibility

终于发现后面是openssl版本的问题了。直到 0.9.8o 才支持 SHA256。所以我尝试将 openssl 升级到最新版本。由于我的系统很旧,因此不支持最新版本。 所以我开始成功编译 0.9.8o,但它破坏了内部使用的 SSH。所以我的 objective 现在是在不破坏 SSH 服务器的情况下将 openssl 升级到 0.9.8o。

我开始深入挖掘并找到 link 不同版本的 Openssl 的方法,正如上面 "Steffen Ullrich" 所提到的。我能够静态和动态地使用 openssl 0.9.8o 进行编译和 link,并在下面的观察中发现。

当我们在启用 openssl 的情况下编译 php 时,curl 不会使用其 linked openssl 连接到站点。在这里,我用不同版本的 openssl 编译了 php 和 curl(我什至尝试用静态 openssl 编译和 linking curl)。使用 php 编译的 openssl 版本在连接到站点时优先使用,因此在我的情况下无法连接(由于 SHA256 ssl 证书和 php-openssl-0.9.7e)。 但是,如果我用更高版本的 openssl(0.9.8o) 重新编译 php,那么它就可以连接了。

此外,如果我在未启用 openssl 的情况下编译 php,则 curl 能够连接,因为它使用其 linked openssl 0.9.8o。

我不知道这是一个错误还是在 php 中本来就是这样,或者可能在 php/curl 的最新可用版本中已修复。

但我认为从 curl 的角度来看,使用带有 php 的 openssl linked 版本连接到站点是不正确的。它应该使用其 linked openssl version(0.9.8o) 来连接到站点。如果有人连接到该网站,则应使用 linked 到 php 的 openssl(0.9.7e) 版本。