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
對於建立站點的 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 目錄下。
爲了建立 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》