我使用Java消费某网站一个Restful API时,遇到这个错误:
21:31:16.383 [main] DEBUG org.springframework.web.client.RestTemplate - Created GET request for "https://127.0.0.1:5031/commerce/product"
21:31:16.388 [main] DEBUG org.springframework.web.client.RestTemplate - Setting request Accept header to [text/plain, application/json, application/*+json, /]
Exception in thread "main" org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://127.0.0.1:5031/commerce/product": java.security.cert.CertificateException: No subject alternative names present; nested exception is javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:673)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:620)
at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:319)
at com.sap.prolikeService.service.impl.CommerceProductService.getProductDetailByID(CommerceProductService.java:23)
at com.sap.prolikeService.sandbox.SandboxTest.getProductDetailTest(SandboxTest.java:45)
at com.sap.prolikeService.sandbox.SandboxTest.main(SandboxTest.java:49)
Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1506)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:914)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)
at org.springframework.http.client.SimpleBufferingClientHttpRequest.executeInternal(SimpleBufferingClientHttpRequest.java:78)
at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:659)
... 5 more
Caused by: java.security.cert.CertificateException: No subject alternative names present
at sun.security.util.HostnameChecker.matchIP(HostnameChecker.java:144)
at sun.security.util.HostnameChecker.match(HostnameChecker.java:93)
at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:455)
at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:436)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:200)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1488)
... 19 more
错误的核心就一句:No subject alternative names present
解决方案:重新生成证书,将缺失的IP地址包含在证书的extension部分即可。命令行如下:
keytool -genkey -alias tomcat2 -keyalg RSA -keystore ./jerry2.keystore -ext SAN=dns:test.abc.com,ip:127.0.0.1
证书生成后,在Subject Alternative names区域能看到IP地址:
之后原始的错误就消失了:
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
相关推荐
总之,解决"java.security.cert.CertificateException: No subject alternative DNS name matching XXX found"的关键在于确保服务器证书的主题备用名称与你试图连接的域名匹配,或者在必要时安全地绕过验证。...
oracle jdk1.8.0-181 的安全证书
我们可以创建一个信任所有证书的TrustManager,如下所示: ```java import javax.net.ssl.X509TrustManager; import java.security.cert.X509Certificate; public class NoopTrustManager implements X509...
2. **创建目录**:在D盘创建一个名为`keys`的文件夹用于存放生成的证书文件。 3. **了解基本概念**:对SSL证书及其工作原理有初步的认识。 #### 三、生成自签名证书 本节将详细介绍如何使用`keytool`命令为服务器...
标题提到的“当前页面脚本错误”通常是一个与网页交互有关的问题,但在这个场景下,因为我们在讨论的是离线安装程序(`jdk-8u281-windows-x64.exe`),这个问题可能是由于安装程序内部的脚本错误导致的。让我们详细...
jdk导入https安全证书,保证java能下载https文件
这个时候又不想让jdk信任所有请求,那就只能给jdk安装目标地址的证书让jdk信任目标地址,但是正常的通过命令提示符安装证书非常麻烦,所以就做了这个工具,只要选择jdk目录和要安装的证书,就能轻松给jdk安装证书了
解决在windows 同时安装两个版本jdk办法, 解决在windows 同时安装两个版本jdk办法,
Java安全包是Java开发工具集(JDK)中的一个重要组成部分,它主要负责提供一套机制来保护Java应用程序和Java虚拟机(JVM)免受恶意代码的攻击。在JDK 1.8版本中,安全包尤其关键,因为它包含了用于安全管理、加密、...
本文将详细介绍一个特定问题:当修改了Java项目的名称后,在布署到Tomcat时出现错误以及提示“Tomcat JDK name”错误。我们将从问题背景、解决方案、注意事项等多个方面进行详细阐述。 #### 问题背景 在对Java项目...
在IT行业中,Java是广泛应用的编程语言,而IBM JDK是IBM公司提供的Java开发工具包,它是Oracle JDK的一个重要变体,具有特定的优化和特性,特别是在大型企业级应用中。本话题聚焦于IBM JDK 1.8版本中的安全证书和jar...
org.springframework.core.JdkVersion 于是找到一个spring-core-3.x.RELEASE.jar,用其中的JdkVersion这个类替换spring-2.5.5.jar对应class,问题解决! 注意:别用spring-core-4.x.RELEASE.jar,JdkVersion....
JDK1.8是Oracle公司发布的Java平台标准版的一个重要版本,引入了许多新特性,如Lambda表达式、Stream API以及方法引用等,极大地提高了代码的简洁性和可读性。 然而,有时在安装或配置JDK1.8时,可能会遇到脚本错误...
eclipse更新maven,jdk改变解决办法 eclipse更新maven时,项目原本设定的jdk版本发生改变,这是由于maven的编译器插件的默认设置所致。编译器插件用来编译项目的源文件,从3.0版本开始,默认编译器是javax.tools....
于是找到一个spring-core-3.x.RELEASE.jar,用其中的JdkVersion这个类替换spring-2.5.5.jar对应class,问题解决! 注意:别用spring-core-4.x.RELEASE.jar,JdkVersion.isAtLeastJava15()方法已经没有了!
IBM JDK是一个由IBM提供的Java实现,它有自己的安全策略,可能会与Oracle JDK有所不同。 在"ibm jdk策略文件,解决加解密限制"这个主题中,我们关注的是IBM JDK 5.0版本中的加密限制问题。默认情况下,IBM JDK可能...
JDK 8 U202 是 JDK 8 的一个更新版本.JDK 8 U202 是一个性能优越、安全性强、兼容性好的 Java 开发工具。它为开发者提供了更高效、便捷的开发方式,同时确保了 Java 应用程序的稳定性和可靠性。 资源包括window版和...
JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11...
**UnlimitedJCEPolicyJDK8** 是Oracle JDK的一个扩展,它允许在Java环境中使用不受限制的加密强度。在默认情况下,JDK会对加密算法的密钥长度有所限制,这在处理高安全需求的应用如微信支付时可能不够。这个jar包包...
4. **Optional类**:为了解决空指针异常(NullPointerException),JDK 1.8引入了`Optional`类,它是一个容器对象,可以包含非null值。如果值存在则`isPresent()`返回true,调用`get()`会返回该对象。 5. **Date和...