在網上經常看到自建CA和自簽證書文檔,但是發現自己生成之后,將ca證書導入客戶端之后,Chrome訪問網站總是會出現如下錯誤:
NET::ERR_CERT_COMMON_NAME_INVALID
此服務器無法證實它就是 domain.com - 它的安全證書沒有指定主題備用名稱。這可能是因為某項配置有誤或某個攻擊者攔截了您的連接。一直以為是Chrome瀏覽器安全強度太高導致的,因為發現Firefox和IE沒有這個問題,但是后來才發現自簽證書有缺陷。
一、安裝依賴
利用 OpenSSL 簽發自然是需要 OpenSSL 軟件及庫,一般情況下 CentOS、Ubuntu 等系統均已內置,可執行 openssl 確認,如果出現 oepnssl: command not found 說明沒有內置,需要手動安裝,以 CentOS 為例,安裝命令如下:
[root@CA ~]# yum install openssl openssl-devel -y
修改openssl.cnf配置文件
[root@CA ~]# vim /etc/pki/tls/openssl.cnf
dir=/etc/pki/CA
創建相關的文件
[root@CA ~]# cd /etc/pki/CA
[root@CA ~]# mkdir certs newcerts crl
[root@CA ~]# touch index.txt
[root@CA ~]# echo 01 > serial
在 openssl.cnf 文件中還有很多實用的配置,比如生成證書請求文件(csr)用到的 countryName_default(默認國家)、stateOrProvinceName_default(默認省份)、localityName_default(默認城市)等等,在文件中設置好后續自簽證書可以省去輸入的步驟,視需求修改。
二、自建CA
2.1 生成根密鑰
[root@CA ~]# (umask 077; openssl genrsa -out private/cakey.pem 2048)
2.2 生成根CA證書
[root@CA ~]# openssl req -x509 -new -key private/cakey.pem -out cacert.pem -days 3650
以上CA服務器搭建完成
三、頒發證書
3.1 創建證書請求
#先為網站生成一對密鑰
[root@web ~]# (umask 077; openssl genrsa -out http.key 2048 )
#生成證書頒發請求.csr
[root@web ~]# openssl req -new -key http.key -out http.csr
#將此請求文件(http.csr)傳遞給CA服務器
3.2 附加用途
解決Chrome不能識別證書通用名稱NET::ERR_CERT_COMMON_NAME_INVALID錯誤
[root@CA ~]# vim http.ext
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName=@SubjectAlternativeName
[ SubjectAlternativeName ]
IP.1=192.168.1.1
IP.2=192.168.1.2
與簽發域名證書的區別(也是與其他教程的區別)就在於此步驟,在 不改 openssl.cnf 的情況 (方便簽發不同證書)下如果是要簽發 IP 證書必須參照上述格式執行此步驟。
如果要通過 修改 openssl.cnf 來簽發證書,除將上述配置直接改到 openssl.cnf 相應位置外,必須將配置中的 basicConstraints = CA:FLASE 改為 basicConstraints = CA:TRUE,否則修改不生效,這是其他教程沒有提到的。
如果是域名證書,也可以在此可以添加多域名,如:
[root@CA ~]# vim http.ext
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName=@SubjectAlternativeName
[ SubjectAlternativeName ]
DNS.1=test.com
DNS.2=www.test.com
extendedKeyUsage 可以指定證書目的,即用途,一般有:
serverAuth:保證遠程計算機的身份
clientAuth:向遠程計算機證明你的身份
codeSigning:確保軟件來自軟件發布者,保護軟件在發行后不被更改
emailProtection:保護電子郵件消息
timeStamping:允許用當前時間簽名數據
如果不指定,則默認為 所有應用程序策略
3.3 簽發證書
CA服務器簽署頒發此證書
[root@CA ~]# openssl ca -in http.csr -out http.crt -days [number]
或者
[root@CA ~]# openssl x509 -req -days 365 -in http.csr -signkey http.key -out http.crt
或者(需要事前定義好http.ext中的內容,該操作Chrome不會報錯)
[root@CA ~]# openssl x509 -req -in http.csr -CA /etc/pki/CA/cacert.pem -CAkey /etc/pki/CA/private/cakey.pem -CAcreateserial -out http.crt -days 3650 -sha256 -extfile http.ext
CA服務器再將簽署好的證書發送給客戶端
注:后續用戶訪問時需要將上述生成的cakey.pem導入瀏覽器或者導入系統中,再次訪問域名證書就正常了。 |
四、問題排查
1.問題:TXT_DB error number 2
解決:原因是已經生成了同名證書,將 common name 設置成不同,或修改 CA 下的 index.txt.attr,將 unique_subject = yes 改為 unique_subject = no