天天看點

數字證書學習-1- 應用于https分析服務端環境分析需求學習 opensslngnix 配置ssl實驗步驟: 共7步附件

文章目錄

  • 分析服務端環境
  • 分析需求
  • 學習 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 建立數字證書, 也是三步

  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

建立非根證書的方法都一緻,隻是檔案名字不同

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

繼續閱讀