允许Java JDK 11 HttpClient使用不安全的HTTPS连接

有时需要允许不安全的HTTPS连接,例如在某些可与任何站点一起使用的网络爬网应用程序中。我将这样的解决方案与旧的HttpsURLConnection

API一起使用,该解决方案最近已由JDK 11中的新HttpClient

API取代。通过该新API允许不安全的HTTPS连接(自签名或过期证书)的方法是什么?

UPD:我尝试过的代码(在Kotlin中,但直接映射到Java):

    val trustAllCerts = arrayOf<TrustManager>(object: X509TrustManager {

override fun getAcceptedIssuers(): Array<X509Certificate>? = null

override fun checkClientTrusted(certs: Array<X509Certificate>, authType: String) {}

override fun checkServerTrusted(certs: Array<X509Certificate>, authType: String) {}

})

val sslContext = SSLContext.getInstance("SSL")

sslContext.init(null, trustAllCerts, SecureRandom())

val sslParams = SSLParameters()

// This should prevent host validation

sslParams.endpointIdentificationAlgorithm = ""

httpClient = HttpClient.newBuilder()

.sslContext(sslContext)

.sslParameters(sslParams)

.build()

但是在发送时我有异常(使用自签名证书在localhost上尝试):

java.io.IOException: No name matching localhost found

使用IP地址而不是localhost会出现“不存在主题备用名称”的异常。

在对JDK进行一些调试之后,我发现sslParams在抛出异常的地方确实忽略了这些错误,并且使用了一些本地创建的实例。进一步的调试显示,影响主机名验证算法的唯一方法是将jdk.internal.httpclient.disableHostnameVerification系统属性设置为true。这似乎是一个解决方案。SSLParameters在上面的代码中没有任何作用,因此可以丢弃此部分。使它只能在全局范围内配置似乎是新HttpClient

API中的严重设计缺陷。

回答:

同样,对于Java11,您也可以按照与HttpClient构建者共享的链接中的选定答案中所述进行类似的工作:

HttpClient httpClient = HttpClient.newBuilder()

.connectTimeout(Duration.ofMillis(<timeoutInSeconds> * 1000))

.sslContext(sc) // SSL context 'sc' initialised as earlier

.sslParameters(parameters) // ssl parameters if overriden

.build();

有样品要求

HttpRequest requestBuilder = HttpRequest.newBuilder()

.uri(URI.create("https://www.example.com/getSomething"))

.GET()

.build();

可以执行为:

httpClient.send(requestBuilder, HttpResponse.BodyHandlers.ofString()); // sends the request


从注释更新,以禁用主机名验证,当前可以使用系统属性:

-Djdk.internal.httpclient.disableHostnameVerification

可以通过程序设置如下:

final Properties props = System.getProperties(); 

props.setProperty("jdk.internal.httpclient.disableHostnameVerification", Boolean.TRUE.toString());

以上是 允许Java JDK 11 HttpClient使用不安全的HTTPS连接 的全部内容, 来源链接: utcz.com/qa/425490.html

回到顶部