SSL基礎知識及Nginx/Tomcat配置SSL


HTTPS 是在 HTTP 基礎之上添加 SSL/TLS 使網絡通訊加密,進而確保通信安全。可簡記為 HTTPS = HTTP + SSL/TLS

本文檔主要講解常規SSL格式、Nginx 與 Tomcat 的 SSL 配置方法 及 通過 OpenSSL 轉換證書格式的內容。

1. SSL 證書主流格式說明

SSL 及 TLS(新版SSL)統稱 SSL 證書(又稱 CA 證書、數字證書),用於數據傳輸過程的加密。

本質上 SSL 證書是一個 X.509 證書,是定義證書數據結構的標准。在 X.509 標准下,包含 Base64 ASCII 文本與二進制兩種文件儲存方式,根據使用的格式和編碼,證書文件具有不同的擴展名。

下圖展示了 X.509 主流證書的編碼格式和文件擴展名。

對於 Nginx 和 Tomcat 最常使用的是 PEM (Nginx) 與 PKCS#12(Tomcat),除此之外 Tomcat還支持基於JDK keytool 加密的 JKS 格式。

PEM 格式

大多數 CA (證書頒發機構) 提供 PEM 格式的證書,保存在 Base64 ASCII 編碼的文件中。證書文件類型可以是 .pem.crt.cer.key。因為是文本類型,所以對文件后綴名不敏感。PEM 文件可以在單個文件中包含服務器證書、中間證書和私鑰。服務器證書和中間證書也可以放在單獨的 .crt.cer 文件中,私鑰可以放在 .key 文件中。

PEM 文件使用 ASCII 編碼,可以使用文本編輯器打開,文本內容中公鑰、私鑰都有兩種形式。X.509 規定,取 ---- 開頭的下一行首開始,到下一個 ---- 開頭的上一行尾結束。

----BEGIN CERTIFICATE----
公鑰加密串
----END CERTIFICATE----

-----BEGIN PUBLIC KEY-----
公鑰加密串
-----END PUBLIC KEY-----

---- BEGIN RSA PRIVATE KEY-----
私鑰加密串
-----END RSA PRIVATE KEY-----

-----BEGIN PRIVATE KEY-----
私鑰加密串
-----END PRIVATE KEY-----

-----BEGIN CERTIFICATE REQUEST-----
CSR加密串
-----END CERTIFICATE REQUEST-----

PKCS#7 格式

PKCS#7 格式是一種“加密消息語法標准”。PKCS#7證書使用 Base64 ASCII 編碼,文件擴展名為 .p7b.p7c,這種格式只能存儲證書,不能存儲私鑰。一般主要用來做數字信封。格式如下:

-----BEGIN PKCS7-----
公鑰加密串
-----END PKCS7-----

DER 格式

DER 證書采用二進制格式,只含有證書信息,不包含私鑰。文件擴展名為 .der.cer。這些證書主要用於Java Web服務器。

PKCS12 格式

PKCS#12證書采用二進制格式,文件擴展名為 .pfx.p12,支持將 服務器證書中間證書私鑰 存儲在一個具有密碼保護的文件中,主要用於Windows平台。

2. Nginx SSL證書配置

Nginx 支持所有 PEM 格式的證書,包含 .pem.crt.cer.key,其中 .key 常用於私鑰后綴名。

server {
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     /path/to/path/public.pem;
    ssl_certificate_key /path/to/path/private.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / {
        root html;
        index index.html index.htm;
    }
}

參數說明:

  • 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關閉;

官方文檔參考

3. Tomcat SSL證書配置

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)

server.xml 配置

<Connector
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           port="8443" maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true"
           keystoreFile="<keystoreFile>" keystorePass="<passvalue>"
           clientAuth="false" sslProtocol="TLS"/>

參數說明:

  • port :HTTPS 協議端口,可以設置為 443
  • protocol :連接協議,由 HTTP/1.1 改為 org.apache.coyote.http11.Http11NioProtocol
  • keystoreFile :證書文件絕對路徑,可以是 JKS 或 PKCS12
  • keystorePass :證書的密碼
  • 未說明的參數除 maxThreads 根據實際情況調整,其余均按照上面的配置即可。

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

4. 主流證書轉換方法

一般來說,阿里雲、騰訊雲直接提供不同服務器類型的證書,以下證書轉換僅當無備選類型時使用。

PEM 格式 轉 PKCS#12

PEM 格式的公私鑰后綴名不影響轉換,可以是 .crt /.pem/ .key /.cer

openssl pkcs12 -export -in public.pem -inkey private.key -out keystore.p12 -passout pass:<passvalue>

參數說明

  • -in : 指定PEM 公鑰文件
  • -inkey:指定 PEM 私鑰文件
  • -out:指定輸出 PKCS#12 格式的證書,常以 .p12.pfx 擴展名。
  • -passout:指定 PKCS#12 證書的密碼

PKCS#12 轉 PEM

當提供PKCS#12證書,則需要轉換為PEM證書,命令如下:

#導出私鑰
openssl pkcs12 -in keystore.p12 -out private.key -nocerts -nodes -password pass:<passvalue>
#導出公鑰
openssl pkcs12 -in keystore.p12 -out public.pem -clcerts -nokeys -password pass:<passvalue>

參數說明

  • -in :輸入文件,本命令中是 PKCS#12 證書
  • -out:輸出文件,根據上邊兩種搭配,分別輸出私鑰與公鑰
  • -nocerts:無公鑰
  • -nodes:不加密私鑰。目前在 OpenSSL 3.0 中廢棄,使用 -noenc 代替,Git Bash 自帶的版本目前還沒升到 3.0
  • -clcerts:只輸出客戶端證書
  • -nokeys:無私鑰
  • -password:PKCS#12證書的密碼,需要接 pass:<實際密碼>

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

5. [擴展] 自簽發SSL證書與CA數字證書

自簽發 SSL 證書

通過 openssl 生成自簽發證書,自簽發證書不包含CSR中間證書,直接生成公鑰。自簽發的證書在網絡上是不可信的,但是 內網測試與使用,也是可以的。

命令如下:

#生成RSA私鑰
openssl genrsa -out private.key 2048
#自簽發公鑰
openssl req -new -x509 -key private.key -out public.pem -days 1095 #3年有效期

CA 數字證書

CA 數字證書是由創建者提供 CSR(Centificate Signing Request)給CA機構簽發下來的公鑰。

一般來講,SSL運營商(如阿里雲等)已經提供了直接下載指定服務器類型的公私鑰功能,以下僅是過程簡單描述。

CA 機構的處理方式一般不需要創建者關心,命令:

#生成RSA私鑰
openssl genrsa -out private.key 2048
#使用私鑰生成CSR
openssl req -new -key privkey.key -out cert.csr

將此CSR交給 CA機構 ,由CA簽名后獲得公鑰,使用公鑰和私鑰就可以部署 HTTPS 服務了。

寫文過程難免有錯漏,如有指正感激不盡!

參考文獻:https://www.tutorialsteacher.com/https


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM