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 证书如何创建安全连接
-
当浏览器尝试访问受 SSL 保护的网站时,浏览器和 Web 服务器使用称为“SSL 握手”的进程建立 SSL 连接
-
实质上,三个密钥用于设置 SSL 连接:公钥,私钥和会话密钥。
建立安全连接的步骤
-
浏览器连接到使用
SSL(https)
保护的 Web 服务器(网站)。浏览器请求服务器标识自己。 -
服务器发送其 SSL 证书的副本,包括服务器的公钥。
-
浏览器根据受信任的 CA 列表检查证书根目录,并且证书未过期,未撤消,并且其公用名对其所连接的网站有效。如果浏览器信任该证书,它将使用服务器的公钥创建,加密和发回对称会话密钥。
-
服务器使用其私钥解密对称会话密钥,并发回用会话密钥加密的确认以启动加密会话。
-
服务器和浏览器现在使用会话密钥加密所有传输的数据。
SSL / TLS 和 Tomcat
请务必注意,配置 Tomcat 以利用安全套接字通常仅在将其作为独立 Web 服务器运行时才需要。
如果将 Tomcat 主要作为 Servlet / JSP 容器运行在另一个 Web 服务器(例如 Apache 或 Microsoft IIS)后面,通常需要配置主 Web 服务器以处理来自用户的 SSL 连接。
证书
为了实现 SSL,Web 服务器必须为接受安全连接的每个外部接口(IP 地址)具有关联的证书。证书作为数字驱动程序许可证。
-
这个驾驶执照由其所有者以加密方式签署,因此其他任何人都难以伪造
-
证书通常从着名的证书颁发机构(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>
执行此命令后,将首先提示你
- 密钥库密码
- 有关此证书的一般信息,例如公司,联系人姓名等。
最后,系统将提示你输入密钥密码,该密码是专门用于此证书的密码(与存储在同一密钥库文件中的任何其他证书相对)。
如果一切都成功,你现在拥有一个密钥库文件,其中包含可供服务器使用的证书。
编辑 Tomcat 配置文件
Tomcat 可以使用两种不同的 SSL 实现:
-
JSSE 实现作为 Java 运行时的一部分提供(自 1.4 起)
Java 安全套接字扩展(JSSE)支持安全的 Internet 通信。它为 Java 版本的 SSL 和 TLS 协议提供了框架和实现,并包括数据加密,服务器身份验证,消息完整性和可选客户端身份验证的功能
JSSE API 旨在允许无缝插入其他 SSL / TLS 协议和公钥基础结构(PKI)实现。开发人员还可以提供备用逻辑,以确定是否应该信任远程主机,或者应该将哪些身份验证密钥材料发送到远程主机。
-
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>
从证书颁发机构安装证书
-
创建本地证书签名请求(CSR)
-
如上所述创建本地自签名证书
-
然后创建 CSR
$ keytool -certreq -keyalg RSA -alias tomcat -file certreq.csr
-keystore <your_keystore_filename>
现在你有一个名为 certreq.csr 的文件,你可以将其提交给证书颁发机构
导入证书
现在你已拥有证书,并且可以将其导入本地密钥库。首先,你必须将链证书或根证书导入密钥库。之后,你可以继续导入证书。
-
从你获得证书的证书颁发机构下载链证书
-
将链证书导入你的密钥库
$ 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>
参考: 这里