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

标签 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

最后我将 keystore 转换为 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 放在项目的什么位置?

这张图显示了问题:

Snapshot of Chrome Page Showing Broken HTTPS

最佳答案

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

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

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

希望对您有所帮助。

关于java - 服务器 Tomcat 中的客户端身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41384650/

相关文章:

java - 使用 Dagger 2 进行方法注入(inject)

java - java 中使用 hashmap 的替代 for 循环

apache - CentOS 上 Apache SSL 代理背后的 Jira

authentication - jmeter + influxdb后端: howto specify user name and password?

php - 选择文本框时如何更改div的css属性

java - Intellij 项目某些文件在编译时未更新

spring - 无法访问 Tomcat 上已部署的 WAR 文件

java - 跨越tomcat和django

javascript - 无法使用 Internet Explorer 11 登录 Firebase

java - RabbitMQ 获取消息 发送确认