我在 Debian 服务器上运行了一个 Jira 实例,我想从名为 HockeyApp 的云应用程序访问它。当 HockeyApp 尝试访问 Jira 的项目列表时,就会出现问题(失败且无错误)。因此,我检查了 Jira API,并找到了一个我希望从 HockeyApp 后端调用的方法。
当我使用 Chrome 访问 API 时,https://jira.company.com/rest/api/latest/project
我获得了预期的 json 结果。但是当我尝试从 Postman、curl 或 httpie 调用此 API 时,每次都会出现错误。
curl 告诉我:
curl:(60)SSL 证书问题:无法获取本地颁发者证书更多详细信息请参见:https://curl.haxx.se/docs/sslcerts.html
curl 无法验证服务器的合法性,因此无法与其建立安全连接。要了解有关此情况的更多信息以及如何修复它,请访问上面提到的网页。
因此,我尝试下载最新的 cacert-2018-10-17.pem 文件并再次尝试。没有任何运气。如果我添加-k
忽略 SSL 验证的选项,我确实会得到预期的结果。
如果我在 Postman 的设置中关闭 SSL 验证,我确实会得到预期的结果。但服务器不使用自签名 SSL 证书。证书如下所示:
该证书在所有浏览器以及其他连接的应用程序(如 Bitbucket 和 Confluence)上运行良好。
我怎样才能找出导致此问题的原因?
答案1
经过大量挖掘后,我终于发现了问题的原因。
当我使用 Wireshark 从 cURL 执行 REST 调用时,我确实开始查看网络流量,发现证书确实不好 - 只是 chrome 不介意。
因此我使用以下命令检查了证书:
openssl s_client -showcerts -connect jira.company.com:443
响应如下:
Start Time: 1544006181
Timeout : 300 (sec)
Verify return code: 21 (unable to verify the first certificate)
最终我发现,我的服务器上使用的证书没有提供完整的认证链。这就是一些客户端拒绝它的原因。
我改变了 JKS,使其包含将 crt 文件复制到一个 company.com.pem 文件中的完整链(此处有更详细的描述:https://www.digicert.com/ssl-support/pem-ssl-creation.htm)
-----BEGIN CERTIFICATE-----
(MyCompany.crt)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Intermediate.crt)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Root.crt)
-----END CERTIFICATE-----
并使用以下方式为 jira 安装创建一个新的 JKS
openssl pkcs12 -export -in company.com.pem -name tomcat -out jira.p12
keytool -importkeystore -srckeystore jira.p12 -srcstoretype pkcs12
-destkeystore jira.jks -deststoretype JKS