【问题标题】:How to use SSL with a self-signed certificate in groovy?如何在 groovy 中使用 SSL 和自签名证书?
【发布时间】:2011-03-15 14:45:16
【问题描述】:

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

我有一个我想使用的 groovy 脚本,但我希望我的脚本能够在任何 JVM 上独立运行,而无需修改密钥库或分发新的密钥库。有没有简单的方法来覆盖认证验证?

【问题讨论】:

    标签: ssl groovy ssl-certificate self-signed


    【解决方案1】:

    经过一番研究,我找到了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)
    

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

    【讨论】:

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

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

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

    edit edit -- 这里是 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-25
      • 2012-11-01
      • 1970-01-01
      • 2017-07-18
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 2016-12-04
      相关资源
      最近更新 更多