我现在正尝试通过 https 访问 Web 服务,为了实现这一点,我已经完成了以下操作。
我使用以下命令生成自签名证书并放置在/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
但是,如果我在访问 web 服务的类文件中添加以下代码,则不会抛出错误。
AxisProperties.setProperty("axis.socketSecureFactory","org.apache.axis.components.net.SunFakeTrustSocketFactory");
你能指导我解决这个问题吗?
最佳答案
TLS 正在两个方面建立:服务器和客户端。每一方都必须将自己的 key 对保存到 keystore 中。我们称它们为 serverKeystore.jks
和 clientKeystore.jks
然后将创建仅包含公钥的附加 keystore 。这个称为信任库,用于 key 身份验证。让我们按照相同的方案将它们保存到 serverTruststore.jks
和 clientTruststore.jks
中。
以一种方式仅对 TLS 服务器 key 进行身份验证。
- 服务器必须只有
serverKeystore.jks
在Connector
中提供。 - 客户端必须配置了
clientKeystore.jks
和serverTruststore.jks
。
通过两种方式 TLS 对服务器和客户端 key 进行身份验证。
- 服务器必须在
Connector
中提供serverKeystore.jks
和clientTruststore.jks
。 - 客户端必须配置了
clientKeystore.jks
和serverTruststore.jks
。
客户端通过指定 Java 环境变量来注册 key 存储
-Djavax.net.ssl.keyStore="path\\to\\server.keystore"
在命令启动 JVM 的参数中,或以编程方式在代码中使用
System.setProperty("javax.net.ssl.keyStore", "path\\to\\server.keystore");
从技术上讲,可以像您一样在客户端和服务器端使用相同的 key 对。但这会危及私钥,因为它不再是 secret 。
关于ssl - 签发自签名证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23541130/