我想为相互身份验证配置SSL。
我使用eclipse + tomcat 8。
我做了这段话:
我以这种方式创建了私钥:
openssl genrsa -des3 -out client_key.pem 2048
openssl genrsa -des3 -out server_key.pem 2048
我创建了自签名证书:
openssl req -new -x509 -key client_key.pem -out client.pem -days 365 -config <path to>\openssl.cnf
openssl req -new -x509 -key server_key.pem -out server.pem -days 365 -config <path to>\openssl.cnf
我创建了信任库并导入证书:
keytool –importcert -trustcacerts –keystore clienttruststore.jks –storetype jks –storepass <truststore_password> -file <path-to-file>\server.pem
keytool –importcert -trustcacerts –keystore servertruststore.jks –storetype jks –storepass <server_truststore_password> -file <path-to-file>\client.pem
我分别为服务器和客户端组合了证书和私钥:
openssl pkcs12 –export –inkey client_key.pem –in client.pem –out client.p12
openssl pkcs12 –export –inkey server_key.pem –in server.pem –out server.p12
最后我以pkcs12格式转换了密钥库:
keytool –importkeystore –srckeystore client.p12 –srcstoretype pkcs12 –destkeystore client.jks –deststoretype jks
keytool –importkeystore –srckeystore server.p12 –srcstoretype pkcs12 –destkeystore server.jks –deststoretype jks
在此之后,我在Tomcat上配置了配置SSL / TLS支持。因此,我在Servers文件夹中配置了server.xml并以这种方式设置连接器:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="path\to\server.jks" keystorePass="*******" keystoreType="JKS"
truststoreFile="path\to\servertruststore.jks" truststorePass="********" truststoreType="JKS" />
最后,我清理并构建项目。
我在Eclipse中创建了一个名为“myproject”的动态Web项目。它运作良好。
问题是当myproject在URL https://localhost:8443/myproject
的服务器上运行时
Google Chrome显示红色三角形(此页面不安全(已损坏的HTTPS))。
答案 0 :(得分:1)
您的证书是自签名的,这意味着它们未经过CA签名,这意味着除非您手动批准Chrome,否则Chrome无法信任它们。
生成证书时,您提供CN吗?它必须与您正在使用的主机名匹配(在您的情况下是本地主机),如果CN不匹配,Chrome将不允许SSL,除非您手动批准它。
你说你想要相互认证,但你配置了clientAuth="false"
它应该是真的。对于密钥库,您应该为证书使用相同的密钥库,因此当客户端使用它的证书连接时,tomcat将验证相应的证书是否位于密钥库中。
希望它有所帮助。