这看起来是个标准问题,但我到处都找不到明确的方向.

我有java代码试图连接到一个可能有自签名(或过期)证书的服务器.代码报告以下错误:

[HttpMethodDirector] I/O exception (javax.net.ssl.SSLHandshakeException) caught 
when processing request: sun.security.validator.ValidatorException: PKIX path 
building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target

据我所知,我必须使用keytool,并告诉java允许此连接.

解决此问题的所有说明都假设我完全精通keytool,例如

为服务器生成私钥并将其导入密钥库

有人可以发布详细的说明吗?

我运行的是Unix,所以bash脚本是最好的.

不确定这是否重要,但代码是在JBoss中执行的.

推荐答案

这里基本上有两个选项:将自签名证书添加到JVM信任库,或将客户端配置为

选项1

从浏览器导出证书并将其导入JVM信任库(以建立信任链):

<JAVA_HOME>\bin\keytool -import -v -trustcacerts
-alias server-alias -file server.cer
-keystore cacerts.jks -keypass changeit
-storepass changeit 

Select 2

禁用证书验证:

// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] { 
    new X509TrustManager() {     
        public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
            return new X509Certificate[0];
        } 
        public void checkClientTrusted( 
            java.security.cert.X509Certificate[] certs, String authType) {
            } 
        public void checkServerTrusted( 
            java.security.cert.X509Certificate[] certs, String authType) {
        }
    } 
}; 

// Install the all-trusting trust manager
try {
    SSLContext sc = SSLContext.getInstance("SSL"); 
    sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (GeneralSecurityException e) {
} 
// Now you can access an https URL without having the certificate in the truststore
try { 
    URL url = new URL("https://hostname/index.html"); 
} catch (MalformedURLException e) {
} 

注意这个I do not recommend the Option #2 at all.禁用信任管理器会 destruct SSL的某些部分,并使您容易受到中间人的攻击.首选选项#1,或者更好的做法是让服务器使用由知名CA签名的"真正"证书.

Java相关问答推荐

Saxon 9:如何从Java扩展函数中的net.sf.saxon.expr. XPathContent中获取声明的变量

将Nimbus设置为计算机上运行的所有Java应用程序的默认外观

将具有多个未知字段的SON映射到Java POJO

如果给定层次 struct 级别,如何从其预序穿越构造n元树

gitlab ci不会运行我的脚本,因为它需要数据库连接'

如何使用jooq generator将表名和列名映射为人类可读的?

Jooq外键关系

无法了解Java线程所消耗的时间

GSON期间的Java类型擦除

为什么Spring Boot项目无法为基于MySQL的CRUD应用程序找到从JPARepository接口扩展的ProductRepository?

如何在JUNIT测试中覆盖ExecutorService?

如何在盒子的顶部和底部创建两张不同图片(大小相同)的盒子?

try 在两个不同数组的数字之间求平均值

Java HashMap保留所有时间复杂性

如何使用Java ZoneID的区域设置?

如何在Spring Security中设置一个任何人都可以打开的主页?

PhantomReference无法访问时会发生什么?

java.exe如何执行java源代码?

Xml Reader 将 BMP 外部的字符解析为代理项对,这会导致无效的 xml

语句打印在错误的行(Java Token 问题)