我需要访问一些使用自签名证书的SSL资源。通常,大多数工具都有一个简单的设置,允许这些资源被访问而不会出现错误或警告。然而,使用JVM正确的方法似乎是将签名证书作为CA导入到密钥库中。
我有一个Groovy脚本,我想在任何JVM上独立运行,而不需要修改密钥库或分发新的密钥库。是否有一种简单的方法可以覆盖认证验证?
我需要访问一些使用自签名证书的SSL资源。通常,大多数工具都有一个简单的设置,允许这些资源被访问而不会出现错误或警告。然而,使用JVM正确的方法似乎是将签名证书作为CA导入到密钥库中。
我有一个Groovy脚本,我想在任何JVM上独立运行,而不需要修改密钥库或分发新的密钥库。是否有一种简单的方法可以覆盖认证验证?
经过一些调查,我发现了这篇文章。这是我最终使用的代码:
import javax.net.ssl.HostnameVerifier
import javax.net.ssl.HttpsURLConnection
import javax.net.ssl.SSLContext
import javax.net.ssl.TrustManager
import javax.net.ssl.X509TrustManager
def nullTrustManager = [
checkClientTrusted: { chain, authType -> },
checkServerTrusted: { chain, authType -> },
getAcceptedIssuers: { null }
]
def nullHostnameVerifier = [
verify: { hostname, session -> true }
]
SSLContext sc = SSLContext.getInstance("SSL")
sc.init(null, [nullTrustManager as X509TrustManager] as TrustManager[], null)
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory())
HttpsURLConnection.setDefaultHostnameVerifier(nullHostnameVerifier as HostnameVerifier)
使用需谨慎:这会破坏证书验证!
keytool -import -trustcacerts -alias www.the-domain.com -file the-cert.der -keystore store.jks
-Djavax.net.ssl.trustStore=/path/to/store.jks
getAcceptedIssuers
方法如下:getAcceptedIssuers: { [] as java.security.cert.X509Certificate[] }
。 - Giuseppe Ricupero