我有一些必须使用自签名证书的 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)
使用风险自负:这会破坏证书验证!
我只需要使用我正在开发的 grails 应用程序来完成此操作。您将只处理一次密钥库。假设您拥有证书,只需将其放入您的密钥库,然后通过命令行道具将您的 jvm 指向密钥库...
编辑-我不知道有什么方法可以绕过对密钥库的需求。但是您可以仅使用所需的证书创建一个,并将其与您的应用程序一起传递。你只做一次。
编辑编辑——这里是 keytool 和 java CL 属性的命令
keytool -import -trustcacerts -alias www.the-domain.com -file the-cert.der -keystore store.jks
-Djavax.net.ssl.trustStore=/path/to/store.jks