搭建自己的CA證書頒發機構
學習CA證書認證網絡,記錄個流水賬以便日后可用
我文中使用的域名是內部的,你也可以自己搭建一個網絡,使用一樣的域名.
注意:三端在生成證書的時候填寫的國家,省,市,組織名 這些信息要一致!除了web服務端填寫的域名
終端表
終端名稱 | IP地址 | 簡介 |
---|---|---|
根CA | 10.35.176.1 | 一個CA證書網絡的中心,所有證書的最終信用保證 |
子CA | 10.35.176.8 | 該終端需要向根CA獲取一個子CA證書,該終端的主要職責是簽發SSL服務端證書給數據服務端. |
web服務端 | 10.35.176.6(域名:linzopi.vpn) | 向子CA領取一個web服務端證書.用於加密數據發給最終用戶終端. |
瀏覽器 | 10.35.176.5 | 數據的最終接收者 |
根CA配置
創建目錄結構,以及生成秘鑰與根證書文件
mkdir -p /etc/pki/tls
mkdir -p /etc/pki/CA
mkdir -p /etc/pki/CA/private
mkdir -p /etc/pki/CA/newcerts
touch /etc/pki/CA/index.txt #生成證書索引數據庫文件
echo 01 > /etc/pki/CA/serial #指定第一個頒發證書的序列號
根CA自簽名證書,根CA是最頂級的認證機構,沒有人能夠認證他,所以只能自己認證自己生成自簽名證書。
該證書需要安裝到最終用戶終端,這樣最終用戶對該CA根以及相關子證書才能信任
生成證書的參數:
-new: 生成新證書簽署請求
-x509: 專用於CA生成自簽證書
-key: 生成請求時用到的私鑰文件
-days n:證書的有效期限
-out /PATH/TO/SOMECERTFILE: 證書的保存路徑
-subj: 獲取證書的終端所在的國家(C),省(ST),組織(O),計算機名(CN)
openssl genrsa -out /etc/pki/CA/private/cakey.pem 8192 #生成CA秘鑰,8192是秘鑰位數
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out /etc/pki/CA/cacert.pem -subj /C=CN/ST=GD/O=LINZ/CN=RootCA #根據秘鑰生成證書
openssl x509 -outform der -in /etc/pki/CA/cacert.pem -out /etc/pki/CA/cacert.crt #轉Windows支持的格式
如果生成證書成功,可以用這個命令查看證書信息:
openssl x509 -noout -text -in /etc/pki/CA/cacert.pem
如果要把證書給windows系統,需要導出為windows格式.
linux下的證書格式和windows格式是不同的,需要進行轉換,轉換完成后,把crt文件,用你能想到的方式復制到windows設備雙擊即可安裝.
具體區別,請看這
Win10似乎也支持PEM格式的證書,改個后綴即可安裝.
Windows安裝時應安裝到"受信任的根證書頒發機構"
寫配置文件
vim /usr/lib/ssl/openssl.cnf
其中有個CA_default段落,將內容改為如下:
[ CA_default ]
dir = /etc/pki/CA # CA的默認工作目錄
certs = $dir/certs # 認證證書的目錄
crl_dir = $dir/crl # 證書吊銷列表的路徑
database = $dir/index.txt # 數據庫的索引文件
new_certs_dir = $dir/newcerts # 新頒發證書的默認路徑
certificate = $dir/cacert.pem # 此服務認證證書,如果此服務器為根CA那么這里為自頒發證書
serial = $dir/serial # 下一個證書的證書編號
crlnumber = $dir/crlnumber # 下一個吊銷的證書編號
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/cakey.pem# CA的私鑰
RANDFILE = $dir/private/.rand # 隨機數文件
x509_extensions = usr_cert # The extentions to add to the cert
name_opt = ca_default # 命名方式,以ca_default定義為准
cert_opt = ca_default # 證書參數,以ca_default定義為准
default_days = 365 # 證書默認有效期
default_crl_days= 30 # CRl的有效期
default_md = sha256 # 加密算法
preserve = no # keep passed DN ordering
policy = policy_match #policy_match策略生效
某處還有個usr_cert段落,改為如下,該節點允許CA簽出來的證書作為子CA:
[ usr_cert ]
# These extensions are added when 'ca' signs a request.
# This goes against PKIX guidelines but some CAs do it and some software
# requires this to avoid interpreting an end user certificate as a CA.
basicConstraints=CA:true,pathlen:3
子CA配置
創建目錄結構
mkdir -p /etc/pki/tls/private
mkdir /etc/pki/CA
mkdir /etc/pki/CA/private
mkdir /etc/pki/CA/newcerts
touch /etc/pki/CA/index.txt #生成證書索引數據庫文件
echo 01 > /etc/pki/CA/serial #指定第一個頒發證書的序列號
echo "unique_subject = no">/etc/pki/CA/index.txt.attr #允許簽發多個名稱屬性一樣的證書
寫配置文件
vim /usr/lib/ssl/openssl.cnf
其中有個CA_default段落,將內容改為如下:
[ CA_default ]
dir = /etc/pki/CA # CA的默認工作目錄
certs = $dir/certs # 認證證書的目錄
crl_dir = $dir/crl # 證書吊銷列表的路徑
database = $dir/index.txt # 數據庫的索引文件
new_certs_dir = $dir/newcerts # 新頒發證書的默認路徑
certificate = $dir/cacert.pem # 此服務認證證書,如果此服務器為根CA那么這里為自頒發證書
serial = $dir/serial # 下一個證書的證書編號
crlnumber = $dir/crlnumber # 下一個吊銷的證書編號
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/cakey.pem# CA的私鑰
RANDFILE = $dir/private/.rand # 隨機數文件
x509_extensions = usr_cert # The extentions to add to the cert
name_opt = ca_default # 命名方式,以ca_default定義為准
cert_opt = ca_default # 證書參數,以ca_default定義為准
default_days = 365 # 證書默認有效期
default_crl_days= 30 # CRl的有效期
default_md = sha256 # 加密算法
preserve = no # keep passed DN ordering
policy = policy_match #policy_match策略生效
Chrome瀏覽器要求證書中必須包含“Subject Alternative Names”這一參數。如果沒有這個參數,chrome不認.后面這幾個配置可添加此段:
找到[ req ]段落在底下添加req_extentions = v3_req
找到[ v3_req ]段落,添加subjectAltName = @alt_names
添加一個段落
[ alt_names ]
DNS.1 = linzopi.vpn(web服務端域名,需要根據申請者的域名修改)
效果:
生成秘鑰和證書請求文件
# 生成秘鑰
openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048
# 生成證書請求文件
openssl req -new -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/subca1.csr -subj /C=CN/ST=GD/O=LINZ/CN=SubCA1
獲取子CA證書
上面的命令執行完成后把subca1.csr發到根CA的/etc/pki/CA/newcerts目錄里面
下面這個命令在根CA終端執行
openssl ca -in /etc/pki/CA/newcerts/subca1.csr -cert /etc/pki/CA/cacert.pem -keyfile /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/newcerts/cacert.pem -days 3650
如果沒問題newcerts目錄里可以找到一個新的cacert.pem文件,傳到子CA的/etc/pki/CA/里面.並且安裝到Windows的"中間證書頒發機構"
WEB服務端
生成key和證書請求
注意Common Name這里,要填寫域名,否則瀏覽器會認為不安全!
mkdir ~/cert/
openssl genrsa -out ~/cert/linzopi.key 2048
openssl req -new -key ~/cert/linzopi.key -out ~/cert/linzopi.csr -subj /C=CN/ST=GD/O=LINZ/CN=linzopi.vpn
csr傳到子CA的/etc/pki/CA/newcerts目錄里面
子CA:
openssl ca -in /etc/pki/CA/newcerts/linzopi.csr -out /etc/pki/CA/newcerts/linzopi.crt -days 365 -extensions v3_req
得到linzopi.csr文件(雖然生成的時候文件后綴名設為crt實際上是pem格式,如果需要der格式,加-outform der參數),傳回web服務端~/cert/目錄.
Nginx配置
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024;
# multi_accept on;
}
http {
server {
listen 443;
server_name linzopi.vpn;
ssl on;
ssl_certificate /root/cert/linzopi.crt;
ssl_certificate_key /root/cert/linzopi.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html;
}
}
}