SSL证书验证:javax.net.SSL.SSLHandshakeException
我正试图通过SSL证书验证:javax.net.SSL.SSLHandshakeException,java,security,ssl,https,Java,Security,Ssl,Https,我正试图通过Jersey客户端调用HTTPS REST API。在发展过程中,我偶然发现了以下错误: Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching mvn.signify.abc.c
Jersey客户端
调用HTTPS REST API。在发展过程中,我偶然发现了以下错误:
Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching mvn.signify.abc.com found
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:149)
at com.sun.jersey.api.client.Client.handle(Client.java:648)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:670)
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:503)
at com.lftechnology.sbworkbench.utility.utils.PingFederateUtility.main(PingFederateUtility.java:32)
Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching mvn.signify.abc.com found
所以我在谷歌上搜索了一下,找到了大量的解决方案,这确实有效
他们在不同的领域,但他们有一个共同的解决方案
脚本
我目前正在开发环境中使用自行创建的自签名证书。因此,它必然会出现这个问题
问题:
上述解决方案的重点是跳过/允许验证所有证书
但当我将其移动到生产环境中时,我就可以访问来自可靠来源的有效签名证书
try
{
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
};
// Install the all-trusting trust manager
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
// Create all-trusting host name verifier
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
// Install the all-trusting host verifier
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
然后我与泽西公司合作,使其发挥作用。而且效果很好
所以,问题再次出现此解决方案可用于生产环境吗?
但是,您不想修改返回的实体,最好以只读模式获取实体。这将允许Hibernate丢弃关联的分离状态,脏检查机制使用该状态检测实体状态修改。此外,刷新期间将跳过只读实体
我当前正在中使用自行创建的自签名证书
发展环境。。。javax.net.ssl.SSLHandshakeException:
java.security.cert.CertificateException:没有名称匹配
dev.ppc.lftechnology.com找到
自签名证书似乎不正确
下面是OpenSSLCONF
文件,我用来创建自签名证书和测试期间使用的证书请求。将其另存为example com.conf
。更改[备用名称]
下的DNS名称以符合您的喜好。您甚至可以将localhost
、localhost.localdomain
和127.0.0.1
放入其中进行测试
如果要创建自签名证书,请使用:
openssl req -config example-com.conf -new -x509 -newkey rsa:2048 \
-nodes -keyout example-com.key.pem -days 365 -out example-com.cert.pem
openssl req -config example-com.conf -new -newkey rsa:2048 \
-nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem
openssl x509 -in example-com.cert.pem -text -noout
openssl req -in example-com.req.pem -text -noout
如果要创建将由可信机构签名的签名请求(CSR),请使用:
openssl req -config example-com.conf -new -x509 -newkey rsa:2048 \
-nodes -keyout example-com.key.pem -days 365 -out example-com.cert.pem
openssl req -config example-com.conf -new -newkey rsa:2048 \
-nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem
openssl x509 -in example-com.cert.pem -text -noout
openssl req -in example-com.req.pem -text -noout
自签名证书和签名请求之间的区别在于-x509
选项。存在-x509
时,将创建自签名证书。缺少-x509
表示已创建请求
如果要打印自签名证书或请求以查看其中的实际内容,请使用:
openssl req -config example-com.conf -new -x509 -newkey rsa:2048 \
-nodes -keyout example-com.key.pem -days 365 -out example-com.cert.pem
openssl req -config example-com.conf -new -newkey rsa:2048 \
-nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem
openssl x509 -in example-com.cert.pem -text -noout
openssl req -in example-com.req.pem -text -noout
如果要测试服务器,请使用s\u client
:
openssl s_client -connect <server>:<port> -CAfile <trust-anchor.pem>
跳过SSL验证可以吗
不,那太不负责任了。如果您不打算正确使用PKIX,那么为什么要使用它呢
我想到了这一点:
最好将自签名证书加载到密钥库(或加载私有CA),然后将其传递到SSLContext.init
。然后一切都按预期运行,无需信任一切或从verify
返回true
Bruno和EJP有很多关于这个问题的答案
为开发和生产环境实现通用解决方案的其他替代方法是什么
使用格式良好的证书链接回受信任的根
对于测试,您可以创建自签名证书。或者,创建一个证书请求,并让您的内部CA在专用PKI中对其进行签名。在这种情况下,您需要信任您的自签名证书或信任您的内部CA
对于生产,您可以使用由CA Zoo的一个成员签名的证书,以便组织外部的其他人也信任它。并免费提供一级证书
类别1证书通常经过域验证,不允许通配符。虽然第1类是免费发布的,但它们对撤销收取费用,因为这是成本所在
如果你需要通配符,那么你通常需要购买2级或更高级别的通配符。@jww正确地回答了这个问题
跳过SSL验证可以吗?不,那太不负责任了
但是,在某些情况下,您可能无法控制相关服务器以安装有效的证书。如果服务器属于其他人,并且您信任该服务器,则更好的解决方案是使用“白名单”仅验证受信任服务器的证书,否则使用普通验证
public static class WhitelistHostnameVerifier implements HostnameVerifier {
private static final HostnameVerifier defaultHostnameVerifier = HttpsURLConnection.getDefaultHostnameVerifier();
private Set<String> trustedHosts;
public WhitelistHostnameVerifier(Set<String> trustedHosts) {
this.trustedHosts = trustedHosts;
}
@Override
public boolean verify(String hostname, SSLSession session) {
if (trustedHosts.contains(hostname)) {
return true;
} else {
return defaultHostnameVerifier.verify(hostname, session);
}
}
}
如果要禁用安全检查,请不要全局禁用…在创建自签名证书时,Java Keytool for Java 1.7.0_60-b19版存在标签软件错误。有关参考信息,请参阅这些说明
当它提示您输入“您的名字和姓氏是什么?”时,您应该输入通用名或(服务器的完全限定域名),而不是键入您的名字
查找Java版本:
[root@localhost ~]# java -version
java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) Client VM (build 24.60-b09, mixed mode, sharing)
“跳过SSL验证可以吗?”-不可以。。还是你不在这里说苹果会失败?!“那么,问题又来了。这个解决方案在生产环境中使用可行吗?”-不,不可行。这是不负责任和严重的疏忽。谢谢@jww这是一个很棒的回答。关于我提到的解决方案
,我已经更新了一点我的问题。感谢您宝贵的见解@jww.hi@jww它对localhost{DNS}运行良好,当我提供192.168.1.56这样的本地ip地址时,它不工作。请帮助我out@Srinivasu-添加类似于DNS.5=192.168.1.56的内容。如果它仍然不工作,那么它与浏览器有关。但我一直无法找到浏览器对IP攻击的确切原因