2010-07-13 35 views
7

我有一些必须使用自签名证书的SSL访问的资源。一般来说,大多数工具都有一个简单的设置,允许访问这些工具时不会出现错误或只是一个警告。但是,使用JVM执行此操作的正确方法是将签名证书作为CA导入密钥库。如何在Groovy中使用SSL和自签名证书?

我有一个groovy脚本我想使用,但我更喜欢我的脚本独立工作在任何JVM上,无需修改密钥库或分发新的密钥库。有没有简单的方法来覆盖认证验证?

回答

17

经过一些研究,我发现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) 

使用您自担风险:这颠覆了证书验证!

+3

一般来说,hvgotcodes是一个更好的解决方案。当然,你的里程可能会有所不同。您的解决方案的问题是,所有主机现在都是有效的,而不仅仅是您实际打算通过的一小部分主机。 如果您的代码受到严格控制,并且您确信只会连接到“可信”来源,那么您会好起来的。但是,如果将证书导入到信任库中,则您很容易受到DNS误导和其他任何可能受保护的问题的影响。 如果您有更多的动态行为,您还可以在运行时设置javax.net.ssl.trustStore属性。 – 2010-07-13 23:44:11

+0

总的来说,我同意。但是有一些脚本上下文可以完全忽略证书管理,例如,动态生成测试服务器的位置,并且客户端的密钥库不得不连续保持同步。还值得注意的是,其他动态语言(如ruby和python)使得这是一个简单的配置设置,并且不会默认强制执行证书链。 – ataylor 2010-07-14 17:22:34

+2

只需要为阅读者复制/粘贴而不用通过@ BrianM.Carr的评论:**此解决方案完全禁用证书验证步骤,从而使连接可能容易受到MITM攻击**。 – Bruno 2014-07-22 14:52:44

7

我只是不得不通过这与我正在工作的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 
-4

如果调用命令行程序curl,而不是使用本地常规/ JVM工具,您可以禁用证书检查为您的用户通过从命令行运行以下:

$ echo 'insecure' >>~/.curlrc 
+1

这篇文章在meta上讨论过:http://meta.stackoverflow.com/questions/266368/why-this-post-is-not-very-low-quality – 2014-07-22 12:34:45

+2

@staticx,此外,它特别不安全,因为它会影响**所有用户使用'curl'所做的连接。 – Bruno 2014-07-22 14:45:02

+0

@staticx嗯,你说得对,那可能是他建议的。修正答案。 – ataylor 2014-07-22 15:03:06