服务器Tomcat中的客户端身份验证

时间:2016-12-29 17:40:06

标签: java tomcat authentication ssl

我想为相互身份验证配置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))。

  1. 怎么了?
  2. 我在哪里将client.jks和clienttruststore.jks放在我的项目中?
  3. 此图显示问题:

    Snapshot of Chrome Page Showing Broken HTTPS

1 个答案:

答案 0 :(得分:1)

  1. 您的证书是自签名的,这意味着它们未经过CA签名,这意味着除非您手动批准Chrome,否则Chrome无法信任它们。

  2. 生成证书时,您提供CN吗?它必须与您正在使用的主机名匹配(在您的情况下是本地主机),如果CN不匹配,Chrome将不允许SSL,除非您手动批准它。

  3. 你说你想要相互认证,但你配置了clientAuth="false"它应该是真的。对于密钥库,您应该为证书使用相同的密钥库,因此当客户端使用它的证书连接时,tomcat将验证相应的证书是否位于密钥库中。

  4. 希望它有所帮助。