2010-03-09 119 views
4

我已經使用keytool實現了一個帶有服務器和客戶機認證的Web服務。問題是如果我不在其中包含主機的名稱,則此身份驗證不起作用。例如:沒有主機名的SSL證書

keytool -genkey -alias myAlias -keyalg RSA -keypass myPassword -storepass myPassword -keystore my.keystore -dname "CN=myhost" 

但我不需要,我不喜歡通過主機或IP驗證。有什麼方法可以避免嗎?

謝謝。

+0

爲了大家否則,我想指出的是,就我的理解而言,證書鎖定是一種用例,您不需要知道主機名即可保留安全性。 (但是,我仍然很難說服我的客戶端應用程序。) – Erhannis 2016-11-11 16:06:08

回答

8

作爲其要求的一部分,SSL具有證書CN與您連接的主機名匹配的驗證。如果CN不匹配,那麼瀏覽器將假定您連接到錯誤的主機和對象。

有沒有辦法解決這個問題。

+3

這不是嚴格的SSL/TLS要求(它不在SSL/TLS規範中)。然而,它在[RFC 2818](http://tools.ietf.org/html/rfc2818#section-3.1)(HTTPS)中被推廣,並被推廣到使用帶有X.509證書的SSL/TLS的其他協議(即最常見的使用模式)[RFC 6125](http://tools.ietf.org/html/rfc6125)(最近比這個答案)。使用主題備用名稱擴展名優先於使用主題專有名稱的CN RDN。 – Bruno 2012-01-05 15:19:25

2

使用SSL/TLS的要點是,客戶端可以確保它連接到正確的服務,而不是嘗試模擬真實服務的某些虛假服務。如果(假設)服務器證書不包含任何主機標識信息,則客戶端(如果它正在與之協商的服務器是正確的)。

事實上,你的確實需要通過DNS地址驗證,因爲如果你不這樣做,你的SSL驗證是毫無價值的。 (或者至少,不像安全的那樣)

我想你理論上可以嘗試通過除SSL/TLS之外的其他方式保護的通道來進行客戶端/服務器通信。但是,您需要在Java的安全和加密技術方面擁有認真的專業知識。

+0

是否存在您使用CA簽署證書並使用特定CA簽署的有效證書信任所有服務器/客戶端的用例?就像可能在任何主機/ IP上彈出的一羣服務器一樣? – 2017-12-16 16:46:27

+0

好的。但是,如果服務器提供的證書中沒有主機名,最終用戶/瀏覽器如何知道主機是正確的?服務器需要提供與瀏覽器使用的URL中的主機名/ IP匹配的證書。或者瀏覽器會說(正確)「不安全!!」。 – 2017-12-17 00:03:50

+0

「但最終用戶/瀏覽器如何知道主機是正確的」 它不,並且這對於普通(匿名)用戶和網站自然不起作用。 但是,如果您的SSL驗證沒有價值(或者至少不像其它安全的那樣),那麼這與「 」有很大不同。「 – 2017-12-17 22:07:12

1

標準邏輯是:如果您不需要保護您的數據,請不要使用SSL。如果你確實需要保護它,那麼你需要知道你連接的是什麼主機。中間不應該有任何內容。

但是,在某些內部環境中,您可能對網絡和配置有足夠的控制權,不用擔心。

如果您處於後一種情況,那麼解決方案取決於您使用的客戶端庫。如果您使用HTTP客戶端,請閱讀SSL config guide。這可能是你不需要實現你自己的SecureProtocolSocketFactory,並且可以使用EasySSLProtocolSocketFactory

3

我同意其他海報:如果您使用SSL,您幾乎可以肯定想將主機名驗證作爲SSL安全功能集的一部分。

也就是說,根據您使用的客戶端,可能很有辦法解決此問題。工程師們將繞過主機名驗證測試環境,調試,樣機等,如果您所使用的通過HttpsURLConnection的連接Java客戶端,這將是作爲添加以下到您的客戶端類一樣簡單:

static { 
    HttpsURLConnection.setDefaultHostnameVerifier( 
     new HostnameVerifier(){ 
      public boolean verify(String string,SSLSession ssls) { 
      return true; 
     } 
    }); 
} 
相關問題