我有一些必须使用自签名证书的SSL访问的资源。一般来说,大多数工具都有一个简单的设置,允许访问这些工具时不会出现错误或只是一个警告。但是,使用JVM执行此操作的正确方法是将签名证书作为CA导入密钥库。如何在Groovy中使用SSL和自签名证书?
我有一个groovy脚本我想使用,但我更喜欢我的脚本独立工作在任何JVM上,无需修改密钥库或分发新的密钥库。有没有简单的方法来覆盖认证验证?
我有一些必须使用自签名证书的SSL访问的资源。一般来说,大多数工具都有一个简单的设置,允许访问这些工具时不会出现错误或只是一个警告。但是,使用JVM执行此操作的正确方法是将签名证书作为CA导入密钥库。如何在Groovy中使用SSL和自签名证书?
我有一个groovy脚本我想使用,但我更喜欢我的脚本独立工作在任何JVM上,无需修改密钥库或分发新的密钥库。有没有简单的方法来覆盖认证验证?
经过一些研究,我发现this post。这是我最终使用的:
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在密钥库中...
编辑 - 我不知道任何方式绕过对密钥库的需要。但是你可以用你需要的证书创建一个,并将它传递给你的应用程序。你只做一次。
编辑编辑 - 这里是密钥工具和Java命令C1支撑
keytool -import -trustcacerts -alias www.the-domain.com -file the-cert.der -keystore store.jks
-Djavax.net.ssl.trustStore=/path/to/store.jks
如果调用命令行程序curl
,而不是使用本地常规/ JVM工具,您可以禁用证书检查为您的用户通过从命令行运行以下:
$ echo 'insecure' >>~/.curlrc
一般来说,hvgotcodes是一个更好的解决方案。当然,你的里程可能会有所不同。您的解决方案的问题是,所有主机现在都是有效的,而不仅仅是您实际打算通过的一小部分主机。 如果您的代码受到严格控制,并且您确信只会连接到“可信”来源,那么您会好起来的。但是,如果将证书导入到信任库中,则您很容易受到DNS误导和其他任何可能受保护的问题的影响。 如果您有更多的动态行为,您还可以在运行时设置javax.net.ssl.trustStore属性。 – 2010-07-13 23:44:11
总的来说,我同意。但是有一些脚本上下文可以完全忽略证书管理,例如,动态生成测试服务器的位置,并且客户端的密钥库不得不连续保持同步。还值得注意的是,其他动态语言(如ruby和python)使得这是一个简单的配置设置,并且不会默认强制执行证书链。 – ataylor 2010-07-14 17:22:34
只需要为阅读者复制/粘贴而不用通过@ BrianM.Carr的评论:**此解决方案完全禁用证书验证步骤,从而使连接可能容易受到MITM攻击**。 – Bruno 2014-07-22 14:52:44