最近實習需要寫一些生成證書的腳本,借此機會順便搞清楚了許多關于證書這塊的疑惑缭保。說到這一塊東西汛闸,名詞多到爆炸,對稱加密艺骂、非對稱加密诸老、密鑰、密鑰庫钳恕、公鑰别伏、私鑰蹄衷、CA、證書、數(shù)字簽名共螺、ssh萍虽、https、ssl调卑、keytool、openssl大咱、PKCS恬涧、X.509以及令人眼花繚亂的文件后綴名,cer碴巾、crt溯捆、pem、keystore厦瓢、jks提揍、key、p12煮仇、pfx...
先聽我講個故事劳跃,這次我們不用Bob和Alice,聽完之后再去看這些概念,絕壁恍然大悟浙垫。
故事背景:這是2018年刨仑,為了能夠安全的進行通信,假設每個人都有倆把鎖夹姥,一個叫A鎖杉武,一個叫B鎖,這倆把鎖和一般的鎖有點區(qū)別辙售,每把鎖上即帶有自己的鎖孔又帶有另一把鎖的鑰匙轻抱,因此A鎖和B鎖既是鎖又是鑰匙。A鎖和B鎖唯一配對圾亏,A鎖鎖住之后十拣,只有B鎖可以打開,同樣B鎖鎖住之后志鹃,只有A鎖可以打開夭问。其中一把鎖是公開的,而一把鎖則自己保管曹铃,不公開缰趋。假設默認A鎖是公開的,B鎖是私有的。
故事內容:阿里巴巴子弟小學的小明想給隔壁班的小花寫封表白信秘血,為了不被別人看到味抖,他將信放入在信箱中,并用小花的A鎖將信箱鎖住灰粮,因為小花的B鎖(同是A鎖的鑰匙)只有小花自己有仔涩,所以除了小花以外的任何人拿到信件,都無法看到信件內容粘舟。同樣小花要給小明寫信熔脂,那么也要用小明的A鎖對信件內容進行保護。
小明與小花通過就這樣聊了有一段時間柑肴,后來小花覺得差不多了霞揉,可以進入秀恩愛的階段了,跟小明說晰骑,以后寫信別tm加密了适秩,又不是銀行卡密碼,被人看到又能怎么樣呢硕舆?只要看了之后別瞎改就行了秽荞。于是小明在寫完信后,把信里每個字的拼音首字母拼湊了一個字符串抚官,并取名為消息摘要蚂会,然后僅僅將消息摘要放入信箱耗式,用自己的B鎖鎖住這個信箱刊咳。雖然信件本身沒有放入安全的信箱儡司,但小明作為一個情書高手,隨便一封信都是上萬字跷坝,如果其他人對信件內容做任何改變碉碉,那么拼音首字母組成的字符串幾乎肯定會改變,因此小花拿到信件后贴届,先用小明的A鎖(B鎖的鑰匙)打開信箱,拿到小明的摘要,然后小花再對信件內容做同樣的處理(即計算信件每個字的拼音首字母,實際上不會用這么簡單的算法毫蚓,而是會用不可逆的hash算法)占键,計算出的字符串值如與小明的信息摘要一致,說明這封信就是小明寫給自己的元潘,沒有被任何人篡改畔乙。
故事高潮:事情并沒有那么簡單,小花發(fā)現(xiàn)小明只是在信件里對自己熱情似火翩概,平常見了面連聲招呼都不打牲距,一副不認識的樣子。終于有一天小花忍不住了氮帐,當面質問小明嗅虏,小明卻說,我什么時候給你寫情書了上沐,自作多情吧...于是小花把昨天剛收到的情書狠狠甩在了小明臉上:“上面落款不是你小明嗎皮服?怎么了,慫了?”小明一看上面還真是自己的名字参咙,但是自己寫沒寫信自己還不知道嗎龄广?小明把自己的作業(yè)本拿給小花,并叫自己的同桌做筆跡鑒定蕴侧,小花發(fā)現(xiàn)筆跡的確不大像择同,看來是有人惡作劇,冒充小明給自己寫情書净宵,哎敲才,好尷尬啊。紧武。阻星。
故事講完了,文章開頭涉及的所有概念都與信息的安全傳輸有關畦幢,可以說呛讲,一切都是為了安全吗氏。關于通信安全弦讽,我們通常有三個基本的需求
- 通信的數(shù)據(jù)本身是被加密的,第三方即使拿到了數(shù)據(jù)仿村,也是無法輕易破解的密文蔼囊。
- 通信的數(shù)據(jù)本身不加密畏鼓,但是可以確保內容不被篡改
- 能夠驗證通信方身份
我們以上面的故事為例說一下這三點安全需求,一開始小明與小花通過A鎖(對應公鑰)加密,B鎖(對應私鑰)解密的通信方式即符合第一點让禀,信件內容本身被加密,而因為公私鑰唯一配對,只有配對的密鑰才可以解密麻车,因此很難被第三人破解动猬。
之后赁咙,為了秀恩愛彼水,他們采用了B鎖(私鑰)加密链瓦,A鎖(公鑰)解密的通信方式慈俯,其中用私鑰對消息摘要加密后的字符串稱為數(shù)字簽名,這樣雖然信件可以被人直接看到,但如果被人篡改掉后可以輕易發(fā)現(xiàn)數(shù)據(jù)被篡改刑峡。本來以為滿足第一條和第二條就可以安全的通信了氛琢,但最后才發(fā)現(xiàn)小明根本不是小明!為什么會出現(xiàn)這樣的問題撮奏?因為“小明”說他是小明畜吊,小花就以為他是小明,他沒有提供任何證明自己真的是小明的認證捌年。因此要想安全通信礼预,我們還需要一個權威第三方的機構來做身份認證,這個機構就是CA機構褒颈,通過認證后谷丸,CA機構會頒發(fā)權威的證書淤井,而有了證書就可以證明身份,就不會出現(xiàn)身份被假冒的情況漩绵。而認證的過程則需要向CA機構提供自己的身份信息以及私鑰止吐。
對稱加密 VS 非對稱加密
對稱加密就是通信雙方或多方采用的密鑰是一樣的。加解密速度快不同,但不夠安全二拐。因為一旦密鑰泄露,誰都可以對數(shù)據(jù)進行解密饭望。非對稱加密就是當然就是通信雙方使用的密鑰不同杰妓。而公鑰和私鑰就是非對稱加密的一種方式。比較常用的對稱加密算法如
AES验靡、DES高职,非對稱加密比較常見的則有sha256,RSA怔锌。
非對稱加密算法有倆個密鑰,一個公鑰岛杀,一個私鑰类嗤。公鑰和私鑰必須配對出現(xiàn),一對公鑰和一個私鑰統(tǒng)稱為一個密鑰精偿,而密鑰庫中可以存放多個密鑰还最,即多對公私鑰拓轻。
- 公鑰是公開的扶叉,私鑰是保存在自己本地的
- 通信雙方各有一套公鑰和私鑰
- 公鑰加密的數(shù)據(jù)只有私鑰可以解密
- 私鑰加密的數(shù)據(jù)只有公鑰可以解密
如果你用github的話,應該注意到github鏈接有倆種方式达吞。一種是https,一種是ssh,通過https經常需要輸密碼吞鸭,而通過ssh則不需要刻剥≡炻玻回憶你設置ssh的步驟,本地生成了一個密鑰對撵术,并將公鑰上傳到了github嫩与。每次傳輸用自動本地私鑰加密,服務器用你上傳的公鑰解密处坪,就不需要手動輸入密碼了同窘。
keytool VS openssl
keytool和openssl是倆個證書管理工具.keytool是java JDK自帶的證書管理工具,使用keytool可以生成密鑰丧没,創(chuàng)建證書呕童。只要裝了jdk,并正確設置了環(huán)境變量,就可以之間通過命令行執(zhí)行keytool命令來管理證書往声。
openssl則是一個開源的安全套接字層密碼庫,功能比keytool更加豐富撼嗓。
X.509 VS PKCS
PKCS全稱Public-Key Cryptography Standards 即公鑰標準且警,PKCS已經發(fā)布了15個標準。
PKCS#12 包含了公鑰和私鑰的二進制格式的證書形式杏头,以pfx作為證書文件后綴
X.509 則是一個通用的證書標準醇王,規(guī)定了證書應該包含哪些內容,X.509通常有倆種編碼方式棘伴,一種是二進制編碼焊夸,另一種是base64編碼
X.509#DER 二進制格式證書,常用后綴.cer .crt
X.509#PEM 文本格式證書颇象,常用后綴.pem
ssl vs https
因為http是明文傳輸遣钳,非常不安全劝评,因此又提出了ssl(Secure Sockets Layer即安全套接字)層協(xié)議蒋畜,即在原來的基礎上又加了一層協(xié)議用于保障安全傳輸,可以認為https=ssl+http姻成。很多人剛開始接觸https,用瀏覽器F12打開控制臺后才睹±湃粒可能發(fā)現(xiàn)數(shù)據(jù)仍然沒有加密乎澄。要注意https是傳輸層加密置济,瀏覽器F12控制臺你看到的還是應用層的數(shù)據(jù)。
因為本文主要是概念掃盲羞酗,幫助理解檀轨,因此關于這部分具體細節(jié)不作介紹。
各種常見文件后綴
.keystore和.jks和.truststore都是java用來存放密鑰的文件
.key nginx中私鑰文件
而不同的證書文件后綴都是為了區(qū)分不同種類的證書的讹挎,主要有倆個分類維度
- 證書內容是只包含公鑰筒溃,還是即包含公鑰又包含私鑰
如.pfx 和 .p12 即包含公鑰又包含私鑰
.crt浑测、.cer尽爆、.pem只包含公鑰 - 通過編碼格式來區(qū)分
通常.crt和.cer為二進制編碼
.pem為base64編碼
不同的證書格式之間有時候需要轉換,用到時候查對應的openssl或keytool命令就好了槐雾。