自签名证书中的问题

时间:2014-05-08 12:00:50

标签: ssl https axis

我现在正尝试通过https访问网络服务并实现此目的,我已完成以下操作。

我使用以下命令生成自签名证书并放在/ conf目录中。

keytool -genkey -alias localhost -keyalg RSA -validity 365 –keystore server.keystore –storetype JKS
keytool -export -alias localhost –keystore server.keystore -rfc -file public.cert
keytool -import -alias localhost -file public.cert –storetype JKS -keystore server.truststore 

以下是server.xml条目

<Connector className="org.apache.catalina.connector.http.HttpConnector"
               port="8443" minProcessors="5" maxProcessors="75"
               enableLookups="true"
           acceptCount="10" debug="0" scheme="https" secure="true">
      <Factory className="org.apache.catalina.net.SSLServerSocketFactory"
               keystoreFile="conf/server.keystore"
               keystorePass="changeit"
               truststoreFile="conf/server.truststore"
           truststoreType="JKS" truststorePass="changeit"
               clientAuth="false" protocol="TLS"/>
</Connector>

现在我面临以下错误。

{http://xml.apache.org/axis/}stackTrace: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found

但是,如果我在访问webservice的类文件中添加以下代码,则不会引发错误。

AxisProperties.setProperty("axis.socketSecureFactory","org.apache.axis.components.net.SunFakeTrustSocketFactory");

你能指导我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

以下条目添加到类文件中,其中将调用https,它就像魅力一样。但我不确定为什么不考虑xml条目。

System.setProperty("javax.net.ssl.keyStore", "path\\to\\server.keystore");
System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
System.setProperty("javax.net.ssl.trustStore", "path\\to\\server.truststore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); 

PS:需要xml条目和类条目,否则抛出相同的错误。我还没有对此有清晰的了解。也许有人可能会解释。感谢

答案 1 :(得分:0)

TLS正在双方建立:服务器和客户端。每一方都必须将自己的密钥对保存到密钥库中。我们称他们为serverKeystore.jksclientKeystore.jks 然后创建仅包含公钥的附加密钥库。这个称为信任存储,用于密钥验证。让我们按照相同的方案将其保存到serverTruststore.jksclientTruststore.jks

在某种程度上,仅对TLS服务器密钥进行身份验证。

  • 服务器必须仅在serverKeystore.jks中配置Connector
  • 客户必须同时配置clientKeystore.jksserverTruststore.jks

在双向TLS中,服务器和客户端密钥都经过身份验证。

  • 服务器必须在serverKeystore.jks中配置clientTruststore.jksConnector
  • 客户必须同时配置clientKeystore.jksserverTruststore.jks

客户端通过使用

指定Java环境变量来注册密钥存储区
-Djavax.net.ssl.keyStore="path\\to\\server.keystore"

用于命令启动JVM的参数,或者用

代码编程
System.setProperty("javax.net.ssl.keyStore", "path\\to\\server.keystore");

从技术上讲,可以像在客户端和服务器端一样使用相同的密钥对。但这会破坏私钥,因为它不再是秘密。