RSA的主場-證書籤名&OpenSSL演示

小可長江發表於2019-01-09

 在上一篇非對稱加密--RSA原理淺析中,我們瞭解了RSA加密的數學原理,RSA的安全性目前雖然得到公認,但它同樣也有缺點:加密速度慢、效能較低,不適合對大檔案直接做加密,需要加密的原始資料通常會先經過Base64Hash對稱加密等處理後,再用RSA對其進行加密,因此RSA最主要的應用場景,是數字簽名--對資料做身份/合法性校驗。
 權威的證照頒發機構--躺著賺錢的CA,就是用的RSA這一套演算法,這一篇我們一起用命令列來逐步拆解證照的生成過程,揭開證照背後的祕密。Talk is cheap,show you the code,Come on!

RSA的主場-證書籤名&OpenSSL演示

什麼是OpenSSL

 SSL大家都不陌生,我們訪問網站的時候,以HTTPS開頭的表示你和伺服器之間傳輸的資料經過了加密,這裡所使用的加密協議就是SSL(Secure Sockets Layer,後來又推出了它的後續版本,改名叫TLS)。也就是說,把HTTP協議經過一層SSL協議進行加密包裝,就變成了HTTPS。當然,SSL/TLS還用在很多協議中,例如VPN、加密的電子郵件協議等。
 那OpenSSL是啥?在SSL協議中,我們使用了很多密碼學手段來保護資料,其中包括對稱密碼、公鑰密碼、數字簽名、證照、完整性校驗、偽隨機數生成等。由於這些演算法和操作都非常複雜,於是開源社群就開發了一套庫,這個庫裡面提供了很多現成的標準方法,其他開發者只要用正確呼叫這些方法,就可以實現SSL協議中的各種加密/解密操作了。因此,OpenSSL是一套開源的密碼學工具包(open source cryptography toolkit)。情理之中的,OpenSSL也支援了RSA演算法,接下來我們就用OpenSSL在macOS的終端上為大家演示證照籤名的每一個步驟。

RSA加密、證照生成終端演示

 為了便於觀察,請開闢並前往一個空資料夾下開始你的表演~
輸入:

openssl genrsa -out private.pem 2048
複製程式碼

此時目錄中出現一個private.pem檔案,這個檔案包含了私鑰資訊
根據私鑰生成公鑰
輸入:

openssl rsa -in private.pem -pubout -out public.pem
複製程式碼

分別檢視檔案中的內容:

cat private.pem
複製程式碼
cat public.pem
複製程式碼

你會得到這樣類似這樣的結果:

-----BEGIN RSA PRIVATE KEY-----
Base64編碼的內容
-----END RSA PRIVATE KEY-----
複製程式碼
-----BEGIN PUBLIC KEY-----
Base64編碼的內容
-----END PUBLIC KEY-----
複製程式碼

現在我們隨便寫一個txt檔案作為要加密的資料:

echo "hello word\!" > message.txt
複製程式碼

用公鑰對其加密:

openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt
複製程式碼

檢視加密後的檔案:cat enc.txt,你只能看到一堆亂碼
用私鑰對加密檔案解密:

openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
複製程式碼

檢視解密結果:cat dec.txt,與你的message.txt內容完美吻合~
上面的過程反過來(私鑰加密 公鑰解密)一個道理,但執行命令有點區別:
用私鑰對其加密:

openssl rsautl -sign -in message.txt -inkey private.pem -out enc.bat
複製程式碼

用公鑰對加密檔案解密:

openssl rsautl -verify -in enc.bat -inkey public.pem -pubin -out dec.txt
複製程式碼

 至此,我們已經完成了RSA加密解密的操作,那我們開發中用的證照跟它們有什麼關係呢?做iOS開發的都用鑰匙串從CA請求過csr檔案,其實就是根據當前Mac內建的私鑰(當然你也可以自己指定私鑰)生成對應的公鑰,生成的csr檔案包含了公鑰證照原始檔案+你的伺服器資訊和單位等資訊。我們來用命令執行這一步操作:

openssl req -new -key private.pem -out rsacert.csr
複製程式碼

根據提示依次輸入下列資訊並回車:

Country Name (2 letter code) []:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []:
Email Address []:
A challenge password []:
複製程式碼

拿到帶著公鑰資訊的csr檔案之後,下一步就是交給CA認證中心進行簽名,也就是讓CA蓋個章(一個章一年五千大洋@_@,如果你的https用自籤的證照那別人訪問時有不安全提示就是因為你沒有CA蓋的這個章,不被承認是安全的):

openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
複製程式碼

這時得到的crt檔案是Base64編碼的,我們需要轉成DER二進位制格式的證照才能直接使用:

openssl x509 -outform der -in rsacert.crt -out rsacert.der
複製程式碼

這個rsacert.der檔案就是包含了我們公鑰資訊的證照!

RSA的主場-證書籤名&OpenSSL演示
最後一步,匯出公鑰證照對應的私鑰證照:

openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt
複製程式碼

RSA的主場-證書籤名&OpenSSL演示
輸入兩次私鑰證照的密碼就得到了我們最熟悉的.p12檔案。
 當然,在我們實際開發中不會同時拿到這兩個證照,這裡只是給大家演示它們之間的關係,後面我會對蘋果的雙向驗證(雙層簽名)原理專門寫一篇文章講解

補充

 關於.pem檔案內部的資料結構可以通過命令

openssl rsa -in private.pem -text -out ptivate.txt
複製程式碼

檢視,ptivate.txt檔案中每一項的具體意義請參考(PEM格式)解析
 在上面的命令中如果有些不明覺厲的玩意兒,那多半是你對證照相關的檔案編碼格式、協議和副檔名不太熟悉,不要慌,我已經為你準備好了加餐,記得別隻默默收藏吖!關注點贊不迷路~
\(^o^)/

證照檔案編碼格式、副檔名、協議科普---高能預警

 我們統一採用X.509的格式標準生成證照,接觸過證照的同學看到:pem、der、pfx、jks、kdb、cer、key、csr、crt、crl、ocsp、scep等這些字眼一定不會完全陌生,這些東東究竟是個啥?趕緊來一探究竟,有描述不準確的地方還望指正:

  • 編碼格式
    • DER:(Distinguished Encoding Rules)的縮寫,它是大多數瀏覽器的預設格式,並按 ASN1 DER 格式儲存,它是無報頭的。可包含所有私鑰、公鑰和證照。
    • PEM:(Privacy Enhanced Mail)的縮寫,它是OpenSSL預設採用的資訊存放方式,它儲存用Base64編碼的DER格式資料,用ASCII報頭包圍,因此適合系統之間的文字模式傳輸。可以包括所有私鑰、公鑰和證照。
  • 副檔名
    • .pem - (隱私增強型電子郵件) DER編碼的證照再進行Base64編碼的資料存放在"-----BEGIN CERTIFICATE-----"和"-----END CERTIFICATE-----"之中
    • .cer, .crt, .der - 通常是DER二進位制格式的證照,但Base64編碼後也很常見
    • .p7b, .p7c - PKCS#7 SignedData structure without data, just certificate(s) or CRL(s),加密訊息語法(pkcs7),是各種訊息存放的格式標準。這些訊息包括:資料、簽名資料、數字信封、簽名數字信封、摘要資料和加密資料。
    • .p12 - PKCS#12格式,包含證照的同時可能還有帶密碼保護的私鑰
    • .pfx - PFX,PKCS#12之前的格式(通常用PKCS#12格式,比如那些由IIS產生的PFX檔案)
    • .jks - 通常可以將Apache/OpenSSL使用的“.key檔案 + .crt檔案”格式轉換為標準的Java Key Store(JKS)檔案。JKS檔案格式被廣泛的應用在基於JAVA的WEB伺服器、應用伺服器、中介軟體。你可以將JKS檔案匯入到TOMCAT、WEBLOGIC 等軟體
    • .kdb - 通常可以將Apache/OpenSSL使用的“.key檔案 + .crt檔案”格式轉換為標準的IBM KDB檔案。KDB檔案格式被廣泛的應用在IBM的WEB伺服器、應用伺服器、中介軟體。你可以將KDB檔案匯入到IBM HTTP Server、IBM Websphere 等軟體
    • .csr - 證照請求檔案(Certificate Signing Request)。生成X509數字證照前,一般先由使用者提交證照申請檔案,然後由 CA 來簽發證照。
    • .key - 一般指PEM格式的私鑰檔案,也可能是DER格式的
    • .crl - 證照吊銷列表 (Certification Revocation List)是一種包含撤銷的證照列表的簽名資料結構。CRL是證照撤銷狀態的公佈形式,CRL 就像信用卡的黑名單,用於公佈某些數字證照不再有效。CRL是一種離線的證照狀態資訊。它以一定的週期進行更新。CRL可以分為完全CRL和增量CRL。在完全CRL中包含了所有的被撤銷證照資訊,增量CRL由一系列的CRL來表明被撤銷的證照資訊,它每次釋出的CRL是對前面釋出CRL的增量擴充。基本的CRL資訊有:被撤銷證照序列號、撤銷時間、撤銷原因、簽名者以及 CRL 簽名等資訊。基於CRL的驗證是一種不嚴格的證照認證。CRL能證明在CRL中被撤銷的證照是無效的。但是,它不能給出不在CRL中的證照的狀態。如果執行嚴格的認證,需要採用線上方式進行認證,即OCSP認證。一般是由CA簽名的一組電子文件,包括了被廢除證照的唯一標識(證照序列號),CRL用來列出已經過期或廢除的數字證照。它每隔一段時間就會更新,因此必須定期下載該清單,才會取得最新資訊
  • 協議
    • OCSP – 線上證照狀態協議(Online Certificate Status Protocol,rfc2560),用於實時表明證照狀態。OCSP 客戶端通過查詢 OCSP 服務來確定一個證照的狀態,可以提供給使用者一個或多個數字證照的有效性資料,它建立一個可實時響應的機制,讓使用者可以實時確認每一張證照的有效性,解決由CRL引發的安全問題。。OCSP 可以通過 HTTP協議來實現。rfc2560 定義了 OCSP 客戶端和服務端的訊息格式
    • SCEP - 簡單證照註冊協議(Simple Certificate Enrollment Protocol),基於檔案的證照登記方式需要從您的本地計算機將文字檔案複製和貼上到證照釋出中心,和從證照釋出中心複製和貼上到您的本地計算機。SCEP可以自動處理這個過程但是CRLs仍然需要手動的在本地計算機和CA釋出中心之間進行復制和貼上

實踐出真知,我們下篇再會~ 老規矩,有問題請踴躍留言。

更多一手好文更新
請關注我的個人微信公眾號:面向未來程式設計
撒花✧(≖ ◡ ≖✿)

相關文章