天天看点

SSL基础知识及Nginx/Tomcat配置SSL

HTTPS 是在 HTTP 基础之上添加 SSL/TLS 使网络通讯加密,进而确保通信安全。可简记为 <code>HTTPS = HTTP + SSL/TLS</code>

本文档主要讲解常规SSL格式、Nginx 与 Tomcat 的 SSL 配置方法 及 通过 OpenSSL 转换证书格式的内容。

SSL 及 TLS(新版SSL)统称 SSL 证书(又称 CA 证书、数字证书),用于数据传输过程的加密。

本质上 SSL 证书是一个 X.509 证书,是定义证书数据结构的标准。在 X.509 标准下,包含 Base64 ASCII 文本与二进制两种文件储存方式,根据使用的格式和编码,证书文件具有不同的扩展名。

下图展示了 X.509 主流证书的编码格式和文件扩展名。

SSL基础知识及Nginx/Tomcat配置SSL

对于 Nginx 和 Tomcat 最常使用的是 PEM (Nginx) 与 PKCS#12(Tomcat),除此之外 Tomcat还支持基于JDK keytool 加密的 JKS 格式。

大多数 CA (证书颁发机构) 提供 PEM 格式的证书,保存在 Base64 ASCII 编码的文件中。证书文件类型可以是 <code>.pem</code>、<code>.crt</code>、<code>.cer</code> 或 <code>.key</code>。因为是文本类型,所以对文件后缀名不敏感。PEM 文件可以在单个文件中包含服务器证书、中间证书和私钥。服务器证书和中间证书也可以放在单独的 <code>.crt</code> 或 <code>.cer</code> 文件中,私钥可以放在 <code>.key</code> 文件中。

PEM 文件使用 ASCII 编码,可以使用文本编辑器打开,文本内容中公钥、私钥都有两种形式。X.509 规定,取 <code>----</code> 开头的下一行首开始,到下一个 <code>----</code> 开头的上一行尾结束。

PKCS#7 格式是一种“加密消息语法标准”。PKCS#7证书使用 Base64 ASCII 编码,文件扩展名为 <code>.p7b</code> 或 <code>.p7c</code>,这种格式只能存储证书,不能存储私钥。一般主要用来做数字信封。格式如下:

DER 证书采用二进制格式,只含有证书信息,不包含私钥。文件扩展名为 <code>.der</code> 或 <code>.cer</code>。这些证书主要用于Java Web服务器。

PKCS#12证书采用二进制格式,文件扩展名为 <code>.pfx</code> 或 <code>.p12</code>,支持将 <code>服务器证书</code>、<code>中间证书</code> 和 <code>私钥</code> 存储在一个具有密码保护的文件中,主要用于Windows平台。

Nginx 支持所有 PEM 格式的证书,包含 <code>.pem</code>、<code>.crt</code> 、<code>.cer</code>、<code>.key</code>,其中 <code>.key</code> 常用于私钥后缀名。

参数说明:

server_name :域名(不含https://)

ssl_certificate :【必填】 公钥文件位置

ssl_certificate_key :【必填】 私钥文件位置

ssl_session_timeout :客户端可复用会话的时间

ssl_ciphers:指定启用的加密器类型,必须是OpenSSL库支持的类型,默认 ssl_ciphers HIGH:!aNULL:!MD5;

ssl_protocols:表示使用的TLS协议的类型,默认是TLSv1 TLSv1.1 TLSv1.2,可选参数为SSLv2、SSLv3、TLSv1、TLSv1.1、TLSv1.2、TLSv1.3

ssl_prefer_server_ciphers:指定服务端加密器优先,参数为on开启,默认off关闭;

官方文档参考:

https://nginx.org/en/docs/http/configuring_https_servers.html

https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate

Tomcat 支持 JKS、PKCS11 和 PKCS12 格式的密钥库,JKS 格式是 Java 的标准格式,由 JDK 的 keytool 生成;PKCS11/12 是网络标准,由 OpenSSL 生成。

对于证书格式转换,JKS 一般是由 PKCS12 转换而来,Tomcat 又支持 PKCS12 所以只要将 PEM 格式转换成 PKCS12 (.pfx 或 .p12) 即可。参考 [#PEM 格式 转 PKCS#12](#PEM 格式 转 PKCS#12)

参数说明:

port :HTTPS 协议端口,可以设置为 443

protocol :连接协议,由 <code>HTTP/1.1</code> 改为 <code>org.apache.coyote.http11.Http11NioProtocol</code>

keystoreFile :证书文件绝对路径,可以是 JKS 或 PKCS12

keystorePass :证书的密码

未说明的参数除 <code>maxThreads</code> 根据实际情况调整,其余均按照上面的配置即可。

官方文档参考:https://tomcat.apache.org/tomcat-8.5-doc/ssl-howto.html#Configuration

一般来说,阿里云、腾讯云直接提供不同服务器类型的证书,以下证书转换仅当无备选类型时使用。

PEM 格式的公私钥后缀名不影响转换,可以是 <code>.crt</code> /<code>.pem</code>/ <code>.key</code> /<code>.cer</code>。

-in : 指定PEM 公钥文件

-inkey:指定 PEM 私钥文件

-out:指定输出 PKCS#12 格式的证书,常以 <code>.p12</code> 或 <code>.pfx</code> 扩展名。

-passout:指定 PKCS#12 证书的密码

当提供PKCS#12证书,则需要转换为PEM证书,命令如下:

-in :输入文件,本命令中是 PKCS#12 证书

-out:输出文件,根据上边两种搭配,分别输出私钥与公钥

-nocerts:无公钥

-nodes:不加密私钥。目前在 OpenSSL 3.0 中废弃,使用 <code>-noenc</code> 代替,Git Bash 自带的版本目前还没升到 3.0

-clcerts:只输出客户端证书

-nokeys:无私钥

-password:PKCS#12证书的密码,需要接 <code>pass:&lt;实际密码&gt;</code>

官方文档参考:https://www.openssl.org/docs/manmaster/man1/openssl-pkcs12.html

通过 <code>openssl</code> 生成自签发证书,自签发证书不包含CSR中间证书,直接生成公钥。自签发的证书在网络上是不可信的,但是 内网测试与使用,也是可以的。

SSL基础知识及Nginx/Tomcat配置SSL

命令如下:

CA 数字证书是由创建者提供 CSR(Centificate Signing Request)给CA机构签发下来的公钥。

一般来讲,SSL运营商(如阿里云等)已经提供了直接下载指定服务器类型的公私钥功能,以下仅是过程简单描述。

SSL基础知识及Nginx/Tomcat配置SSL

CA 机构的处理方式一般不需要创建者关心,命令:

将此CSR交给 CA机构 ,由CA签名后获得公钥,使用公钥和私钥就可以部署 HTTPS 服务了。

写文过程难免有错漏,如有指正感激不尽!

参考文献:https://www.tutorialsteacher.com/https