12

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

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

4

2 回答 2

21

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

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)

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

于 2010-07-13T23:36:58.950 回答
9

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

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

编辑编辑——这里是 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
于 2010-07-13T23:31:25.480 回答