搭建自己的CA證書頒發機構


搭建自己的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;
        }
    }
}

最終客戶端


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM