使用Apache HttpClient仅跳过主机名验证

时间:2015-04-10 06:27:15

标签: java ssl apache-httpclient-4.x

我需要在不更改trustmanager的情况下使用httpclient 4.2.1跳过主机名验证。我这样存档:

    httpClient = new DefaultHttpClient(a, b);
    SSLSocketFactory socketFactory = (SSLSocketFactory) httpClient.getConnectionManager().getSchemeRegistry().get("https").getSchemeSocketFactory();
    socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

...但我使用的setHostnameVerifier方法已弃用。如何使用未弃用的方法来实现相同的目标?

3 个答案:

答案 0 :(得分:3)

不要这样做!!!

正如你在https://stackoverflow.com/a/29547114/3081018所解释的那样,这是一个非常糟糕的主意,并且有效地禁用了所有验证,因为攻击者可以使用任何证书为其他主机发起中间人攻击。

再次提出同样的问题并不安全。

答案 1 :(得分:3)

正如之前的人所说,只有在你有充分理由这样做时才应该这样做。我也有封闭的测试环境,我只在绝对需要时禁用主机名验证。它被禁用的唯一地方是应用程序运行测试,从不在将部署到面向用户的服务器的应用程序中。

这可以通过快速实现自己的HostnameVerifier来实现。

AuthorizationManager().startRequest(method: .POST, URLString: NSURL(string: "http://server.url/token")!, parameters: ["":""], encoding: .JSON,headers: ["":""], success: { (data) -> Void in
            print(data)
            }) { (response, data, error) -> Void in
                print(error)
                print("asdasd")
        }

答案 2 :(得分:2)

尝试使用SSLConnectionSocketFactory代替SSLSocketFactory,因为SSLSocketFactory已被弃用