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

ata*_*lor 12 ssl groovy self-signed ssl-certificate

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

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

ata*_*lor 18

经过一番研究,我找到了这篇文章.这是我最终使用的内容:

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)
Run Code Online (Sandbox Code Playgroud)

使用风险由您自行承担:这会破坏证书验证!

  • 通常,hvgotcodes是更好的解决方案.当然,您的里程可能会有所不同.您的解决方案的问题是所有主机现在都有效,而不仅仅是您实际想要通过的少数主机.如果您的代码受到严格控制,并且您确定只会连接到"受信任"的来源,那么您会没事的.但是,如果将证书导入信任库,则很容易受到DNS误导以及任何其他问题的影响.如果您有更多动态行为,还可以在运行时设置javax.net.ssl.trustStore属性. (3认同)
  • 只是为那些复制/粘贴而不经过@BrianM.Carr评论的读者加入大胆的说明:**此解决方案完全禁用证书验证步骤,从而使连接可能容易受到MITM攻击**. (3认同)

hvg*_*des 9

我只需要使用我正在处理的grails应用程序.您只需处理一次密钥库.假设你有证书,只需将它放入你的密钥库,然后通过命令行道具将你的jvm指向密钥库......

编辑 - 我不知道有什么方法可以绕过对密钥库的需求.但是您可以使用您需要的证书创建一个并使用您的应用程序传递它.你只做一次.

编辑编辑 - 这是keytool和java CL prop的命令

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

-Djavax.net.ssl.trustStore=/path/to/store.jks
Run Code Online (Sandbox Code Playgroud)