360SDN.COM

首页/Tomcat/列表

tomcat的SSL/TLS 配置

来源:  2018-07-25 16:26:03    评论:0点击:

Quick Start

下列说明将使用变量名 $CATALINA_BASE 来表示多数相对路径所基于的基本目录。如果没有为 Tomcat 多个实例设置 CATALINA_BASE 目录,则 $CATALINA_BASE 就会设定为 $CATALINA_HOME 的值,也就是你安装 Tomcat 的目录。

在 Tomcat 中安装并配置 SSL/TLS 支持,只需遵循下列几步即可。详细信息可参看文档后续介绍。

  1. 创建一个 keystore 文件保存服务器的私有密钥和自签名证书:
    Windows:
    "%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA
    UNIX:
    $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA

    指定密码为“changeit”。

  2. 取消对 $CATALINA_BASE/conf/server.xml 中 “SSL HTTP/1.1 Connector” 一项的注释状态。按照下文中配置一节所描述的方式进行修改。

SSL/TLS 简介

安全传输层协议(TLS)与其前辈加密套接字(SSL)都是用于保证 Web 浏览器与 Web 服务器通过安全连接进行通信的技术。利用这些技术,我们所要传送的数据会在一端进行加密,传输到另一端后再进行解密(在处理数据之前)。这是一种双向的操作,服务器和浏览器都能在发送数据前对它们进行加密处理。

SSL/TLS 协议的另一个重要方面是认证。当我们初始通过安全连接与 Web 服务器进行通信时,服务器将提供给 Web 浏览器一组“证书”形式的凭证,用来证明站点的归属方以及站点的具体声明。某些情况下,服务器也会请求浏览器出示证书,来证明作为操作者的“你”所宣称的身份是否属实。这种证书叫做“客户端证书”,但事实上它更多地用于 B2B(企业对企业电子商务)的交易中,而并非针对个人用户。大多数启用了 SSL 协议的 Web 服务器都不需要客户端认证。

SSL/TLS 与 Tomcat

一定要注意的是,通常只有当 Tomcat 是独立运行的 Web 服务器时,才有必要去配置 Tomcat 以便利用加密套接字。具体细节可参看 OpenSSL 文档的相关内容。

下面这个实例展示的是如何利用终端命令行,从零开始创建一个新的 JKS 密码存储库,该密码库包含一个自签名的证书。

Windows:

"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA

Unix:

$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA

(RSA 算法应该作为首选的安全算法,这同样也能保证与其他服务器和组件的大体的兼容性。)

该命令将在用户的主目录下创建一个新文件:.keystore。要想指定一个不同的位置或文件名,可以在上述的 keytool命令上添加 -keystore 参数,后跟到达 keystore 文件的完整路径名。你还需要把这个新位置指定到 server.xml 配置文件上,见后文介绍。例如:

Windows:

"%JAVA_HOME%\bin\keytool" -genkey -alias tomcat -keyalg RSA
  -keystore \path\to\my\keystore

Unix:

$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA  
  -keystore /path/to/my/keystore     

执行该命令后,首先会提示你提供 keystore 的密码。Tomcat 默认使用的密码是 changeit(全部字母都小写),当然你可以指定一个自定义密码(如果你愿意)。同样,你也需要将这个自定义密码在 server.xml 配置文件内进行指定,稍后再予以详述。

接下来会提示关于证书的一般信息,比如组织、联系人名称,等等。当用户试图在你的应用中访问一个安全页面时,该信息会显示给用户,所以一定要确保所提供的信息与用户所期望看到的内容保持一致。

最后,还需要输入密钥密码(key password),这个密码是这一证书(而不是存储在同一密码存储库文件中的其他证书)的专有密码。keytool 提示会告诉你,如果按下回车键,则自动使用密码存储库 keystore 的密码。当然,除了这个密码,你也可以自定义自己的密码。如果选择自定义密码,那么不要忘了在 server.xml 配置文件中指定这一密码。

如果操作全部正常,我们现在就会得到一个服务器能使用的有证书的密码存储库文件。

 编辑 Tomcat 配置文件

Tomcat 能够使用两种 SSL 实现:

  • JSSE 实现,它是Java 运行时(从 1.4 版本起)的一部分。
  • APR 实现,默认使用 OpenSSL 引擎。

详细的配置信息依赖于所用的实现方式。如果通过指定通用的 protocol="HTTP/1.1" 来配置连接起,那么就会自动选择 Tomcat 所要用到的实现方式。如果安装使用的是 APR(比如你安装了 Tomcat 的原生库),那么它将使用 APR 的 SSL 实现,否则就将使用 Java 所提供的 JSSE 实现。

由于这两种 SSL 实现在 SSL 支持的配置属性上有很大差异,所以强烈建议不要自动选择实现方式。选择实现应该采取这种方式:在HTTP 连接器配置参考文档中的 SSL 支持部分。一定要确保对所使用的连接器采用正确的属性。BIO、NIO 以及 NIO2 连接器都使用 JSSE,然而APR以及原生的连接器则使用 APR。

port属性指的是 Tomcat 用以侦听安全连接的 TCP/IP 端口号。你可以随意改变它,比如改成 https 的默认端口号 443。但是在很多操作系统中,在低于 1024 的端口上运行 Tomcat 必须进行一番特殊的配置,限于篇幅,本文档不再赘述。

如果在这里,你更改了端口号,那么也应该在 非 SSL 连接器的 redirectPort 属性值。从而使 Tomcat 能够根据 Servlet 规范,自动对访问带有安全限制(指定需要 SSL)页面的用户进行重定向。

配置完全部信息后,你应该像往常一样,重新启动 Tomcat,从而能够利用 SSL 来访问任何 Tomcat 所支持的 Web 应用了。比如:

https://localhost:8443/

你将看到跟往常一样的 Tomcat 主页面(除非你修改了 ROOT 应用)。如果出现问题,这样做没有任何效果,请看下面的故障排除小节。

从 CA 处安装证书

如果想从 CA(比如 verisign.com、thawte.com、trustcenter.de)处获取并安装证书,请阅读之前的内容,然后按照下列操作进行:

创建一个本地证书签名请求(CSR)

为了从选择的 CA 处获取证书,必须创建一个证书签名请求(CSR)。CA 通过 CSR 来创建出一个证书,用来证明你的网站是“安全的”。创建 CSR 的步骤如下:

  • 创建一个本地自签名证书(如前文所述):
    keytool -genkey -alias tomcat -keyalg RSA
    -keystore <your_keystore_filename>
注意:在某些情况下,为了创建一个能耐生效的证书,你必须在“first- and lastname”字段中输入网站的域名(比如:`www.myside.org`)。
  • 然后利用下列代码创建 CSR:
    keytool -certreq -keyalg RSA -alias tomcat -file certreq.csr
    -keystore <your_keystore_filename>

现在,我们得到了一个 certreq.csr 的文件,可以把它提交给 CA 了(CA 的网站上应有关于如何提交的文档),审核通过后就会收到一个证书。

导入证书

接下来可以把证书导入到本地密钥存储库中。首先你需要把链证书(Chain Certificate)或根证书(Root Certificate)导入到密钥存储库中。然后继续导入证书。

    keytool -import -alias root -keystore <your_keystore_filename>
    -trustcacerts -file <filename_of_the_chain_certificate>
  • 最后导入你的新证书:
    keytool -import -alias tomcat -keystore <your_keystore_filename>
    -file <your_certificate_filename>

疑难排解

以下列出了一些在设置 SSL 通信时经常会遇到的问题及其解决方法:

  • 当 Tomcat 启动时,出现这样的异常信息:“ava.io.FileNotFoundException: {some-directory}/{some-file} not found.”

    这很有可能是因为 Tomcat 无法在指定位置处找到密钥存储库。默认情况下,密钥存储库文件应以 .keystore 为后缀,位于用户的 home 目录下(也许很你的设置不同)。如果密钥存储库文件在别处,则需要在 Tomcat 配置文件的 <Factory> 元素中添加一个 keystoreFile 属性。

  • 当 Tomcat 启动时,出现这样的异常信息:“java.io.FileNotFoundException: Keystore was tampered with, or password was incorrect.”

    假如排除了有人恶意篡改密钥存储库文件的因素,那么出现这样的异常,最有可能是因为 Tomcat 现在所用的密码不同于你当初创建密钥存储库文件时所用密码。为了解决这个问题,你可以重新创建密钥存储库文件,或者在 Tomcat 配置文件的 <Connector> 元素中添加或更新一个 keystoreFile 属性。注意:密码都是区分大小写的。

  • 当 Tomcat 启动时,出现这样的异常:“java.net.SocketException: SSL handshake error javax.net.ssl.SSLException: No available certificate or key corresponds to the SSL cipher suites which are enabled.”

    出现这样的异常,很有可能是因为 Tomcat 无法在指定的密钥存储库中找到服务器密钥的别名。查看一下 Tomcat 配置文件的 <Connector> 元素中所指定的 keystoreFile 和 keyAlias 值是否正确。注意keyAlias 值可能区分大小写。

如果出现了其他问题,可以求助 TOMCAT-USER 邮件列表,你可以在该邮件列表内找到之前消息的归档文件,以及订阅和取消订阅的相关信息。Tomcat 邮件列表的链接是:http://tomcat.apache.org/lists.html

在应用中使用 SSL 跟踪会话

这是一个 Servlet 3.0 规范中的新功能。由于它将 SSL 会话 ID 关联到物理的客户端服务器连接上,所以导致了一些约束与局限:

  • Tomcat 必须有一个属性 isSecure 设为 true 的连接器。
  • 如果 SSL 连接器通过代理或硬件加速器来管理,则它们必须填充 SSL 请求报头(参见 Bugzilla

    为了终止 SSL 会话,可以使用:

    // Standard HTTP session invalidation
    session.invalidate();
    
    // Invalidate the SSL Session
    org.apache.tomcat.util.net.SSLSessionManager mgr =
        (org.apache.tomcat.util.net.SSLSessionManager)
        request.getAttribute("javax.servlet.request.ssl_session_mgr");
    mgr.invalidateSession();
    
    // Close the connection since the SSL session will be active until the connection
    // is closed
    response.setHeader("Connection", "close");

    注意:由于使用了 SSLSessionManager 类,所以这段代码是专门针对 Tomcat 的。当前只适用于 BIO、NIO 以及 NIO2 连接器,不适合 APR/原生连接器。


    来源:http://wiki.jikexueyuan.com/project/tomcat/ssl-tls.html

为您推荐

友情链接 |九搜汽车网 |手机ok生活信息网|ok生活信息网|ok微生活
 Powered by www.360SDN.COM   京ICP备11022651号-4 © 2012-2016 版权