【问题标题】:SSL Certificate Error in a JAVA application on Tomcat7 in UbuntuUbuntu 中 Tomcat7 上的 JAVA 应用程序中的 SSL 证书错误
【发布时间】:2016-11-16 06:34:02
【问题描述】:

我创建了一个 JAVA 应用程序并将其部署在 Ubuntu 16.04 系统中的 Tomcat7 上。应用程序在 https:// 上发出请求,但返回以下错误:

java.io.IOException: javax.net.ssl.SSLPeerUnverifiedException: 对等体未通过身份验证

我已经尝试在系统使用的JRE中安装证书:

tomcat7 3388 1 0 11:07 ? 00:00:11 /usr/lib/jvm/default-java/bin/java

但我仍然遇到同样的错误。

我还在 cacerts.jks 密钥库中安装了证书并尝试使用 java

-Djavax.net.ssl.keyStore=/usr/lib/jvm/default-java/jre/lib/security/cacerts.jks -Djavax.net.ssl.keyStorePassword=changeit

但我仍然收到错误:

java.io.IOException: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:467)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    in.pwc.FormHandler.doPost(FormHandler.java:184)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
    sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:431)
    org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:131)
    org.apache.http.conn.ssl.SSLSocketFactory.verifyHostname(SSLSocketFactory.java:648)
    org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:623)
    org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:115)
    org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:314)
    org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:360)
    org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219)
    org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:177)
    org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:77)
    org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:95)
    org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
    org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
    org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
    in.pwc.test.decrypt(test.java:62)
    org.apache.jsp.viewAdmin_jsp._jspService(viewAdmin_jsp.java:193)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:439)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    in.pwc.FormHandler.doPost(FormHandler.java:184)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

我假设我的 java 和 tomcat 正在使用其他一些证书存储,但我找不到相同的。

我该如何解决这个错误?

更新:我不需要我的应用程序是 https 或使用 SSL,它发出的请求是一个 HTTPS 请求,作为设备的要求,它必须是经过验证的请求。

【问题讨论】:

    标签: java ubuntu tomcat ssl


    【解决方案1】:

    如另一篇帖子中的answer所示:

    如果服务器的证书是自签名的,那么这就是 设计,您必须将服务器的证书导入 你的密钥库。

    假设服务器证书由知名 CA 签署,这是 发生是因为现代可用的 CA 证书集 浏览器比附带的有限集大得多 JDK/JRE。

    您必须将正确的根 CA 导入您的密钥库以验证 证书。你无法用股票解决这个问题是有原因的 SSL 代码,这是为了防止您编写行为 好像它们是安全的但不是。

    这将解决您的问题,但如果您只想要一个本地解决方案(这在生产中没有用),您可以在 post 上找到一些选项。

    希望对你有帮助。

    【讨论】:

    • 如何识别我的 java 应用程序/tomcat 7 正在使用的密钥库?在 Eclipse 中,我可以简单地在 JVM 参数中指定它。我如何在 linux 系统中做同样的事情?
    • 您的密钥库将在您的JAVA_HOME > JRE> lib > security > cacerts 中。您需要检查 JAVA_HOME 的配置位置。另外,您可以在Oracle Documentation找到更多信息。
    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多