我遇到了一个有趣的问题。我们有一个 PHP 脚本,用于联系 LTL 托运人 (https://facts.dohrn.com/)。该脚本一直失败,因为它无法验证 SSL 证书。我去了该网站,发现他们使用的是 GoDaddy SHA2 证书(使用GoDaddy 证书包 - G2,这是用于 SHA2 的)。
我已经安装了最新版本的ca-certificate
,看起来他们有Go Daddy 根证书颁发机构 - G2但这不是一回事,而且在所有形式的验证中都失败了。我终于能够通过复制包并直接在 CURL 请求中使用它来让它工作。但这只是一种解决方法。我是否还缺少其他东西,可以在不直接安装 CA 的情况下让它工作?
# openssl s_client -connect facts.dohrn.com:443
CONNECTED(00000003)depth=0 OU = 域控制已验证,CN = facts.dohrn.com 验证
错误:num=20:无法获取本地颁发者证书验证返回:1depth
=0 OU = 域控制已验证,CN = facts.dohrn.com 验证
错误:num=27:证书不受信任验证返回:1depth=0 OU =
域控制已验证,CN = facts.dohrn.com 验证
错误:num=21:无法验证第一个证书验证返回:1
--- 证书链 0 s:/OU=Domain Control Validated/CN=facts.dohrn.com
i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com,
Inc./OU=http://certs.godaddy.com/repository//CN
=Go Daddy Secure
Certification Authority - G2
--- 服务器证书 [证书已删除]
-----END CERTIFICATE-----
subject=/OU=Domain Control Validated/CN=facts.dohrn.com
issuer=/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com,
Inc./OU=http://certs.godaddy.com/repository//CN
=Go Daddy 安全
证书颁发机构 - G2
--- 未发送客户端证书 CA 名称
--- SSL 握手已读取 1470 字节并写入 563 字节
--- 新的,TLSv1/SSLv3,密码为 RC4-SHA 服务器公钥为 2048 位 不支持安全重新协商 压缩:无 扩展:
无 SSL 会话:
协议:TLSv1
密码:RC4-SHA
会话 ID:1A23000017A7003411F3833970B7FA23C6D782E663CE0C8B17DE4D5A15DEE1A5
会话 ID-ctx:
主密钥: F6C9C6345A09B7965AF762DE4BEFE8BDD249136BF30D9364598D78CF123F17230B0C25DD552F103BEF9A893F75EAD2B0
Key-Arg:无
Krb5 主体:无
PSK 身份:无
PSK 身份提示:无
开始时间:1432044402
超时:300(秒)
验证返回代码:21(无法验证第一个证书)
答案1
看起来网络服务器位于https://facts.dohrn.com/不包括中级证书。
这似乎是他们的配置错误。这肯定会导致兼容性问题,因为您实际上只应该依赖客户端事先准备好根证书。
查看证书链,例如来自SSLLabs 结果:(您还会注意到他们的 SSL 设置还存在许多其他问题。)
1 Sent by server facts.dohrn.com
Fingerprint: 823e3a70f194c646498b2591069b3727ad0014d9
RSA 2048 bits (e 65537) / SHA256withRSA
2 Extra download Go Daddy Secure Certificate Authority - G2
Fingerprint: 27ac9369faf25207bb2627cefaccbe4ef9c319b8
RSA 2048 bits (e 65537) / SHA256withRSA
3 In trust store Go Daddy Root Certificate Authority - G2 Self-signed
Fingerprint: 47beabc922eae80e78783462a79f45c254fde68b
RSA 2048 bits (e 65537) / SHA256withRSA
我想说,你主要的选择是要么试图说服服务提供商修复他们的服务,要么通过向客户提供他们的服务器应该提供的证书来解决你这边的问题。