一、背景
研究了好久如何創建一個可供https和docker倉庫使用的內網證書,最終參考這篇文章( https://www.mogublog.net/post/2443.html )和自己的摸索搞定了。用於網站的證書其實很好建,一條命令既可:“openssl req -new -x509 -days 3560 -nodes -out web.crt -keyout web.key ”。問題是,這種方式創建的證書有幾個問題:
1、不能用於docker的registry倉庫服務,docker會認為證書不合法,拉取、推送鏡像時都會報錯。
2、每生成一個證書,每個客戶端瀏覽器或軟件就需要信任一次,或者在客戶端操作系統導入一次。特別是訪問自建的centos系統的yum倉庫(https),需要修改各個客戶端的yum配置或導入到系統證書目錄。(因此需要自建CA證書,客戶端導入CA證書,這樣用CA生成的所有證書在客戶端都能信任)
3、瀏覽器即便信任了證書,還是會出現“不安全連接”的提示。
因此需要創建CA證書,然后用CA證書生成一個規范的域名證書,才能滿足上述所有需要。創建證書可以使用前面那篇文章的腳本。我的創建、部署過程如下:
二、創建證書
1、CA證書創建腳本createCA.sh
#!/bin/bash
mkdir CA
cd CA
openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 36500 -key ca.key -out ca.crt -subj "/C=CN/ST=SC/L=CD/O=COMPANY/OU=ServerOperation/CN=neiwang.yuming/emailAddress=someone@neiwang.yuming"
echo "1" > serial
# Useage: sh createCA.sh
我舉例使用了內網自建域名“neiwang.yuming”,只要你的自建dns能解析,域名可以使用自定義域名。CA證書過期時間設置為100年! 😄
執行sh createCA.sh
創建出CA證書,需要保管好創建出的ca.crt和ca.key文件,不應對外暴露ca.key,必要時還應考慮對ca.key加密。
2、簽署證書腳本signDoamin.sh
#!/bin/bash
mkdir ${1}
cd ${1}
echo "[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
req_extensions = req_ext
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = CN
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = SC
localityName = Locality Name (eg, city)
localityName_default = CD
organizationName = Organization Name (eg, company)
organizationName_default = COMPANY
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = ServerOperation
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_max = 64
commonName_default = ${1}
[ req_ext ]
subjectAltName = @alt_names
[alt_names]
DNS.1 = ${1}
#IP.1 = ${1}
" > san.conf
openssl genrsa -out ${1}.key 4096
openssl req -new -key ${1}.key -out ${1}.csr -config san.conf -sha256
# serial 唯一
serial=$(cat ../CA/serial)
openssl x509 -req -days 18250 -in ${1}.csr -CA ../CA/ca.crt -CAkey ../CA/ca.key -set_serial $((serial+1)) -out ${1}.crt -extfile san.conf -extensions req_ext
echo $((serial+1)) > ../CA/serial
# Useage: sh signDoamin.sh yourdomain.suffix
域名過期時間我設置為50年! 😄
執行sh signDoamin.sh svrops.neiwang.yuming
,創建出域名為svrops.neiwang.yuming的證書。
三、部署證書
1、在服務器端部署web證書
將簽署生成的svrops.neiwang.yuming.crt、svrops.neiwang.yuming.key文件加載至web服務。
2、在客戶端部署CA證書
2.1、客戶端為centos7
將生成的ca.crt文件重命名為neiwang.yuming-CA.crt
,然后拷貝到客戶端centos7系統的/etc/pki/ca-trust/source/anchors/
目錄中。然后執行update-ca-trust
命令使證書生效。注意,如果是使用docker訪問服務器端,則還需要重啟docker服務!(如果docker設置了代理,則要注意將該域名加入NoProxy列表,我就犯了這個低級錯誤,浪費了時間!下同)
2.2、客戶端為ubuntu
將生成的ca.crt文件重命名為neiwang.yuming-CA.crt
,然后拷貝到客戶端ubuntu系統的/usr/local/share/ca-certificates/
目錄中。然后執行update-ca-certificates
命令使證書生效。注意,如果是使用docker訪問服務器端,則還需要重啟docker服務!
2.3、客戶端為windows
將生成的ca.crt文件導入IE、firefox瀏覽器即可。