java - URL.getInputStream() 导致 java.security.cert.CertificateException : No subject alternative DNS name

标签 java https inputstream

我有一些代码可以发送电子邮件并从模板文件中读取内容。

一切正常,直到我使用 HTTPS。在这种情况下会抛出异常:

javax.net.ssl.SSLHandshakeException: 
java.security.cert.CertificateException: No subject alternative DNS name matching lonlinux01 found.
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) [jsse.jar:1.7.0_40]
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884) [jsse.jar:1.7.0_40]
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276) [jsse.jar:1.7.0_40]
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270) [jsse.jar:1.7.0_40]
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1341) [jsse.jar:1.7.0_40]
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153) [jsse.jar:1.7.0_40]
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868) [jsse.jar:1.7.0_40]
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:804) [jsse.jar:1.7.0_40]
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016) [jsse.jar:1.7.0_40]
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) [jsse.jar:1.7.0_40]
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339) [jsse.jar:1.7.0_40]
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323) [jsse.jar:1.7.0_40]
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563) [rt.jar:1.7.0_40]
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) [rt.jar:1.7.0_40]
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1300) [rt.jar:1.7.0_40]
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) [rt.jar:1.7.0_40]
    at com.cerillion.wsc.workers.EmailWorker.getEmailTemplateFile(EmailWorker.java:99) [classes:]
    ...

代码

url = new URL(templateurl);
urlConnection = url.openConnection();

urlConnection.setConnectTimeout(connectionTimeout);
urlConnection.setReadTimeout(connectionTimeout);
BufferedReader breader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));

urlConnection.getInputStream()失败

应用程序的其余部分似乎在 HTTPS 上运行良好。

最佳答案

TLS 客户端在证书中找不到(完全限定)服务器名称。

您似乎正在连接到服务器 lonlinux01,但给定的服务器证书既没有通用名称 lonlinux01,也没有主题备用名称...

因此,请使用完全限定的服务器名称调整您的连接字符串(以匹配证书中的名称),或者要求服务器管理员调整其证书(以匹配完全限定的服务器名称)

关于java - URL.getInputStream() 导致 java.security.cert.CertificateException : No subject alternative DNS name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29917100/

相关文章:

java - 给定InputStream替换字符并产生OutputStream

java - 将 inputStream 从 ZipFile 转换为 String

java - Google 表格 API 错误

java - Eclipse 不粘贴复制的文本 (Java/Mac)

java - apache http 客户端请求重定向

android - SSL 握手中止 - 确切原因是什么?

java - 尝试使用 getResourceAsStream() 并失败

java - 亚马逊网络服务 Java 类路径

java - Int[] 的平均值;方法不返回

python - 如何使用单个 get 请求从 python Flask 中的 REST 服务器返回获得连续响应