1. 程式人生 > >數字證書學習-1- 應用於https

數字證書學習-1- 應用於https

分析服務端環境

先搞清楚伺服器部署了哪種web應用;

實際服務可能 部署了 一種或多種web服務程式 包括 (tomcat ,ngnix, netty,nodejs ,python ,iis ,weblogic,dubbo 等) 如果是複雜環境,建議用ngnix 做代理 , 如果你只有tomcat 專案,那可以只用tomcat 所以本文主要學習ngnix配置。

分析需求

1)是否需要驗證服務端

如果需要,那麼需要用 openssl 釋出服務端證書. 如果我們的服務端證書非CA授權,那麼還需要在服務端建立根證書. 作為證書鏈的頂層.

2)是否需要驗證客戶端

如果需要,那麼需要用 openssl 釋出客戶端證書

3)是否需要加密傳輸

需要引入常用的對稱加密演算法

學習 openssl

openssl是證書開發的必要工具 ,類似的工具還有java 的keytool

openssl 安裝與配置

這裡僅介紹window下安裝

到http://slproweb.com/products/Win32OpenSSL.html下載 新建系統變數OPENSSL_CONF 指向 openssl.cfg 檔案 新建系統變數OPENSSL_HOME 指向 openssl主目錄 把 %OPENSSL_HOME%\bin新增到window path中

openssl.cfg配置

主要配置 DN

DN欄位名 縮寫 說明 填寫要求
Country Name C 證書持有者所在國家 要求填寫國家程式碼,用2個字母表示
State or Province Name ST 證書持有者所在州或省份 填寫全稱,可省略不填
Locality Name L 證書持有者所在城市 可省略不填
Organization Name O 證書持有者所屬組織或公司 最好還是填一下
Organizational Unit Name OU 證書持有者所屬部門 可省略不填
Common Name CN 證書持有者的通用名 必填。對於非應用證書,它應該在一定程度上具有惟一性;對於應用證書,一般填寫伺服器域名或萬用字元樣式的域名。
Email Address 證書持有者的通訊郵箱 可省略不填

具體配置,可以參考

本文 附件> OPENSSL配置 本文 附件> nginx配置ssl雙向驗證的方法

注意:

1)配置檔案中的註解只能用# 不要用 / * * /或者//.

openssl 建立隨機數

大部分祕鑰都依賴隨機數,openssl生成的隨機數儲存在隨機數檔案(由配置檔案指定)中, 寫法有

openssl rand 10 openssl rand -hex 10 openssl rand -base64 20 等

openssl 建立根證書

根證書 主要用途

1)為子證書籤名 2)為認證證書是否是證書鏈的節點

建立根證書分為3步

生成非對稱祕鑰生成數字簽名生成數字證書

寫法1:

openssl genrsa -out ca/ca-key.pem 1024 openssl req -new -key ca/ca-key.pem -out rootCA.csr openssl ca -selfsign -in rootCA.csr

寫法2:(分三步生成):

openssl genrsa -out prikey.pem openssl req -new -key prikey.pem -out req1.csr -md5 openssl req -x509 -key prikey.pem -in req1.csr -out CA1.crt -days 180 或者 openssl ca -in req1.csr -out CA1.crt -days 365 或者 openssl x509 -req -in req1.csr -out CA1.pem -signkey prikey.pem -days 200

寫法3:(分兩步)

openssl genrsa -out cakey.pem openssl req -new -x509 -key cakey.pem -out CA3.crt -days 300

寫法4:(一步到位)

一步生成私鑰和證書 openssl req -new -x509 -days 365 -keyout CA.key -out CA.crt 或者 openssl req -newkey rsa:2048 -x509 -days 5480 -keyout CA2.key -out CA2.crt 去除密碼保護 openssl rsa -in CARoot.key -out CARoot.key

說明

  • 以上的路徑需要根據openssl.cfg 來
  • 以上的祕鑰/簽名/證書名, 都可以自定義, 不是固定的

參考:

openssl 建立數字證書, 也是三步

生成非對稱祕鑰生成數字簽名生成數字證書
  1. 生成祕鑰的寫法

openssl genrsa -out client.key 或者 openssl genrsa -out clientkey.pem

  1. 生成數字簽名(又叫數字證書請求檔案)的寫法

openssl req -new -key client.key -out nginx.csr 或者 openssl req -new -key clientkey.pem -out nginx.csr

  1. 生成數字證書的寫法

openssl ca -in nginx.csr -out nginx.crt -days 365 或者 openssl x509 -req -in nginx.csr -out client/client.pem -signkey clientkey.pem -CA ca.pem -CAkey ca-key.pem -CAcreateserial -days 365 或者 openssl ca -in nginx.csr -out nginx.crt -cert CA.crt -keyfile CA.key -days 100

  • 匯出 openssl pkcs12 -export -clcerts -in client.pem -inkey client.pem -out client/client.p12

建立非根證書的方法都一致,只是檔名字不同

證書格式轉換寫法

pem轉p12

openssl pkcs12 -export -clcerts -in ca/ca-cert.pem -inkey ca/ca-key.pem -out ca/ca.p12

其他說明:

1_ “-newkey"選項和”-new"選項類似,只不過"-newkey"選項可以直接指定私鑰的演算法和長度,所以它主要用在openssl req自動建立私鑰時。例如: openssl req -newkey rsa:2048 -out req3.csr -nodes -keyout myprivkey.pem

實際用例可以參考:

ngnix 配置ssl

server {
    listen       443 ssl;
    server_name  usb.dev;

    access_log off;

    ssl on;
    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    
    ssl_client_certificate /etc/nginx/ssl/ca.crt;
    ssl_verify_client on;

    location / {
        proxy_pass http://backend$request_uri;
    }
}

其中 ssl_client_certificate /etc/nginx/ssl/ca.crt; 的意思是使用 CA 證書來驗證請求帶的客戶端證書是否是該 CA 簽發的。 配置好後就就重新載入 NGINX 吧: service nginx reload

附件