我有一個在 debian 伺服器上運行的 Jira 實例,我想從名為 HockeyApp 的雲端應用程式存取該實例。當 HockeyApp 嘗試存取 Jira 的專案清單(失敗但沒有錯誤)時,會發生此問題。因此,我檢查了 Jira API,找到了一個我希望從 HockeyApp 後端呼叫的方法。
當我使用 Chrome 存取 API 時,https://jira.company.com/rest/api/latest/project
我得到了 json 形式的預期結果。但是當我嘗試從 Postman、curl 或 httpie 呼叫這個 API 時,我每次都會遇到錯誤。
捲曲告訴我:
捲曲:(60)SSL憑證問題:無法取得本地頒發者憑證更多詳細資訊請參閱:https://curl.haxx.se/docs/sslcerts.html
curl 無法驗證伺服器的合法性,因此無法與其建立安全連線。要了解有關此情況以及如何解決此問題的更多信息,請訪問上述網頁。
所以我嘗試下載最新的 cacert-2018-10-17.pem 檔案並再次嘗試。沒有任何運氣。如果我新增-k
忽略 ssl 驗證的選項,我確實會得到預期的結果。
如果我確實在郵差的設定中關閉 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 fiules 複製到一個 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