我正在尝试通过调用HTTPS REST API Jersey Client
。在开发过程中,我偶然发现以下错误:
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
因此,我在Google上搜索了一下,并找到了很多可行的解决方案。
他们在不同的领域,但是他们有一个共同的解决方案来解决这个问题。
我目前在开发环境中使用自行创建的自签名证书。因此势必会出现问题。
上面提到的解决方案着重于跳过/允许验证所有证书。
但是,当我将其移至生产环境时,便可以从可信赖的来源访问“有效签名证书”。
聚苯乙烯
我使用的解决方案是
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();
}
然后我与之合作Jersey
以使其正常工作。而且效果很好。
所以,Question
再次。 该解决方案是否可以在生产环境中使用?
但是,您不想修改返回的实体,最好以只读模式获取实体。这将允许Hibernate丢弃由脏检查机制用来检测实体状态修改的关联分离状态。在刷新过程中会跳过更多只读实体。
我目前在开发环境中使用自行创建的自签名证书。…
javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateException:找不到与dev.ppc.lftechnology.com匹配的名称
自签名证书似乎不正确。
以下是CONF
我用来创建自签名证书和证书请求以在测试期间使用的OpenSSL 文件。另存为example-com.conf
。[ alternate_names ]
根据您的喜好更改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
如果要创建将由受信任的机构签名的签名请求(CSR),请使用:
openssl req -config example-com.conf -new -newkey rsa:2048 \
-nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem
该-x509
选项是自签名证书和签名请求之间的区别。随着-x509
目前,创建一个自签名证书。缺少-x509
手段即创建请求。
如果要打印自签名证书或请求查看其中的内容,请使用:
openssl x509 -in example-com.cert.pem -text -noout
openssl req -in example-com.req.pem -text -noout
如果要测试服务器,请使用s_client
:
openssl s_client -connect <server>:<port> -CAfile <trust-anchor.pem>
上面的命令应该以类似的消息结束Verify OK (0)
。如果未收到Verify OK (0)
,请修复测试装备。一旦OpenSSL成功完成,则将成为您的基准。
[ req ]
default_bits = 2048
default_keyfile = server-key.pem
distinguished_name = subject
req_extensions = req_extensions
x509_extensions = cert_extensions
string_mask = utf8only
[ subject ]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = NY
localityName = Locality Name (eg, city)
localityName_default = New York
organizationName = Organization Name (eg, company)
organizationName_default = Example, LLC
# Use a friendly name here. Its presented to the user.
# The server's DNS name show up in Subject Alternate Names. Plus,
# DNS names here is deprecated by both IETF and CA/Browser Forums.
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Example Company
emailAddress = Email Address
emailAddress_default = test@example.com
[ cert_extensions ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
# extendedKeyUsage = serverAuth
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
[ req_extensions ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
# extendedKeyUsage = serverAuth
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
[ alternate_names ]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = mail.example.com
DNS.4 = ftp.example.com
# Add these if you need them. But usually you don't want them or
# need them in production. You may need them for development.
# DNS.5 = localhost
# DNS.6 = localhost.localdomain
# DNS.7 = 127.0.0.1
可以跳过SSL验证吗?
不,那是非常不负责任的。如果您不会正确使用PKIX,那为什么还要使用它呢?
这是我想到的:世界上最危险的代码:验证非浏览器软件中的SSL证书。
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
最好将您的自签名证书加载到密钥库中(或加载您的私有CA),然后将其传递给SSLContext.init
。这样,一切都会按预期进行,而无需信任一切或true
从中返回verify
。
布鲁诺(Bruno)和EJP对此主题有很多答案。
为开发和生产环境实现通用解决方案的另一种替代方法是什么?
使用格式正确的证书,该证书可链接回受信任的根。
为了进行测试,您可以创建一个自签名证书。或者,创建一个证书请求,并由您的内部CA在私有PKI中对其进行签名。在这种情况下,您需要信任自己的签名证书或内部CA。
对于生产,您可以使用由CA
Zoo成员之一签名的证书,以便组织外部的其他人也信任它。StartCom和CACert提供免费的1类证书。
1类证书通常经过域验证,并且不允许使用通配符。第1类是免费发行的,但它们收取撤销费用,因为这就是费用所在。
如果您需要通配符,则通常将购买2级或更高等级。
我正在尝试通过调用HTTPS REST API。在开发过程中,我偶然发现了以下错误: 所以我用谷歌搜索了一下,找到了大量的解决方案,实际上是有效的。 使用泽西客户端的HTTPS https://gist.github.com/outbounder/1069465 如何修复java.security.cert.证书异常:不存在主题替代名称错误? http://www.mkyong.com/webse
问题内容: 假设我编写了两个Java应用程序:并且它们被部署并在两个单独的服务器上运行(部署到和部署到),并且这两个应用程序需要通过SSL相互通信(双向)。我们还假设每个应用程序都有自己的SSL证书。 我(Java程序员)如何编码并验证彼此的SSL证书?每个CA是否都提供某种我可以使用的RESTful API ?Java是否有自己的证书验证API?我可以使用开放源代码的第三方JAR或服务吗? 当我
假设我编写了两个Java应用程序:和,它们在两个独立的服务器上部署和运行(部署到和部署到
当我想要在cPanel上安装证书时,我会看到以下错误: 错误证书验证失败! 已执行/usr/bin/openssl verify-capath/var/cpanel/ssl/installed/cabundles: stdin:CN=example.com 0深度查找时错误20:无法获取本地颁发者证书
误差 PHP警告:stream_socket_client():SSL操作失败,代码为1。OpenSSL错误消息:错误:14090086:SSL例程:SSL3_GET_Server_Certifice:证书验证失败