當(dāng)我們需要在企業(yè)內(nèi)部或者測試環(huán)境中使用證書時(shí)蜜自,往往需要?jiǎng)?chuàng)建自簽名證書。Linux系統(tǒng)中的Openssl工具可以用來生成自簽名證書舟舒,實(shí)現(xiàn)通信的加密,也可以基于自簽名的CA證書模擬實(shí)際CA信任鏈的工作過程瞭吃。本文基于Openssl介紹自簽名證書的生成和應(yīng)用實(shí)踐。
自簽名證書分為自簽名私有證書和自簽名CA證書兩種涣旨。自簽名私有證書無法被吊銷歪架,自簽名CA證書可以被吊銷。能不能吊銷證書的區(qū)別在于如果私鑰不小心被惡意獲取霹陡,如果證書不能被吊銷那么黑客很有可能偽裝成受信任的客戶端與用戶進(jìn)行通信和蚪。如果你的規(guī)劃需要?jiǎng)?chuàng)建多個(gè)客戶端證書,那么使用自建 CA 簽名證書的方法比較合適烹棉,只要給所有的客戶端都安裝了 CA 根證書攒霹,那么以該 CA 根證書簽名過的客戶端證書都是信任的,不需要重復(fù)的安裝客戶端證書浆洗。
請(qǐng)注意由于是自建 CA 證書催束,在使用這個(gè)臨時(shí)證書的時(shí)候,會(huì)在客戶端瀏覽器報(bào)一個(gè)錯(cuò)誤伏社,簽名證書授權(quán)未知或不可(signing certificate authority is unknown and not trusted.)抠刺,但只要配置正確,繼續(xù)操作并不會(huì)影響正常通信摘昌。 自簽名證書的 Issuer 和 Subject 是一樣的速妖。下面就分別闡述如何使用 OpenSSL 生成這兩種自簽名證書。
生成自簽名私有證書
- 生成證書私鑰(Key)
#生成私鑰
openssl genrsa -out /path/to/keyfile 2048
2. 如果需要備份或者轉(zhuǎn)移私鑰第焰,需要先對(duì)私鑰進(jìn)行加密
#私鑰加密买优,用于備份或者轉(zhuǎn)移私鑰
openssl rsa -in /path/to/keyfile -des3 -out /path/to/encrypted.key
3. 生成證書請(qǐng)求文件(Certificate Sign Request)
生成 CSR 的過程中,會(huì)提示輸入一些信息挺举,包括:序列號(hào)杀赢、公鑰、用戶名稱湘纵、簽發(fā)者脂崔、CA簽名和其他一些附屬信息等。證書驗(yàn)證過程就是依賴于這信息和公鑰對(duì)應(yīng)的私鑰進(jìn)行梧喷。其中一個(gè)提示是 Common Name (e.g. YOUR name)砌左,這個(gè)非常重要,這一項(xiàng)應(yīng)填入 FQDN(Fully Qualified Domain Name)完全合格域名/全稱域名铺敌,如果您使用 SSL 加密保護(hù)網(wǎng)絡(luò)服務(wù)器和客戶端之間的數(shù)據(jù)流汇歹,舉例被保護(hù)的網(wǎng)站是 https://test.example.cn
,那么此處 Common Name 應(yīng)輸入 test.example.cn
#生成證書請(qǐng)求文件(Certificate sign request)
openssl req -new -key /path/to/keyfile -out /path/to/csrfile
4. 使用上一步的證書簽名請(qǐng)求簽發(fā)證書(Certificate)
#自簽名偿凭,生成私有證書
openssl x509 -req -in /path/to/ssl.csr -signkey /path/to/ssl.key -out /path/to/ssl.crt
5. 查看證書信息
#查看證書信息
openssl x509 -in /path/to/certfile -noout -text
上面的1-4步也可以通過命令行合并為一步實(shí)現(xiàn)
openssl req -new -x509 -newkey rsa:2048 -keyout /path/to/server.key -out /path/to/server.crt
生成自簽名CA證書
創(chuàng)建自簽 CA 證書产弹,主要分為兩個(gè)部分: 創(chuàng)建CA 根證書及簽發(fā)客戶端證書。
創(chuàng)建CA根證書
使用 OpenSSL 可以創(chuàng)建自己的 CA弯囊,給需要驗(yàn)證的用戶或服務(wù)器頒發(fā)證書痰哨,這就需要?jiǎng)?chuàng)建一個(gè) CA 根證書胶果。默認(rèn)情況ubuntu和CentOS上都已安裝好openssl。CentOS 6.x 上有關(guān)ssl證書的目錄結(jié)構(gòu)斤斧。
/etc/pki/CA/
newcerts 存放CA簽署(頒發(fā))過的數(shù)字證書(證書備份目錄)
private 用于存放CA的私鑰
crl 吊銷的證書
/etc/pki/tls/
cert.pem 軟鏈接到certs/ca-bundle.crt
certs/ 該服務(wù)器上的證書存放目錄早抠,可以房子自己的證書和內(nèi)置證書
ca-bundle.crt 內(nèi)置信任的證書
private 證書密鑰存放目錄
openssl.cnf openssl的CA主配置文件
在創(chuàng)建 CA 根證書之前,需要做好如下準(zhǔn)備工作:修改好 CA 的配置文件撬讽、序列號(hào)蕊连、索引等等。
touch index.txt serial
echo 01 >> serial
openssl的配置文件為openssl.cnf,一般存儲(chǔ)在/etc/pki/tls/目錄下锐秦。一定要注意配置文件中 [ policy_match ]標(biāo)簽下設(shè)定的匹配規(guī)則咪奖。有可能因?yàn)樽C書使用的工具不一樣,導(dǎo)致即使設(shè)置了csr中看起來有相同的countryName,stateOrProvinceName等酱床,但在最終生成證書時(shí)依然報(bào)錯(cuò)羊赵。一般情況下,配置文件不需要改動(dòng)扇谣。
- 生成根證書密鑰
# 生成CA根證書密鑰
cd /etc/pki/CA/
openssl genrsa -out ./private/ca.key 2048
2. 生成根證書請(qǐng)求
# 新建根證書請(qǐng)求
openssl req -new -in /path/to/ca.key -out ca.csr
3. 生成根證書
#自簽名昧捷,生成CA證書
openssl x509 -req -in /path/to/ca.csr -signkey /path/to/ca.key -extensions v3_ca -out /path/to/ca.crt
簽發(fā)證書
我們可以用CA根證書簽發(fā)證書,也可以創(chuàng)建中間CA罐寨,使用中間CA簽發(fā)證書靡挥。創(chuàng)建中間CA的好處是即使中間CA的私鑰泄露,造成的影響也是可控的鸯绿,我們只需要使用root CA撤銷對(duì)應(yīng)中間CA的證書即可跋破。此外root CA的私鑰可以脫機(jī)妥善保存,只需要在撤銷和更新中間CA證書時(shí)才會(huì)使用瓶蝴《痉担基于根證書創(chuàng)建中間CA與創(chuàng)建根證書過程類似。我們新建一個(gè)目錄用于保存中間證書信息舷手。
#準(zhǔn)備環(huán)境
mkdir /etc/pki/CA/intermediate
cd /etc/pki/CA/intermediate
mkdir certs crl newcerts private
chmod 700 private
touch index.txt
echo 1000 > serial
#生成密鑰
cd /etc/pki/CA
openssl genrsa -aes256 -out intermediate/private/ca.key 2048
#新建請(qǐng)求
openssl req -config intermediate_CA.cnf -sha256 -new -key intermediate/private/ca.key -out intermediate/certs/ca.csr
#簽發(fā)中間CA證書
openssl ca -config root_CA.cnf -extensions v3_ca -notext -md sha256 -in intermediate/certs/ca.csr -out intermediate/certs/ca.cert
利用根證書或者中間證書簽發(fā)客戶端證書的步驟如下:
- 新建證書密鑰
#新建密鑰
openssl genrsa -out /path/to/server.key 2048
2. 新建證書請(qǐng)求
#新建證書請(qǐng)求
openssl req -new -in /path/to/server.key -out /path/to/server.csr
3. CA簽發(fā)證書
#證書CA簽名
openssl x509 -req -in /path/to/server.csr -CA /path/to/ca.crt -CAkey /path/to/ca.key -CAcreateserial -out /path/to/server.crt
4. CA證書的有效性驗(yàn)證
#驗(yàn)證證書
openssl verify -CAfile /path/to/ca.crt /path/to/server.crt
#如果結(jié)果顯示OK拧簸,說明我們頒發(fā)的證書是有效的。
不同客戶端證書格式轉(zhuǎn)換
#crt,pem格式證書可用于linux/nginx/node.js格式客戶端
#p12(pkcs12)格式證書用于tomcat/java/android客戶端
#打包為p12證書
openssl pkcs12 -export -in /path/to/server.crt -inkey /path/to/server.key -out /path/to/server.p12
吊銷證書
當(dāng)證書已經(jīng)不再使用或者密鑰泄露時(shí)男窟,我們需要吊銷證書來保證服務(wù)器的安全盆赤。
#獲取要吊銷的證書的serial
openssl x509 -in /path/to/x.crt -noout -serial -subject
#對(duì)比serial與subject 信息是否與index.txt中的信息一致
#如果一致,則可以吊銷證書
openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
#如果是第一次吊銷證書歉眷,需要指定吊銷的證書編號(hào)
echo 01 >/etc/pki/CA/crlnumber
#更新吊銷證書列表
openssl ca -gencrl -out /etc/pki/CA/crl.pem
#完成后牺六,可查看吊銷的證書列表
openssl crl -in /etc/pki/CA/crl.pem -noout -text