文章目錄
- 分析服務端環境
- 分析需求
- 學習 openssl
-
- openssl 安裝與配置
-
-
- 這裡僅介紹window下安裝
- openssl.cfg配置
- 注意:
-
- openssl 建立随機數
- openssl 指令
-
- 建立根證書 主要用途
- 建立根證書分為3步
- 說明
- 參考:
- openssl 建立數字證書, 也是三步
- openssl 配置檔案
-
- 證書格式轉換寫法
- 其他說明:
- 實際用例可以參考:
- ngnix 配置ssl
- 實驗步驟: 共7步
- 附件
分析服務端環境
先搞清楚伺服器部署了哪種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 rand -out .rand 1000
等
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 來
- 以上的秘鑰/簽名/證書名, 都可以自定義, 不是固定的
參考:
http://www.cnblogs.com/f-ck-need-u/p/7115871.html
http://www.cnblogs.com/f-ck-need-u/p/6091105.html
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
建立非根證書的方法都一緻,隻是檔案名字不同
openssl 配置檔案
[default]
name = rootca # 變量
home = e:/ssl # 變量
default_ca = CA_default
[req]
default_bits = 2048
#encrypt_key = no
default_keyfile = $home/ca/cakey.pem
default_md = sha256
utf8 = yes
string_mask = utf8only
#prompt = no #/* 測試時該選項導緻出錯,是以将其注釋掉*/
#prompt = yes
distinguished_name = CA_DN
#req_extensions = v3_req
x509_extensions = v3_ca
[v3_req]
basicConstraints = critical,CA:true
keyUsage = critical,keyCertSign,cRLSign
subjectKeyIdentifier = hash
[v3_ca]
# Extensions for a typical CA
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = CA:true
keyUsage = cRLSign, keyCertSign # 典型的CA憑證的使用方法設定,由于測試使用是以注釋了
#如果真的需要申請為CA 可以如此配置
[CA_default]
certs = $home/certs # 已生成的證書的預設儲存目錄
new_certs_dir = $home/certs
crl_dir = $home/db/crl # 生成的證書撤銷清單(CRL)的預設儲存目錄
utf8 = yes
crl = $home/db/crl.pem
database = $home/db/index.txt
serial = $home/db/serial
crlnumber = $home/db/crlnumber
certificate = $home/ca/$name.crt
private_key = $home/ca/$name.key
RANDFILE = $home/.rand
unique_subject = no
copy_extensions = none
default_days = 365
default_crl_days = 365
default_md = sha256
policy = policy_to_match
[policy_to_match]
countryName = match
stateOrProvinceName = optional
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[CA_DN]
countryName = "C"
countryName_default = "CH"
organizationName = "O"
organizationName_default = "hyl.com"
commonName = "CN"
commonName_default = "localhost"
證書格式轉換寫法
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
實際用例可以參考:
windows下使用openssl生成|CA憑證的步驟
http://zctya.blog.163.com/blog/static/1209178201251310292958/
ngnix 配置ssl
server {
listen 443 ssl;
server_name usb.dev;
access_log off;
ssl on;
ssl_certificate ssl/server.crt;
ssl_certificate_key ssl/server.key;
ssl_client_certificate 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
window下的清除程序腳本
netstat -aon|findstr "443"
tasklist|findstr "pid"
taskkill /f /t /im ngnix.exe
實驗步驟: 共7步
1建立目錄
cd D:\ssl
mkdir ca,certs,conf,db
2 添加檔案
type >db/index.txt
type null>db/index.txt.attr
echo “00”>db/serial.txt #第一行寫上00
conf/ssl.conf
3 配置好ssl.conf ,把該檔案 添加到系統環境變量OPENSSL_CONF
注意修改相關目錄和檔案路徑
4 編寫自動化腳本
type >start.bat
openssl rand -out .rand 1000
openssl req -new -newkey rsa:1024 -x509 -days 3650 -keyout ca/ca.key -out ca/ca.crt -subj /C=CN/O=hllh/CN=manage.hllhw8.com -passout pass:123456
openssl rsa -in ca/ca.key -out ca/ca.key -passin pass:123456
openssl genrsa -out certs/server.key 1024
openssl req -new -key certs/server.key -out certs/server.csr -subj /C=CN/O=hllh/CN=localhost -passout pass:123456
openssl x509 -req -sha256 -in certs/server.csr -CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial -days 1200 -out certs/server.crt -passin pass:123456
openssl genrsa -out certs/client.key 1024
openssl req -new -key certs/client.key -out certs/client.csr -subj /C=CN/O=hllh/ou=manager/CN=localhost
openssl x509 -req -sha256 -in certs/client.csr -CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial -days 1200 -out certs/client.crt -passin pass:123456
openssl pkcs12 -export -clcerts -in certs/client.crt -inkey certs/client.key -out certs/client.p12 -passout pass:123456
5 配置ngnix
把生成 數字證書和秘鑰檔案 拷貝到ngnix 目錄的 ssl目錄下 (如果沒有建立)
(隻要拷貝 server.key server.crt ca.crt 到ssl下)
然後配置 ssl 相關參數指向 ssl 目錄下的 指定檔案
6 輕按兩下 client.p12 安裝到window
需要輸入密碼123456
7 通路https://localhost
信任服務端證書後,才能通路,注意是https: ,不是http
附件
openssl 下載下傳
http://slproweb.com/products/Win32OpenSSL.html
OPENSSL配置
http://www.cnblogs.com/f-ck-need-u/p/6091027.html
使用OpenSSL生成證書****
https://www.cnblogs.com/AloneSword/p/3809002.html
openssl簽署和自簽署證書的多種實作方式***********
http://www.cnblogs.com/f-ck-need-u/p/6091105.html
如何使用OpenSSL工具生成根證書與應用證書********
https://www.cnblogs.com/kenshinobiy/p/7441830.html
openssl基本原理 + 生成證書 + 使用執行個體**********
https://blog.csdn.net/zxh2075/article/details/79967227
openssl系列***********
http://www.cnblogs.com/f-ck-need-u/p/7048359.html#blogopenssl
https原理及實踐***
https://www.cnblogs.com/lyq863987322/p/8424253.html#_label0_2
OpenSSL指令—pkcs12***
https://blog.csdn.net/as3luyuan123/article/details/16105475
KeyTool、openssh構造數字證書**
https://blog.csdn.net/liuquan0071/article/details/50835405
nginx配置ssl雙向驗證的方法
https://www.jb51.net/article/57012.htm
NGINX 配置 SSL 雙向認證
https://www.cnblogs.com/UnGeek/p/6049004.html
HTTPS證書驗證流程及SSL證書生成步驟【附nginx開啟https配置】
https://blog.csdn.net/witmind/article/details/78456660
nginx配置ssl加密(單/雙向認證、部分https)
https://blog.csdn.net/lcathm/article/details/50958124