我负责运行 apache 的 Web 服务器,该服务器托管大约 15 个不同的站点。现在一个站点需要与另一个站点通信,我们的开发人员尝试使用 PHP 通过 curl 连接到它。这行不通。我尝试通过以下方式在命令行上对其进行调试:
curl --verbose https://deutsche-unterstuetzungskasse.de
它给了我错误 60(在主题标题中说明),这很奇怪,因为它在所有其他页面上都有效。
更详细:
* About to connect() to deutsche-unterstuetzungskasse.de port 443 (#0)
* Trying 195.244.228.197...
* connected
* Connected to deutsche-unterstuetzungskasse.de (195.244.228.197) port 443 (#0)
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection #0
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: http://curl.haxx.se/docs/sslcerts.html
...
我们的所有页面都配备了有效的 SSL 证书以及无效的证书。唯一的区别似乎是这个页面没有通配符证书。如果我设置 curl 选项,--cacert /etc/ssl/certs/ca-certificates.crt
它会正常工作,但它并没有真正解决问题。这里是详细输出:
* About to connect() to deutsche-unterstuetzungskasse.de port 443 (#0)
* Trying 195.244.228.197...
* connected
* Connected to deutsche-unterstuetzungskasse.de (195.244.228.197) port 443 (#0)
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using ECDHE-RSA-AES256-GCM-SHA384
* Server certificate:
* subject: C=DE; postalCode=22303; ST=Hamburg; L=Hamburg; street=Barmbeker Stra�e 2-6; O=Cevo Systemhaus AG; OU=IT; CN=deutsche-unterstuetzungskasse.de
* start date: 2017-10-19 00:00:00 GMT
* expire date: 2019-01-17 23:59:59 GMT
* subjectAltName: deutsche-unterstuetzungskasse.de matched
* issuer: C=GB; ST=Greater Manchester; L=Salford; O=COMODO CA Limited; CN=COMODO RSA Organization Validation Secure Server CA
* SSL certificate verify ok.
> GET / HTTP/1.1
> User-Agent: curl/7.26.0
> Host: deutsche-unterstuetzungskasse.de
> Accept: */*
>
...
有人能帮我解决这个问题吗?我已经无能为力了
编辑:
因此我做了进一步的研究,发现了这个简洁的 SSL 服务器测试:
https://www.ssllabs.com/ssltest/analyze.html?d=deutsche-unterstuetzungskasse.de
这似乎表明了我的问题。不知何故,服务器在第二个证书中给出了 *c-core.de 作为备用名称。我该如何解决这个问题?
答案1
我设法解决了这个问题!正如 Simon Greenwood 所说,这可能与旧软件有关,情况确实如此,但 curl 已经是最新的。我升级了 Apache 和 openssl,然后又出现了另一个错误:
..”证书例程:X509_STORE_add_cert:证书已在哈希表中”
我在谷歌或其他地方找不到太多信息,但有人说这个命令
c_rehash
可以修复这个问题。最后它确实修复了!我仍然有证书中错误名称的问题,但它似乎不再困扰 curl 了。
答案2
通配符证书是否来自同一颁发者?根据证据,您似乎没有有效的 Comodo CA。在您的 apache 配置中,您通常会有 SSLCertificateFile 和 SSLCertificateChainFile 的设置,因此请检查一下。