java - Tomcat - 双向 SSL 作为服务器

标签 java security tomcat ssl https

我正在尝试在我们正在构建的新网络服务上实现双向 SSL,但我遇到了一些问题。

首先是一些关于环境的信息。

Server version: Apache Tomcat/8.0.36
Server built:   Jun 9 2016 13:55:50 UTC
Server number:  8.0.36.0
OS Name:        Linux
OS Version:     3.10.0-514.el7.x86_64
Architecture:   amd64
JVM Version:    1.8.0_111-b14
JVM Vendor:     Oracle Corporation

我们使用内部证书颁发机构来签署我们所有的证书。所以所有的客户端证书都是由我们的内部根签名的。当我信任客户端信任库中的根证书时,一切正常。由内部根有效签名的所有客户端证书。

但是,如果我从客户端信任库中删除根证书,并改为添加单独的客户端证书,我会收到证书链错误。


*** ECDH ServerKeyExchange
Signature Algorithm SHA512withRSA
Server key: Sun EC public key, 256 bits
  public x coord: 107108750176335210433834926983330116805775068919227166974389735341685270962458
  public y coord: 93195725734236902743006469378087068209149058097948526490562555560744449337507
  parameters: secp256r1 [NIST P-256, X9.62 prime256v1] (1.2.840.10045.3.1.7)
*** CertificateRequest
Cert Types: RSA, DSS, ECDSA
Supported Signature Algorithms: SHA512withECDSA, SHA512withRSA, SHA384withECDSA, SHA384withRSA, SHA256withECDSA, SHA256withRSA, SHA256withDSA, SHA224withECDSA, SHA224withRSA, SHA224withDSA, SHA1withECDSA, SHA1withRSA, SHA1withDSA Cert Authorities:
<CN=Client, OU=Information Technology, O=Company, L=Calgary, ST=Alberta, C=CA>
*** ServerHelloDone
http-nio2-8443-exec-4, WRITE: TLSv1.2 Handshake, length = 4482 http-nio2-8443-exec-2, READ: TLSv1.2 Handshake, length = 7
*** Certificate chain
<Empty>
***
http-nio2-8443-exec-2, fatal error: 42: null cert chain
javax.net.ssl.SSLHandshakeException: null cert chain %% Invalidated:[Session-2, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256]
http-nio2-8443-exec-2, SEND TLSv1.2 ALERT:  fatal, description = bad_certificate http-nio2-8443-exec-2, WRITE: TLSv1.2 Alert, length = 2 http-nio2-8443-exec-2, fatal: engine already closed.  Rethrowing javax.net.ssl.SSLHandshakeException: null cert chain http-nio2-8443-exec-2, called closeOutbound() http-nio2-8443-exec-2, closeOutboundInternal()

这对我们来说是一个问题,因为我们无法让公司中的所有客户端证书都被授予访问此端点的权限,这有点违背了目的。

公司根证书位于服务器启动时使用的另一个信任库中。这是我的配置。

Server.xml 连接器:

   <Connector protocol="org.apache.coyote.http11.Http11Nio2Protocol"
           port="8443" maxThreads="24" minSpareThreads="4" maxSpareThreads="4" acceptCount="1000" server=" "
           scheme="https" secure="true" SSLEnabled="true"
           keystoreFile="certs/servercert.jks" keystorePass=" CrazyPasswordHere"
           clientAuth="true" truststoreFile="/usr/local/tomcat/certs/clienttrust.jks" truststorePass="CrazyPasswordHere"
           sslEnabledProtocols="TLSv1.2" sslProtocol="TLS"
           ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
           TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_CBC_SHA"
           useServerCipherSuitesOrder="true" compression="on" compressionMinSize="2048"
           compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript" />

系统初始化:

# Systemd unit file for tomcat
[Unit]
Description=Apache Tomcat
After=syslog.target network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/lib/jvm/jre
Environment=CATALINA_PID=/usr/local/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/usr/local/tomcat
Environment=CATALINA_BASE=/usr/local/tomcat
Environment='CATALINA_OPTS= -Xms2048M -Xmx2048M -server -XX:+UseParallelGC \ -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=8090 \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=true \ -Dcom.sun.management.jmxremote.password.file=/usr/local/tomcat/conf/jmxremote.password \ -Dcom.sun.management.jmxremote.access.file=/usr/local/tomcat/conf/jmxremote.access \ -Djavax.net.debug=SSL \ -Djavax.net.ssl.trustStore=/usr/local/tomcat/certs/servertrust.jks \ -Djavax.net.ssl.trustStorePassword=CrazyPasswordHere \ -Djavax.net.ssl.keyStore=/usr/local/tomcat/certs/serverclient.jks \ -Djavax.net.ssl.keyStorePassword=CrazyPasswordHere '
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/bin/kill -15 $MAINPID

User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

这里的任何输入都会很棒!我无法想象这里的解决方案是由特定机构签署的每个客户端证书都应该具有访问权限......

谢谢!

最佳答案

经典。您将身份验证与授权混为一谈。 SSL 的工作是通过您已经设置的机制进行身份验证,正如您所说,它运行良好。 Tomcat 或应用程序的工作是使用该信息来定义谁有权使用该 Web 应用程序。这是通过 web.xml、CMA 等完成的。

关于java - Tomcat - 双向 SSL 作为服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40596955/

相关文章:

java - 这个 Java 项目是如何使用语言保留字作为标识符的?

java - Runnable 中的 run() 方法不起作用

postgresql - 为什么 PostgreSQL 默认将用户密码存储在 MD5 哈希中不是安全漏洞?

apache - 编译 apache APR 时出错,找不到生成文件

Tomcat 7 管理器 - 禁用 "undeploy button"

tomcat - No suitable driver found for jdbc error in Tomcat 找不到合适的驱动程序

java - 生成用于在 Java 中配置对象属性的可视化界面

java - 我应该使用哪个类来收集和存储不同的数据类型?

c++ - UAC 提示提升 - 它是如何工作的?

java - 如何在小程序中使用 Rhino javascript 引擎