我需要在不更改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方法已弃用。如何使用未弃用的方法来实现相同的目标?
答案 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
已被弃用