Ubuntu中Tomcat7上的JAVA应用程序中的SSL证书错误

时间:2016-11-16 06:34:02

标签: java ubuntu tomcat ssl

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

java.io.IOException:javax.net.ssl.SSLPeerUnverifiedException:peer not authenticated

我尝试在系统使用的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请求,必须是经过验证的请求才能作为设备的要求。

1 个答案:

答案 0 :(得分:0)

如另一篇帖子answer所示:

  

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

     

假设服务器证书由知名CA签名,则为   发生的原因是现有的CA证书集合可用   浏览器远远大于随附的有限集   JDK / JRE。

     

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

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

希望它对你有所帮助。