為什么需要自己的 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
- 將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 .
- 生成根證書(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
- 用根證書(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
- 創(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