2014-02-22 14 views
1

我們在Jboss SOA 5.3.1中部署了一個應用程序。在服務器和客戶端都創建了自簽名證書,並且是單向SSL。但是使用主機名和端點創建的服務器和客戶端證書都使用IP地址註冊。我們在httpClient.properties中使用如何在jboss中禁用主機名驗證

protocol-socket-factory=org.apache.commons.httpclient.contrib.ssl.StrictSSLProtocolSocketFactory 

。但打終點時,拋出異常說

org.jboss.soa.esb.actions.ActionProcessingException:問題處理HTTP I/O:主機名的證書不匹配:< 15.191.34.56>! =主機名。

請讓我知道如何禁用嚴格SSL的主機名驗證?

回答

1

關閉主機名驗證會使您的連接容易受到MITM攻擊。這不是解決這個問題的正確方法。

你的問題來自於事實,你使用的是IP地址,而不是主機名。 Java嚴格遵循RFC 2818(不像某些瀏覽器):

在某些情況下,URI被指定爲IP地址而不是主機名。在這種情況下,iPAddress subjectAltName必須存在於證書中,並且必須與URI中的IP完全匹配。

當生成你的證書,請確保你把IP地址在主題備用名稱(類型的IP地址),如所描述here。 或者,也可以使用主機名(儘管仍建議將名稱放入SAN中)。

+0

我創建了一個自定義類,擴展了StrictSSL由apache提供,並在默認構造函數中設置了false,但它的安全漏洞。 – Ashwini

+0

由您決定,但是真的比用合適的SAN生成新證書的工作量少(考慮到您可能必須在稍後的應用程序部署中修復該代碼,以消除此潛在的漏洞)? – Bruno

0

Web的整個SSL認證都基於主機名。您不能簡單地關閉「主機名稱驗證」,因爲它是標準的一部分。

要克服這個問題,您需要通過在頒發證書中指定的名稱來調用主機。如果您有中央DNS服務器,最好在那裏配置主機名稱。如果沒有,您可以在需要通信的盒子上使用主機文件。

  • 在Windows上它將在:驅動器:\ WINDOWS \ SYSTEM32 \ DRIVERS \等\主機
  • 在Linux上它是在/ etc/hosts中

添加以下行: 15.191.34.56 hostName.with.cert.issued

在你的代碼調用服務器的名字,你也需要確保JBoss正在監聽這個名字。

+0

配置是在/ etc做/的IP地址和主機名 客戶端主機已註冊幾個服務與IP地址的終點,他們不能將其更改爲主機名。 我也嘗試過AUTHSSL和EasySSL。我讀StrictSSL有辦法禁用主機名驗證,我嘗試了所有可能性來禁用主機名。 在httpClient.properties中,我添加了以下conf STRICTSSL = false StrictSSLProtocolSocketFactory。setHostnameVerification = false 以上值不受尊敬 – Ashwini

+0

我看到了,那麼也許有可能爲套接字工廠添加包裝?並且在默認構造函數中調用具有false參數的基類的構造函數。 http://svn.apache.org/repos/asf/httpcomponents/oac.hc3x/trunk/src/contrib/org/apache/commons/httpclient/contrib/ssl/StrictSSLProtocolSocketFactory.java –