0

我們的Web應用程序使用Jersey客戶端API在內部調用多個Web服務。很少有服務是安全的,我們使用證書進行身份驗證。禁用主機名驗證

由於某些原因,我們希望在少數服務上禁用主機名驗證。

所以我搜索了一些例子,發現下面的鏈接和服務在禁用驗證後開始按預期工作。

Link1link2link3

雖然經歷的第三個鏈接我注意到,以HttpsURLConnection.setDefaultHostnameVerifier通話(allHostsValid);

我假設由於上述調用,所有後續Web服務調用都將禁用主機名驗證。

如果我的假設是正確的,如何禁用只在特定服務上驗證?

HostnameVerifier allHostsValid = new HostnameVerifier() { 
    public boolean verify(String hostname, SSLSession session) { 
    if(hostname.equals("xyz")) { 
     return true; 
    } else { 
     // How do I implement this section? 
     // if I return false will the server perform the verification? If not how do I implement this? 
    } 
    } 
}; 

回答

1

在你使用HttpsURLConnection的直接那麼一旦你打開的連接(與URL.openConnection()),你可以調用connection.setHostnameVerifier(allHostsValid)設置主機名校驗爲單個連接。

編輯:

當你使用澤西,它看起來像有具體取決於你使用的澤西1或2

澤西島2你可以設置主機名驗證兩個選項當您創建客戶端時,請使用ClientBuilder

ClientBuilder.newBuilder().hostnameVerifier(allHostsValid).build(); 

您希望創建兩個客戶端並使用不同的客戶端,具體取決於您要連接的服務。但是,jersey docs中有一個警告,指出這隻適用於某些連接器提供商,我不確定您會使用哪個。

這是一個standard API,因此它應該適用於任何兼容的JAX-RS 2.0客戶端(包括Liberty的jaxrsClient-2.0功能)。

對於Jersey 1,它看起來像您可以在客戶端或客戶端請求上設置屬性。

HTTPSProperties httpsProps = new HTTPSProperties(allHostsValid); 
client.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, httpsProps); 
+0

我們使用的是Jersey客戶端。所以我認爲我必須找出一種方法來告訴球衣只爲當前的連接做。謝謝 –

+0

對不起,我錯過了你正在使用Jersey客戶端,直接跳到你調用'HttpsURLConnection.setDefaultHostnameVerifier'的部分。我已經更新了有關Jersey和其他JAX-RS客戶端的一些信息的答案,儘管這不是我自己實現的。 – Azquelt

+0

當然沒問題。我會嘗試識別。如果球衣不提供任何選項,我將使用HttpURLConnection類 –