2010-07-15 93 views
0

我有要求打開一個TCP套接字並使用SSLv3或TLSv1 IP協議使用X.509數字證書進行身份驗證。打開SSL TCP套接字併發送Web請求

這個握手過程究竟涉及什麼?我知道每封郵件都應該加密並用我的私鑰簽名。還有什麼?

成功後,我必須通過套接字發送POST HTTP請求。

服務器可能決定在一段時間後關閉此套接字(如果處於非活動狀態)。我需要能夠重新打開,驗證並再次發送請求。

給予我的證書採用PKCS12格式,並附有以下信息。

證書識別 ,證書公鑰 ,證書私鑰 ,證書頒發機構鏈

我是相當新的SSL有人可以提供指向如何去在Java或Spring集成實現這一點。

回答

0

你不需要知道握手,這一切都是爲你完成的。按照建議閱讀JSSE參考資料,瞭解您需要擔心的事項。

0

關於TLS/SSL的細節,用於客戶端證書的認證,用「正常」 hanshake相比,該服務器發送一個額外CertificateRequest TLS消息給客戶端,這與其證書響應在後續Certificate TLS消息(以後,客戶端會發送一個TLS消息,在該消息中用其私鑰對其他消息進行簽名,以便向服務器證明它確實在其發送的證書中具有公鑰的私鑰。)請注意,一旦握手已經完成,消息沒有用你的私鑰加密,但是與服務器共享臨時密鑰(保密地同意這些密鑰也是握手的一部分)。

實際上,您需要包含在PKCS#12文件(例如)中的證書及其私鑰,並配置客戶端在連接到服務器時發送它(服務器將根據其要求組態)。 假設您只需要一個證書並且不必在多個證書之間做出選擇就更容易了,否則,您需要在SSLContext內設置自己的X509TrustManager

如果您的所有連接都可能使用此證書,則可以使用默認設置,其中HttpsURLConnection(以及默認的SSLSocketFactory)將會選取。 這可以這樣做:

  • 您的設置在命令行上設置javax.net.ssl.keyStorejavax.net.ssl.keyStoreTypejavax.net.ssl.keyStorePassword系統性能。我會建議是因爲有人在機器上的其他人可能會看到命令行和上市的過程(根據機器的配置)的設置,
  • 你的應用程序中設置的系統屬性,
  • 初始化SSLContext並通過SSLContext.setDefault(..)(Java 6)將其設置爲默認值。

注意的.p12(PKCS#12)文件是支持的密鑰庫開箱即用,所以你不需要做任何的轉換與keytool,只需使用PKCS12作爲存儲類型。

如果您需要使用這些設置,或者您可以初始化一個SSLContext,從它創建一個SSLSocketFactory,然後配置的HttpsURLConnection實例(如果這是你使用的是什麼)與setSSLSocketFactory

(您可以使用類似jSSLutils的工具來幫助構建SSLContext。)