我现在正尝试通过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");
你能指导我解决这个问题吗?
答案 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.jks
和clientKeystore.jks
然后创建仅包含公钥的附加密钥库。这个称为信任存储,用于密钥验证。让我们按照相同的方案将其保存到serverTruststore.jks
和clientTruststore.jks
。
在某种程度上,仅对TLS服务器密钥进行身份验证。
serverKeystore.jks
中配置Connector
。clientKeystore.jks
和serverTruststore.jks
。在双向TLS中,服务器和客户端密钥都经过身份验证。
serverKeystore.jks
中配置clientTruststore.jks
和Connector
。clientKeystore.jks
和serverTruststore.jks
。客户端通过使用
指定Java环境变量来注册密钥存储区-Djavax.net.ssl.keyStore="path\\to\\server.keystore"
用于命令启动JVM的参数,或者用
代码编程System.setProperty("javax.net.ssl.keyStore", "path\\to\\server.keystore");
从技术上讲,可以像在客户端和服务器端一样使用相同的密钥对。但这会破坏私钥,因为它不再是秘密。