2014-04-15 32 views
1

我有一個通過HTTPS安全的Web服務。我也有客戶端軟件,它使用libcurl(可能與OpenSSL鏈接,或鏈接到GnuTLS;我不知道哪一個取決於用戶如何安裝libcurl)與此Web服務進行交談。由於Web服務只能通過客戶端軟件訪問,並且永遠不會通過瀏覽器訪問,因此Web服務使用自簽名證書。客戶端軟件則擁有該自簽名證書的副本,並明確檢查該證書的連接。我可以在一個證書文件中放置多個主機替代證書嗎?

由於Heartbleed,我想更改私鑰和證書。不過,我希望我的用戶儘可能減少服務中斷。

因此,我無法在固定的日期和時間更改密鑰/證書。如果我這樣做,那麼所有用戶都必須在確切的日期和時間升級其客戶端軟件。否則,升級後的客戶端軟件在服務器更改之前無法工作,而舊版本的客戶端軟件在服務器更改後將無法工作。

理想情況下,我想告訴我的用戶我要在1個月內更改證書,並且他們有1個月的時間來升級客戶端軟件。客戶端軟件應與舊證書和新證書兼容。然後,1個月後,我可以發出另一個客戶端軟件更新,取消對舊證書的支持。

所以,現在我們來到我的問題:我可以追加舊的證書和新的證書到一個單一的.crt文件?這會導致libcurl接受兩個證書嗎?如果不是,我該怎麼做呢?行爲是否依賴於SSL庫或版本?

對OS X的測試似乎表明將兩個證書都附加到單個文件中,但我不知道這是否是OS X特定的行爲,還是它在任何地方都可以使用。我的客戶端軟件必須支持各種Unix系統,包括Linux(多發行版)和FreeBSD。

+0

http://stackoverflow.com/questions/9879688/difference-between-cacert-and-capath-in-curl的答案似乎表明您的文件是否可以包含多個證書取決於您的客戶端如何使用捲曲。我認爲你可以以這種或那種方式提取答案,因爲你總是可以改變你的客戶使用捲曲的方式。 –

+0

@WarrenDew在服務器端,將多個證書連接在一起表示證書鏈。連接甚至必須按照特定的順序來完成。客戶端的工作方式是否有所不同? OpenSSL和GnuTLS都認爲客戶端證書連接意味着「這裏有多個證書,如果它們中的任何一個匹配通過」?這個話題似乎沒有明確地回答這個問題。我對於OpenSSL和GnuTLS之間的行爲是否有差異,甚至是不同的OpenSSL版本,有點謹慎。 – Hongli

+0

我認爲這個問題是關於curl的,而不是關於OpenSSL和GnuTLS的。我不是一個捲曲專家,但我可以說最好的一個選擇是擁有一個捲曲庫中的多個證書,只需要將它們放在一個文件中,而不是Java如何將它們存儲(加密)在cacerts中文件。當他們被提交給OpenSSL或GnuTLS時,他們已經被提取到單個證書中,我想。 –

回答

-1

是證書文件應該能夠保存多個證書。我希望這得到廣泛的支持。

+0

來源?你確定嗎?在服務器端,將多個證書連接在一起表示一個證書鏈。連接甚至必須按照特定的順序來完成。客戶端的工作方式是否有所不同? OpenSSL和GnuTLS都認爲客戶端證書連接意味着「這裏有多個證書,如果它們中的任何一個匹配,都會通過」? – Hongli

+0

你認爲什麼來源具有權威性?問題在於沒有標準的機構來實施客戶。從一個證書到另一個證書的無縫過渡將會如何呢?我知道我已經在各種Unix系統上完成了這些工作(注意:不是Linux,而是HPUX,AIX,Solaris等)。您提到這適用於OS X(免費BSD Based)。 Windows是最後一個問號。我知道最初基於Unix工具的Windows上的證書工具,所以我相信它也可以在那裏工作。 –

+0

好吧,回答如何實現證書檢查的libcurl/OpenSSL/GnuTLS開發人員,或對實現所述行爲的代碼行的引用,或者是展示所有這些庫之間的行爲一致的博客帖子,都將被視爲權威性的。 – Hongli

0

簡答:你不能。

龍答:

是的,你可以把一個.crt文件多個證書,無論平臺。

但HTTPS只能提供一個證書,而不是crt文件。所以這不是限制你的文件,它是協議。

+0

我不是在談論我的服務器提供多個證書。我在談論我的客戶接受多個備選證書。 – Hongli

+0

@Hongli爲了您的客戶能夠從多個證書中進行選擇,首先必須提供多個證書。這就是說,如果客戶端(重新)驗證一個crt文件傳輸後HTTPS是**接受**並建立,那麼是的,它會工作。 – Sheepy