如何創(chuàng)建私有 CA 并簽發(fā)證書(shū)

為什么需要自己的 CA?

  • 因?yàn)楣?CA (比如排名前幾的這幾家:Comodo, Symantec, GlobalSign, DigiCert, StartCom)頒發(fā)證書(shū)要收費(fèi),而且價(jià)格很貴。當(dāng)然現(xiàn)在也有了像 Letsencrypt 這樣的免費(fèi) CA。
  • 我們的應(yīng)用是企業(yè)內(nèi)網(wǎng),域名使用私有域名,沒(méi)有辦法使用互聯(lián)網(wǎng)的 CA 辦法的證書(shū)。

基本概念

  • 對(duì)稱(chēng)加密 用相同的密碼進(jìn)行加密加密

  • 非對(duì)稱(chēng)加密 用不同的秘鑰對(duì)進(jìn)行加密解密,這是數(shù)學(xué)上的一個(gè)素?cái)?shù)積求因子的原理的應(yīng)用

  • 公鑰和私鑰 數(shù)字證書(shū)采用公鑰體制,用一對(duì)互相匹配的密鑰進(jìn)行加密、解密。用戶(hù)自己設(shè)定一把特定的僅為本人所知的私鑰,用它進(jìn)行解密和簽名,同時(shí)設(shè)定一把公公鑰并由本人公開(kāi),為一組用戶(hù)所共享,用于加密和驗(yàn)證簽名。

  • 非對(duì)稱(chēng)加密的算法 比較著名的有 RSA, DSA ,RSA 可以用于加/解密,也可以用于簽名驗(yàn)簽,DSA只能用于簽名。

  • 安全哈希算法 SHA 是一種和 MD5 相同的算法,它不是用于加密解密或者簽名的,它被稱(chēng)為摘要算法。就是通過(guò)一種算法,依據(jù)數(shù)據(jù)內(nèi)容生成一種固定長(zhǎng)度的摘要,這串摘要值與原數(shù)據(jù)存在對(duì)應(yīng)關(guān)系,就是原數(shù)據(jù)會(huì)生成這個(gè)摘要,但是這個(gè)摘要是不能還原成原數(shù)據(jù)。這個(gè)算法起的作用就是,如果你修改原數(shù)據(jù),那么生成的摘要會(huì)不同,傳輸過(guò)程中把原數(shù)據(jù)給你再給你一個(gè)摘要,你把得到的原數(shù)據(jù)同樣做一次摘要算法,與給你的摘要相比較就可以知道這個(gè)數(shù)據(jù)有沒(méi)有在傳輸過(guò)程中被修改了。實(shí)際應(yīng)用過(guò)程中,因?yàn)樾枰用艿臄?shù)據(jù)可能會(huì)很大,進(jìn)行加密費(fèi)時(shí)費(fèi)力,所以一般都會(huì)把原數(shù)據(jù)先進(jìn)行摘要,然后對(duì)這個(gè)摘要值進(jìn)行加密,將原數(shù)據(jù)的明文和加密后的摘要值一起傳給你,這樣你解開(kāi)加密后的摘要值,再和你得到的數(shù)據(jù)進(jìn)行的摘要值對(duì)應(yīng)一下就可以知道數(shù)據(jù)有沒(méi)有被修改了,因?yàn)樗借€只有你有,只有你能解密摘要值,所以別人就算把原數(shù)據(jù)做了修改,然后生成一個(gè)假的摘要給你也是不行的,你這邊用密鑰也解不開(kāi)。

  • CA/PEM/DER/X509/PKCS 一般的公鑰不會(huì)用明文傳輸給別人的,正常情況下都會(huì)生成一個(gè)文件,這個(gè)文件就是公鑰文件,然后這個(gè)文件可以交給其他人用于加密,但是傳輸過(guò)程中如果有人惡意破壞,將你的公鑰換成了他的公鑰,然后得到公鑰的一方加密數(shù)據(jù),他就可以用他自己的密鑰解密看到數(shù)據(jù)了,為了解決這個(gè)問(wèn)題,需要一個(gè)公證方來(lái)做這個(gè)事,任何人都可以找它來(lái)確認(rèn)公鑰是誰(shuí)發(fā)的。這就是 CA,CA 確認(rèn)公鑰的原理也很簡(jiǎn)單,它將它自己的公鑰發(fā)布給所有人,然后一個(gè)想要發(fā)布自己公鑰的人可以將自己的公鑰和一些身份信息發(fā)給 CA,CA 用自己的密鑰進(jìn)行加密,這里也可以稱(chēng)為簽名。然后這個(gè)包含了你的公鑰和你的信息的文件就可以稱(chēng)為證書(shū)文件了。這樣一來(lái)所有得到一些公鑰文件的人,通過(guò) CA 的公鑰解密了文件,如果正常解密那么機(jī)密后里面的信息一定是真的,因?yàn)榧用芊街豢赡苁?CA,其他人沒(méi)它的密鑰。這樣你解開(kāi)公鑰文件,看看里面的信息就知道這個(gè)是不是那個(gè)你需要用來(lái)加密的公鑰了。實(shí)際應(yīng)用中,一般人都不會(huì)找 CA 去簽名,因?yàn)槟鞘鞘斟X(qián)的,所以可以自己做一個(gè)自簽名的證書(shū)文件,就是自己生成一對(duì)密鑰,然后再用自己生成的另外一對(duì)密鑰對(duì)這對(duì)密鑰進(jìn)行簽名,這個(gè)只用于真正需要簽名證書(shū)的人,普通的加密解密數(shù)據(jù),直接用公鑰和私鑰來(lái)做就可以了。

  • 密鑰文件的格式 用OpenSSL生成的就只有 PEM 和 DER 兩種格式,PEM 的是將密鑰用 base64 編碼表示出來(lái)的,直接打開(kāi)你能看到一串的英文字母,DER 格式是二進(jìn)制的密鑰文件。X509 是通用的證書(shū)文件格式定義。PKCS 的一系列標(biāo)準(zhǔn)是指定的存放密鑰的文件標(biāo)準(zhǔn),PEM、DER、X509、PKCS這幾種格式可以互相轉(zhuǎn)化

創(chuàng)建私有 CA 并簽發(fā)證書(shū)

操作環(huán)境

Ubuntu 16.04.4 LTS (GNU/Linux 4.15.0-30-generic x86_64)
OpenSSL 1.0.2g  1 Mar 2016
  1. 將openssl.cnf 配置文件拷貝到當(dāng)前目錄下并創(chuàng)建以下在配置文件中指定的子文件夾,index.txt 為空,serial 必須寫(xiě)入內(nèi)容,且為字符串格式的數(shù)字(比如1000)
# 準(zhǔn)備好目錄和環(huán)境
mkdir cert
cd cert
mkdir demoCA
cd demoCA
mkdir srl certs newcerts
touch index.txt serial
echo 1000 > serial
cd ..
cp /usr/lib/ssl/openssl.cnf .
  1. 生成根證書(shū)
mkdir ca
# 生成根證書(shū)私鑰(key文件)
openssl genrsa -out ca/ca.key 2048
# 生成根證書(shū)簽發(fā)申請(qǐng)文件(csr文件)
openssl req -new -key ca/ca.key -out ca/ca.csr -config ./openssl.cnf
# 自簽發(fā)根證書(shū)(crt文件)
openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey ca/ca.key -in ca/ca.csr -out ca/ca.crt
  1. 用根證書(shū)簽發(fā)server端證書(shū)
mkdir server
# 生成根證書(shū)私鑰(key文件)
openssl genrsa -out server/server.key 2048
# 生成根證書(shū)簽發(fā)申請(qǐng)文件(csr文件)
openssl req -new -key server/server.key -out server/server.csr -config ./openssl.cnf
# 使用根證書(shū)簽發(fā)服務(wù)端證書(shū)
openssl ca -in server/server.csr -out server/server.crt -cert ca/ca.crt -keyfile ca/ca.key -config ./openssl.cnf
# 將密鑰和證書(shū)合并成一個(gè)文件
cp server/server.key server/server.pem
cat server/server.crt >> server/server.pem
  1. 創(chuàng)建客戶(hù)端證書(shū)
mkdir client 
openssl genrsa -aes256 -out client/client.key 2048
openssl req -new -key client/client.key -out client/client.csr -config ./openssl.cnf
openssl ca -in client/client.csr -out client/client.crt -cert ca/ca.crt -keyfile ca/ca.key -config ./openssl.cnf
cp client/client.key client/client.pem
cat client/client.crt >> client/client.pem
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容