1 概念
數字證書是一個經證書授權中心數字簽名的包含公開密鑰擁有者信息以及公開密鑰的文件。最簡單的證書包含一個公開密鑰、名稱以及證書授權中心的數字簽名。數字證書還有一個重要的特征就是只在特定的時間段內有效。數字證書是一種權威性的電子文檔,可以由權威公正的第三方機構,即CA(例如中國各地方的CA公司)中心簽發的證書,也可以由企業級CA系統進行簽發。
一般證書分有三類,根證書、服務器證書和客戶端證書。根證書,是生成服務器證書和客戶端證書的基礎,是信任的源頭,也可以叫自簽發證書,即CA證書。服務器證書,由根證書簽發,配置在服務器上的證書。客戶端證書,由根證書簽發,配置在服務器上,並發送給客戶,讓客戶安裝在瀏覽器里的證書。
接下來,認識了證書的基本概念之后,我們來認識下這幾個概念,公鑰/私鑰/簽名/驗證簽名/加密/解密/對稱加密/非對稱加密。
我們一般的加密是用一個密碼加密文件,然后解密也用同樣的密碼。這很好理解,這個是對稱加密。而有些加密時,加密用的一個密碼,而解密用另外一組密碼,這個叫非對稱加密,意思就是加密解密的密碼不一樣。其實這是數學上的一個素數積求因子的原理應用,其結果就是用這一組密鑰中的一個來加密數據,用另一個來解密,或許有人已經想到了,沒錯這就是所謂的公鑰和私鑰。公鑰和私鑰都可以用來加密數據,而他們的區別是,公鑰是密鑰對中公開的部分,私鑰則是非公開的部分。公鑰加密數據,然后私鑰解密的情況被稱為加密和解密;私鑰加密數據,公鑰解密一般被稱為簽名和驗證簽名。其中簽名和驗證簽名就是我們本文需要說明和用到的,因為證書的生成過程中就需要簽名,而證書的使用則需要驗證簽名。
2 環境
一般linux系統是安裝了openssl的,本文的linux系統是centos 7,openssl版本是OpenSSL 1.0.2k。可以通過以下命令來驗證是否安裝了openssl,或者查看當前openssl的版本。
openssl version -a
3 創建根證書CA
(1)查看openssl的配置文件openssl.cnf的存放位置(即openssl的安裝位置)
openssl version -a
(2)查看openssl的配置文件openssl.cnf,因為配置文件中對證書的名稱和存放位置等相關信息都做了定義。
vim /etc/pki/tls/openssl.cnf
3)創建為根證書CA所需的目錄及文件
#根據配置文件信息,到CA根目錄,若沒有則自己創建 cd /etc/pki/CA #創建配置文件信息中所需的目錄及文件 mkdir -pv {certs,crl,newcerts,private} touch {serial,index.txt}
(4)指明證書的開始編號
echo 01 >> serial
(5)生成根證書的私鑰(注意:私鑰的文件名與存放位置要與配置文件中的設置相匹配)。
(umask 077; openssl genrsa -out private/cakey.pem 2048)
參數說明:
genrsa --產生rsa密鑰命令
-aes256--使用AES算法(256位密鑰)對產生的私鑰加密,這里沒有此參數,則只是用了rsa算法加密。
-out ---輸出路徑,這里指private/ca.key.pem
這里的參數2048,指的是密鑰的長度位數,默認長度為512位
(6)生成自簽證書,即根證書CA,自簽證書的存放位置也要與配置文件中的設置相匹配,生成證書時需要填寫相應的信息。
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out cacert.pem -days 365
參數說明:
-new:表示生成一個新證書簽署請求
-x509:專用於CA生成自簽證書,如果不是自簽證書則不需要此項
-key:用到的私鑰文件
-out:證書的保存路徑
-days:證書的有效期限,單位是day(天),默認是openssl.cnf的default_days
這樣 cacert.pem 文件已生成
4 頒發證書
在需要證書的服務器上生成私鑰,然后通過此私鑰生成證書簽署請求,最后將請求通過可靠的方式發送給根證書CA的主機。根證書CA服務器在拿到證書簽署請求后,即可頒發那一服務器的證書。
4.1 在需要證書的服務器上,生成證書簽署請求
(1)生成私鑰,該私鑰的位置可隨意定
(umask 077; openssl genrsa -out test.key 2048)
(2)生成證書簽署請求
openssl req -new -key test.key -out test.csr -days 365
4.2 在根證書服務器上,頒發證書
(1)頒發證書,即簽名證書,生成crt文件
#頒發證書 openssl ca -in /etc/pki/CA/test.csr -out /etc/pki/CA/test.crt -days 365
#查看證書信息 openssl x509 -in /etc/pki/CA/test.crt -noout -serial -subject
(2)格式轉換為pfx格式的私鑰
openssl pkcs12 -export -out test.pfx -inkey /etc/pki/CA/test.key -in test.crt
注意,-inkey的值test.key是需要證書服務器上生成的私鑰key文件。
(3)格式轉換為cer格式的公鑰
openssl x509 -inform pem -in test.crt -outform der -out test.cer #查看cer證書信息 openssl x509 -in test.cer -text -noout #若報錯unable to load certificate,則說明你打開的證書編碼是der格式,需要用以下命令 openssl x509 -in test.cer -inform der -text -noout
參數含義:
-inform pem,由於輸入的test.crt文件是以pem編碼的,故需要指定以pem編碼來讀取。
-outform der,輸出的test.cer文件需要以der編碼。
至此,服務器的證書頒發就完成了。