使用 OpenSSL 建立私有 CA:3 用戶證書

OpenSSL 建立私有 CA 三部曲:
使用 OpenSSL 建立私有 CA:1 根證書
使用 OpenSSL 建立私有 CA:2 中間證書
使用 OpenSSL 建立私有 CA:3 用戶證書html

在前文《使用 OpenSSL 建立私有 CA:2 中間證書》中咱們介紹瞭如何建立中間證書,並生成證書鏈。本文咱們將介紹如何爲應用生成用戶證書(web 站點的 ssl 證書),並把證書部署到應用服務器上和客戶端上。說明:本系列文章的演示環境爲 Ubuntu 18.04,OpenSSL 的版本爲 1.1.0g。linux

目標

爲局域網中的站點 bigxa 建立 ssl 證書並部署。web

準備用戶證書的配置文件

在 myca 目錄下建立 bigxa 目錄,而後建立配置文件 bigxa/bigxa.cnf,編輯其內容以下:chrome

# OpenSSL to generate a certificate signing requests(csr) configuration file.
# v1

[ req ]
# Options for the `req` tool (`man req`).
# use prompt config control user interactive
prompt = no
input_password = 123456

default_bits        = 2048
distinguished_name  = req_distinguished_name
string_mask         = utf8only

# SHA-1 is deprecated, so use SHA-2 instead.
default_md          = sha256

# Extension to add when the -x509 option is used.
#x509_extensions     = v3_ca
req_extensions     = v3_req

[ req_distinguished_name ]
# See <https://en.wikipedia.org/wiki/Certificate_signing_request>.
countryName                     = CN
stateOrProvinceName             = ShaanXi
localityName                    = Xian
organizationName                = PowerCity Ltd
organizationalUnitName          = Star
commonName = bigxa
emailAddress                    = ljfpower@163.com

[ v3_req ]
subjectAltName = DNS:bigxa

該配置文件主要經過 [ req_distinguished_name ] 段來設置證書的信息,請注意 [ v3_req ] 段中的 subjectAltName 信息,若是你爲局域網中的 IP 地址生成 https 證書,就必需要設置 subjectAltName。數據庫

建立祕鑰

進入 bigxa 目錄:windows

$ cd bigxa 

建立目錄 private csr certs:bash

$ mkdir private csr certs

執行下面的命令重建私鑰:服務器

$ openssl genrsa -out private/bigxa.key.pem 2048

注意,這裏咱們沒有使用 -aes256 選項,這樣建立的祕鑰不包含密碼。若是要建立 web 服務器用的 ssl 證書,必定不要爲祕鑰設置密碼!不然在每次重啓 web 服務的時候都須要輸入密碼!一樣也把祕鑰的權限設置爲 400:負載均衡

$ chmod 400 private/bigxa.key.pem

此時當前目錄爲 myca/bigxa。dom

建立 Certificate Signing Requests(csr)

對於建立站點的 https 類型的證書,必須在配置文件中設置  Common Name 爲 fully qualified domain name(也就是 網站的域名,或者是局域網中的機器名或 IP)。咱們的 web 服務器機器名爲 bigxa,因此在配置文件中設置 Common Name 爲 bigxa,同時設置 subjectAltName 爲 DNS:bigxa。注意,Common Name 不能與根 CA 和中間 CA 的 Common Name 相同。

使用下面的命令生成 csr:

$ openssl req -config bigxa.cnf \
    -key private/bigxa.key.pem \
    -new -sha256 \
    -out csr/bigxa.csr.pem

用下面的命令來驗證已經生成的 csr:

$ openssl req -text -noout -in csr/bigxa.csr.pem

注意確認下圖中的關鍵信息 CN = bigxa:

還有 Subject Alternative Name:

建立用戶證書

由於咱們在 powerca.cnf 中添加了 copy_extensions   = copy,因此在使用 csr 生成用戶證書時能夠直接使用中間證書的配置文件(powerca/powerca.cnf)而不用修改。下面先回到 myca 目錄下,而後生成用戶證書:

$ cd ..
$ openssl ca -config powerca/powerca.cnf \
    -extensions server_cert -days 1000 -notext -md sha256 \
    -in bigxa/csr/bigxa.csr.pem \
    -out bigxa/certs/bigxa.cert.pem

此次輸入的密碼爲 powerca 祕鑰的保護密碼:123456。
若是發生 "TXT_DB error number 2" 的錯誤,把 powerca/db/index 文件中相同名稱的記錄刪除便可。這個文件是 OpenSSL CA 工具存儲數據的數據庫:

證書生成後咱們把它的權限修改成 444:

$ chmod 444 bigxa/certs/bigxa.cert.pem

驗證證書

先經過下面的命令來驗證用戶證書中的基本信息:

$ openssl x509 -text -in bigxa/certs/bigxa.cert.pem -noout

圖中顯示證書頒發機構爲 NickLi Power CA,可用日期爲 2018-11-27 至 2021-8-23 號,證書的 Common Name 爲 bigxa。還有一些 X509 協議相關的信息:

CA:FALSE 表示該證書不能用做中間證書了,SSL Server 表示該證書能夠用來支持 HTTPS 協議,最後確認 Subject Alternative Name 爲:DNS:bigxa。
最後經過下面的命令驗證證書的合法性:

$ openssl verify -CAfile powerca/certs/powerca-chain.cert.pem bigxa/certs/bigxa.cert.pem

自動建立用戶證書

若是手動建立每一個用戶證書仍是挺繁瑣的,咱們能夠把這個過程自動化掉。在 myca 目錄下建立 usercert 目錄:

$ mkdir usercert

把 bigxa/bigxa.cnf 拷貝到 usercert 目錄下:

$ cp bigxa/bigxa.cnf usercert/usercert.csr.cnf

在 usercert 目錄下建立 private csr certs 三個目錄:

$ mkdir usercert/{private,csr,certs}

而後在 myca 目錄下建立腳本文件 certhelper.sh,編輯其內容以下:

#!/bin/bash
# ./certhelper.sh yourhostname
# if hostname is IP, should add the second paramerter "ip"
# ./certhelper.sh 10.3.2.33 ip

set -ex
# demo: check string is empty
if [ -z "$1" ]; then
    echo the first parameter is empty.
    echo plese add hostname as parameter
    exit 2
fi
cname="$1"
ctype="DNS"

if [ ! -z "$2" ]; then
    if [ "$2" = "ip" ]; then
        ctype="IP"
    fi  
fi

sed -i "s/^commonName.*/commonName = ${cname}/g" usercert/usercert.csr.cnf
sed -i "s/^subjectAltName.*/subjectAltName = ${ctype}:${cname}/g" usercert/usercert.csr.cnf

openssl genrsa -out usercert/private/${cname}.key.pem 2048
chmod 400 usercert/private/${cname}.key.pem

openssl req -config usercert/usercert.csr.cnf \
    -key usercert/private/${cname}.key.pem \
    -new -sha256 \
    -out usercert/csr/${cname}.csr.pem

openssl ca -batch -config powerca/powerca.cnf \
    -passin pass:123456 \
    -extensions server_cert -days 3000 -notext -md sha256 \
    -in usercert/csr/${cname}.csr.pem \
    -out usercert/certs/${cname}.cert.pem

openssl x509 -noout -text -in usercert/certs/${cname}.cert.pem
openssl verify -CAfile powerca/certs/powerca-chain.cert.pem usercert/certs/${cname}.cert.pem

cat usercert/certs/${cname}.cert.pem usercert/private/${cname}.key.pem > /tmp/temp.${cname}.certkey.pem
cat /tmp/temp.${cname}.certkey.pem powerca/certs/powerca-chain.cert.pem > usercert/${cname}.ha.pem

而後在 myca 目錄下執行該腳本就能夠了:

$ ./certhelper.sh bigxa
$ ./certhelper.sh 10.32.2.22 ip

生成的證書會保存在 usercert 目錄下。

把證書部署到 web 服務器

爲了建立 HTTPS 站點,咱們須要爲 web 服務器 bigxa 配置 ssl 證書。所需的文件爲 powerca-chain.cert.pem、bigxa.key.pem 和 bigxa.cert.pem。筆者的站點經過 HAProxy 作了負載均衡,因此在 HAProxy 的配置中添加 SSL 證書就能夠了。具體的作法是經過下面的命令合成 HAProxy 所需的證書文件:

$ cat bigxa/certs/bigxa.cert.pem bigxa/private/bigxa.key.pem > bigxa/temp.certkey.pem
$ cat bigxa/temp.certkey.pem powerca/certs/powerca-chain.cert.pem > bigxa/bigxa.ha.pem

把 bigxa.ha.pem 放置在 bigxa 機器上的 /etc/ssl/private/ 目錄中,全部者和組都設置爲 haproxy。最後在 HAProxy 的配置文件 /etc/haproxy/haproxy.cfg 中設置 ssl 證書的路徑:

bind *:443 ssl crt /etc/ssl/private/usercert.ha.pem

這樣 web 服務器端的配置就完成了。

把證書鏈安裝到客戶端

Firefox 支持直接導入 pem 格式的證書鏈,直接導入這個文件就能夠了。可是 windows 中須要使用 p12(pfx) 等格式,須要把 powerca-chain.cert.p12 安裝到信任的根證書列表中,而後 IE 和 chrome 就能夠正常識別到根證書了。

總結

本系列文章主要介紹如何在局域網中建立私有 CA,並用來頒發內網中使用的數字證書。內容以操做步驟爲主,目的是讓朋友們拷貝了就能當即使用。若是要了解數字證書的理論知識以及相關概念,建議閱讀更專業的資料。

參考:
OpenSSL Certificate Authority
《openssl-cookbook》

相關文章
相關標籤/搜索