Tomcat 8 中的 SSL:服务器和客户端 JKS + 客户端公共证书

Posted

技术标签:

【中文标题】Tomcat 8 中的 SSL:服务器和客户端 JKS + 客户端公共证书【英文标题】:SSL in Tomcat 8: server & client JKS + client public cer 【发布时间】:2015-07-27 04:54:14 【问题描述】:

我已按照本指南设置我的带有 SSL 层的 Tomcat 8 实例,生成客户端和服务器密钥库以及自动签名的公共客户端证书。

问题是,我想,我真的不知道如何配置 Tomcat 的连接器...

这是我当前的 server.xml 文件(删除了不必要的 cmets):

    <?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener"/>

  <Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/>
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>

  <GlobalNamingResources>

    <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
  </GlobalNamingResources>

  <Service name="Catalina">

    <Connector connectionTimeout="40000" port="9090" protocol="HTTP/1.1" redirectPort="8443"/>

    <!-- I've also tried using these ones: -->
    <!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" /> -->
    <!--<Connector  clientAuth="true" port="8443" minSpareThreads="5"
                enableLookups="true" disableUploadTimeout="true"
                acceptCount="100" maxThreads="200"
                scheme="https" secure="true" SSLEnabled="true"
                keystoreFile="C:\Program Files\Apache Software Foundation\Tomcat 8.0\keys/server.jks" keystoreType="JKS" keystorePass="triple1327"
                truststoreFile="C:\Program Files\Apache Software Foundation\Tomcat 8.0\keys/server.jks" truststoreType="JKS" truststorePass="triple1327"
                sslProtocol="TLS" />-->

                <!-- Don't work on tomcat8:
                maxSpareThreads="75"
                SSLVerifyClient="require"
                SSLEngine="on"
                SSLVerifyDepth="2"
                -->

        <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
        maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
        clientAuth="true" sslProtocol="TLS" 
        keystoreFile="C:\Program Files\Apache Software Foundation\Tomcat 8.0\keys\server.jks" keystoreType="JKS" keystorePass="triple1327"
        truststoreFile="C:\Program Files\Apache Software Foundation\Tomcat 8.0\keys\server.jks" truststoreType="JKS" truststorePass="triple1327"
                />

        <!-- Define an AJP 1.3 Connector on port 8009 -->
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"  />   

    <Engine defaultHost="localhost" name="Catalina">

        <Realm className="org.apache.catalina.realm.LockOutRealm">

        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
    </Realm>

    <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt"/>
        <Context path="/rutas" docBase="C:\Users\IN006\cavwebapp" reloadable="true" crossContext="false">
        </Context>
    </Host>

    </Engine>
  </Service>
</Server>

使用这个,我尝试访问 tomcat 欢迎页面:

本地主机:8443 https://localhost https://localhost:8443

但它们都不起作用......

有什么建议吗?

谢谢!

编辑

解决方案:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
       maxThreads="150" scheme="https" secure="true"
       clientAuth="false" sslProtocol="TLS" 
       keystoreFile="/etc/tomcat7/server.jks"
       keystorePass="changeit" />

我可以通过https://localhost:8443访问它

【问题讨论】:

【参考方案1】:

您的问题缺少重要的细节,例如 tomcat 的日志和密钥库的结构。例如,放置在密钥库中的密钥本身可以受到密码保护。您要使用的端口可能已经被占用,等等等等。有很多事情可能会出错。

一般来说,我可以建议您尽量保持简单。 试试这个 sn-p:

<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS" 
           keystoreFile="/etc/tomcat7/server.jks"
           keystorePass="changeit" />

【讨论】:

我怎样才能告诉你密钥库的结构?它受一个密码保护。我可以向您保证,指定的端口没有被占用。我的 tomcat 日志没有警告我任何事情......无论如何,你是指哪个日志? 我已经使用端口 8443 而不是 443 解决了它。在 chrome 中,我必须在访问 localhost:8443 时添加一个异常

以上是关于Tomcat 8 中的 SSL:服务器和客户端 JKS + 客户端公共证书的主要内容,如果未能解决你的问题,请参考以下文章

tomcat配置SSL双向认证

Tomcat 服务器/客户端自签名 SSL 证书

带有客户端身份验证的 Apache HTTPD/mod_proxy/Tomcat 和 SSL

Apache 背后的 Tomcat:将 SSL 与 j_security_check 结合使用

Tomcat 8.0.x Websockets、SSL 和 Windows --> 最后一帧延迟

如何在 Spring Boot 嵌入式 tomcat 中设置 HTTPS SSL 密码套件首选项