Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在groovy中将SSL与自签名证书一起使用?_Ssl_Groovy_Ssl Certificate_Self Signed - Fatal编程技术网

如何在groovy中将SSL与自签名证书一起使用?

如何在groovy中将SSL与自签名证书一起使用?,ssl,groovy,ssl-certificate,self-signed,Ssl,Groovy,Ssl Certificate,Self Signed,我有一些资源必须通过使用自签名证书的SSL访问。通常,大多数工具都有一个简单的设置,允许在没有错误或警告的情况下访问这些工具。但是,使用JVM执行此操作的正确方法似乎是将签名证书作为CA导入密钥库 我有一个groovy脚本我想使用,但我更喜欢我的脚本在任何JVM上独立工作,而不修改密钥库或分发新的密钥库。有没有一种简单的方法来覆盖认证验证?我只需要用我正在开发的grails应用程序来完成这个过程。您将只处理密钥库一次。假设您拥有证书,只需将其放入密钥库,然后通过命令行道具将jvm指向密钥库 编辑

我有一些资源必须通过使用自签名证书的SSL访问。通常,大多数工具都有一个简单的设置,允许在没有错误或警告的情况下访问这些工具。但是,使用JVM执行此操作的正确方法似乎是将签名证书作为CA导入密钥库


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

我只需要用我正在开发的grails应用程序来完成这个过程。您将只处理密钥库一次。假设您拥有证书,只需将其放入密钥库,然后通过命令行道具将jvm指向密钥库

编辑-我不知道有什么方法可以绕过对密钥库的需要。但是你可以用你需要的证书创建一个证书,并将其与你的应用程序一起传递。你只做一次

edit edit——这是用于keytool和JavaCL属性的命令

keytool -import -trustcacerts -alias www.the-domain.com -file the-cert.der -keystore store.jks

-Djavax.net.ssl.trustStore=/path/to/store.jks

经过一番研究,我发现。以下是我最终使用的:

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)

使用风险自负:这会破坏证书验证

一般来说,hvgotcodes是一个更好的解决方案。当然,您的里程数可能会有所不同。您的解决方案的问题是,所有主机现在都是有效的,而不仅仅是您实际打算让其通过的少数主机。如果您的代码受到严格控制,并且您确信您将只连接到“受信任”的源,那么您就没事了。但是,如果您将证书导入信任库,您很容易受到DNS错误引导和其他任何问题的影响,从而受到保护。如果您需要更多的动态行为,还可以在运行时设置javax.net.ssl.trustStore属性。但是在某些脚本环境中,完全忽略证书管理是很好的;例如,测试服务器是动态生成的,客户端的密钥库必须持续保持同步。还值得注意的是,其他动态语言(如ruby和python)使其成为一种简单的配置设置,并且在默认情况下分别不强制执行证书链。对于那些复制/粘贴而不经过@BrianM.Carr注释的读者,请使用粗体字:此解决方案完全禁用证书验证步骤,十年后,答案仍然有效。尽管现在需要修改
getAcceptedAssuers
方法,如下所示
getAcceptedAssuers:{[]作为java.security.cert.X509Certificate[]}