SSLHandshakeException-使用自签名证书从网络应用程序调用网络服务

时间:2019-02-06 20:59:38

标签: java web-services ssl axis2

我的Web应用程序和Web服务在同一个tomcat容器中运行。如果我不使用HTTPS,则一切正常。
当我同时在HTTPS上运行Web应用程序和Web服务时,当Web应用程序尝试调用Web服务时,我会收到SSLHandshakeException。

案例1

我使用以下命令创建了本地自签名证书文件

%JAVA_HOME%\bin\keytool -genkeypair -alias test1 -keyalg RSA -keystore c:/apps/test1.crt

已在文件夹test1.crt中创建了一个名为C:\apps的证书文件。

现在,我想使用下面的命令

将此证书导入Java密钥库中:
%JAVA_HOME%\bin\keytool -import -alias test1 -file c:/apps/test1.crt-keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

我遇到错误-

  

关键工具错误:java.lang.Exception:该条目不是X.509证书

当我在Tomcat中使用此证书文件时,请进行以下设置

<Connector port="8443"
    maxHttpHeaderSize="8192"
    maxThreads="150"
    minSpareThreads="25"
    maxSpareThreads="75"
    enableLookups="false"
    disableUploadTimeout="true"
    acceptCount="100"
    scheme="https"
    secure="true"
    clientAuth="false"
    sslProtocol="TLS"
    SSLEnabled="true"
    URIEncoding="UTF-8" 
    keystorePass="changeit" 
    keystoreFile="C:/apps/test2.crt" />

服务器启动时没有出现任何错误。当我从应用程序调用网络服务时,我得到SSLHandshakeException

案例2

我已使用以下命令在Java密钥库中添加了本地自签名证书

%JAVA_HOME%/bin/keytool -genkeypair -alias test2 -keyalg RSA -validity 1000 -keysize 2048 -keystore %JAVA_HOME%/jre/lib/security/cacerts

已添加证书,我已通过以下命令验证了该证书

JAVA_HOME%\bin\keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

现在,我已经使用下面的命令

从Java密钥库中导出了证书文件:
%JAVA_HOME%/bin/keytool -export -alias test2 -keystore %JAVA_HOME%/jre/lib/security/cacerts -rfc -file C:/apps/test2.crt

已在文件夹test2.crt中创建了一个名为C:\apps的证书文件。

当我在Tomcat中使用此证书文件时,请进行以下设置

<Connector port="8443"
    maxHttpHeaderSize="8192"
    maxThreads="150"
    minSpareThreads="25"
    maxSpareThreads="75"
    enableLookups="false"
    disableUploadTimeout="true"
    acceptCount="100"
    scheme="https"
    secure="true"
    clientAuth="false"
    sslProtocol="TLS"
    SSLEnabled="true"
    URIEncoding="UTF-8" 
    keystorePass="changeit" 
    keystoreFile="C:/apps/test2.crt" />

我收到以下错误

  

at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:491)
  引起原因:java.lang.IllegalArgumentException:无效的密钥库格式
      在org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:114)
      在org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:85)
      在org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:224)
      在org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1044)
      在org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:540)
      在org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:74)
      在org.apache.catalina.connector.Connector.initInternal(Connector.java:932)
      ...还有13

     

由以下原因引起:java.io.IOException:无效的密钥库格式
      在sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:663)
      在sun.security.provider.JavaKeyStore $ JKS.engineLoad(JavaKeyStore.java:56)
      在sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224)
      在sun.security.provider.JavaKeyStore $ DualFormatJKS.engineLoad(JavaKeyStore.java:70)
      在java.security.KeyStore.load(KeyStore.java:1445)
      在org.apache.tomcat.util.net.SSLUtilBase.getStore(SSLUtilBase.java:160)

尽管服务器已启动,但我可以使用我的应用程序。但是当我尝试调用Web服务时,我得到了

这是SSLHandshakeException的日志

  

嵌套的异常是:
          javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到到请求目标的有效认证路径

     

错误:(org.apache.axis.AxisFault)-> [;嵌套的异常是:
          javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到指向所请求目标的有效证书路径]

     

AxisFault
   faultCode:{http://schemas.xmlsoap.org/soap/envelope/} Server.userException
   faultSubcode:
   faultString:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求的目标的有效证书路径
   faultActor:
   faultNode:
   faultDetail:
          {http://xml.apache.org/axis/} stackTrace:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到到请求目标< / p>

1 个答案:

答案 0 :(得分:0)

我认为对于Tomcat,keystoreFile是“%JAVA_HOME%/ jre / lib / security / cacerts”,而您不必指出任何密钥库,因为您已在jre通用密钥库中添加了密钥对,但使用起来确实不正确“ C:/apps/test2.crt”。

还尝试将服务器证书添加到信任库文件中:

 JAVA_HOME%\bin\keytool -import -v -trustcacerts -alias test2 -file C:/apps/test2.crt -keystore  %JAVA_HOME%/jre/lib/security/cacerts -keypass changeit -storepass changeit