SSLTLS 配置

HTTPS

HTTPS(也称为 HTTP over TLS,[1] [2] HTTP over SSL,[3]和 HTTP Secure [4] [5])是用于在因特网上广泛使用的计算机网络进行安全通信的协议。HTTPS 由传输层安全性或其前身安全套接字层加密的连接中的超文本传输​​协议(HTTP)通信组成。HTTPS 的主要动机是对访问过的网站进行身份验证,并保护所交换数据的隐私性和完整性。

SSL

什么是 ssl SSL(安全套接字层)的图像结果是用于在 Web 服务器和浏览器之间建立加密链接的标准安全技术。此链接可确保在 Web 服务器和浏览器之间传递的所有数据保持私有和完整。SSL 是一种安全协议。协议描述了如何使用算法。

TLS

传输层安全性(TLS)及其前身安全套接字层(SSL)(通常称为 SSL)是旨在通过计算机网络提供通信安全性的加密协议。

SSL 证书

所有浏览器都能够使用 SSL 协议与安全的 Web 服务器进行交互。但是,浏览器和服务器需要所谓的 SSL 证书才能建立安全连接。

SSL 证书具有密钥对:公钥和私钥。这些密钥一起工作以建立加密连接。证书还包含所谓的主题,即证书/网站所有者的身份。

SSL 证书如何创建安全连接

  1. 当浏览器尝试访问受 SSL 保护的网站时,浏览器和 Web 服务器使用称为“SSL 握手”的进程建立 SSL 连接

  2. 实质上,三个密钥用于设置 SSL 连接:公钥,私钥和会话密钥。

建立安全连接的步骤

  1. 浏览器连接到使用 SSL(https) 保护的 Web 服务器(网站)。浏览器请求服务器标识自己。

  2. 服务器发送其 SSL 证书的副本,包括服务器的公钥。

  3. 浏览器根据受信任的 CA 列表检查证书根目录,并且证书未过期,未撤消,并且其公用名对其所连接的网站有效。如果浏览器信任该证书,它将使用服务器的公钥创建,加密和发回对称会话密钥。

  4. 服务器使用其私钥解密对称会话密钥,并发回用会话密钥加密的确认以启动加密会话。

  5. 服务器和浏览器现在使用会话密钥加密所有传输的数据。

SSL / TLS 和 Tomcat

请务必注意,配置 Tomcat 以利用安全套接字通常仅在将其作为独立 Web 服务器运行时才需要。

如果将 Tomcat 主要作为 Servlet / JSP 容器运行在另一个 Web 服务器(例如 Apache 或 Microsoft IIS)后面,通常需要配置主 Web 服务器以处理来自用户的 SSL 连接。

证书

为了实现 SSL,Web 服务器必须为接受安全连接的每个外部接口(IP 地址)具有关联的证书。证书作为数字驱动程序许可证

  1. 这个驾驶执照由其所有者以加密方式签署,因此其他任何人都难以伪造

  2. 证书通常从着名的证书颁发机构(CA)购买,例如 VeriSign 或 Thawte

然而,在许多情况下,身份验证并不是真正的问题。管理员可能只想确保服务器发送和接收的数据是私有的,并且不能被可能正在窃听连接的任何人窥探。幸运的是,Java 提供了一个相对简单的命令行工具,名为 keytool,可以轻松创建自签名证书。自签名证书只是用户生成的证书,尚未在任何知名 CA 中正式注册,因此根本不保证是真实的

准备证书密钥库

Tomcat 目前仅在 JKS,PKCS11 或 PKCS12 格式密钥库上运行。

JKS:

JKS 格式是 Java 的标准 Java KeyStore 格式,是 keytool 命令行实用程序创建的格式。此工具包含在 JDK 中

PKCS11 / PKCS12

PKCS12 格式是一种互联网标准,可以通过 OpenSSL 和 Microsoft 的密钥管理器(以及其他东西)进行操作。

要从头开始创建包含单个自签名证书的新 JKS 密钥库,请从终端命令行执行以下操作:

$ keytool -genkey -alias tomcat -keyalg RSA

此命令将在你运行它的用户的主目录中创建一个名为“.keystore”的新文件。

要指定其他位置或文件名,请添加 -keystore 参数,然后添加密钥库文件的完整路径名。

$ Keytool -genkey -alias tomcat -keyalg RSA  -keystore \path\to\my\dir\<keystore-file-name>

执行此命令后,将首先提示你

  1. 密钥库密码
  2. 有关此证书的一般信息,例如公司,联系人姓名等。

最后,系统将提示你输入密钥密码,该密码是专门用于此证书的密码(与存储在同一密钥库文件中的任何其他证书相对)。

如果一切都成功,你现在拥有一个密钥库文件,其中包含可供服务器使用的证书。

编辑 Tomcat 配置文件

Tomcat 可以使用两种不同的 SSL 实现:

  1. JSSE 实现作为 Java 运行时的一部分提供(自 1.4 起)

    Java 安全套接字扩展(JSSE)支持安全的 Internet 通信。它为 Java 版本的 SSL 和 TLS 协议提供了框架和实现,并包括数据加密,服务器身份验证,消息完整性和可选客户端身份验证的功能

    JSSE API 旨在允许无缝插入其他 SSL / TLS 协议和公钥基础结构(PKI)实现。开发人员还可以提供备用逻辑,以确定是否应该信任远程主机,或者应该将哪些身份验证密钥材料发送到远程主机。

  2. APR 实现,默认使用 OpenSSL 引擎。

Connector 的确切配置详细信息取决于正在使用的实现。

<!-- Default in configuration file ..-->

<Connector protocol="HTTP/1.1"  port="8080" .../>

要定义 Java(JSSE) 连接器,无论是否加载 APR 库,请使用以下方法之一:

<!-- Define a HTTP/1.1 Connector on port 8443, JSSE NIO implementation -->

<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
           port="8443" .../>

或者,要指定 APR 连接器(APR 库必须可用),请使用:

<!-- Define a HTTP/1.1 Connector on port 8443, APR implementation -->
<Connector protocol="org.apache.coyote.http11.Http11AprProtocol"
           port="8443" .../>

在$ CATALINA_BASE / conf / server.xml 文件中配置连接器

<!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->
<Connector
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           port="8443" maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true"
           keystoreFile="${user.home}/.keystore" keystorePass="changeit"
           clientAuth="false" sslProtocol="TLS"/>

如果在此处更改端口号,则还应更改为非 SSL 连接器上的 redirectPort 属性指定的值。这允许 Tomcat 根据 Servlet 规范的要求,自动重定向尝试访问具有安全约束的页面的用户,该安全约束指定需要 SSL。

在 web.xml 中为特定项目配置

<security-constraint> 
  <web-resource-collection> 
    <web-resource-name>SUCTR</web-resource-name> 
    <url-pattern>/*</url-pattern>      
  </web-resource-collection> 
  <user-data-constraint> 
    <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
  </user-data-constraint> 
</security-constraint>

从证书颁发机构安装证书

  1. 创建本地证书签名请求(CSR)

  2. 如上所述创建本地自签名证书

  3. 然后创建 CSR

 $ keytool -certreq -keyalg RSA -alias tomcat -file certreq.csr
    -keystore <your_keystore_filename>

现在你有一个名为 certreq.csr 的文件,你可以将其提交给证书颁发机构

导入证书

现在你已拥有证书,并且可以将其导入本地密钥库。首先,你必须将链证书或根证书导入密钥库。之后,你可以继续导入证书。

  1. 从你获得证书的证书颁发机构下载链证书

  2. 将链证书导入你的密钥库

 $ keytool -import -alias root -keystore <your_keystore_filename>
    -trustcacerts -file <filename_of_the_chain_certificate>
  1. 最后导入新证书
 keytool -import -alias tomcat -keystore <your_keystore_filename>
    -file <your_certificate_filename>

参考: 这里