TLS/SSL 協議詳解 (7) SSL 數字證書的一些細節2
證書格式
編碼格式
證書編碼格式多種,但是不要根據檔案字尾名(der,cer)等區分證書格式。
總的來說,證書分為2種,一種是二進位制的、一種是進行base64編碼的證書。前者使用notepad或者任意文字編輯器開啟,顯示亂碼,後者則顯示正常的base64編碼後的資料。下圖為經過base64編碼後的證書,由BEGAIN和END包括。(老司機可能就發現了,有點像長了一點的迅雷下載連結)
至於是否換行完全取決於習慣,但是我的確也碰到過有些解析程式要求一行不能超過特定字元。
所謂二進位制證書,也就是原始的asn1格式的證書,如果熟悉asn1編碼方式,直接看2進位制會看到明顯的’30 82 ...’等asn1的型別長度標識,這裡不再贅述,但是二進位制不適合網路傳輸,所以普遍採用base64將其編碼。
其次還有一種格式叫pfx(PKCS12)格式的證書,與其說是證書,不如叫它證書+私鑰的package比較合適,一個檔案即包含證書(證書鏈),也包含私鑰。pfx本身可被加密,所以可能需要輸入金鑰才能解析pfx。
另一種證書格式稱之為p7b,他是多個證書組織成的格式(一般是證書鏈)。在windows下可以由windows自帶程式解析,我們可以提取出其中各個證書。
私鑰格式 私鑰格式也分為二進位制和base64編碼,不再贅述。
但是私鑰本身可以被加密。
被加密的私鑰格式如下
當採用pfx格式證書時,由於pfx格式檔案本身可能需要金鑰來解密,而裡面的私鑰也可能需要金鑰解密,所以解析程式往往可能讓你輸入2個金鑰,這2個金鑰是用來解密不同層級資料的,注意不要感到疑惑或者將兩者混淆。
證書型別
簽名演算法一般採用RSA或者ECC。較老的有DH演算法等,目前已不多見。
但是注意,被稱為RSA證書並不是指證書是被RSA演算法簽名的,而是指證書本身的公鑰、私鑰是RSA。同理ECC證書指的是證書的公鑰和私鑰具有橢圓曲線屬性。證書的簽名值並不影響證書的屬性。
例如,上級證書A是ECC證書,即證書公鑰私鑰是ECC屬性的,那麼由它生產的證書B的簽名必然採用ECC簽名,但是B本身可以使用RSA公鑰私鑰或者ECC公鑰私鑰。
證書拓展
使用wireshark解析SSL證書,我們可以清晰的看到數字證書各個欄位,這裡我們關心證書中的extension
1:keyusage/extkeyusage
用以描述證書的用法,改證書可以進行證書的簽發?CRL的簽發?客戶端認證?伺服器認證?一般嚴格的CA機構都謹慎設定這個欄位,避免自己簽發的證書被濫用。
2:subectkeyidentifier
自己公鑰進行hash運算後的值,可以快速判斷證書。
3:authoritykeyidentifier
上級證書的公鑰進行hash運算後的值。一般來說,兩個上下級關係的證書,下級證書的authoritykeyidentifier值就是上級證書的subectkeyidentifier值。
4:subjectAltname
證書的別名。例如一個網站有多個域名,例如www.baidu.com和www.hao123.com對應的都是一個伺服器,common name只能寫一個,為了不讓瀏覽器告警,可以在subjectAltname拓展中新增這個網站的其他域名。瀏覽器收到這個證書,除了判斷host和common name是否一致外,也會判斷host和subjectAltname是否有一致項,有的話就成功。
5:basicConstraints