數字證書學習-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 建立數字證書, 也是三步
- 生成祕鑰的寫法
openssl genrsa -out client.key
或者openssl genrsa -out clientkey.pem
- 生成數字簽名(又叫數字證書請求檔案)的寫法
openssl req -new -key client.key -out nginx.csr
或者openssl req -new -key clientkey.pem -out nginx.csr
- 生成數字證書的寫法
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