1. 程式人生 > 其它 >CA證書介紹與格式轉換

CA證書介紹與格式轉換

CA證書介紹與格式轉換



概念

PKCS 公鑰加密標準(Public Key Cryptography Standards, PKCS),此一標準的設計與釋出皆由RSA資訊安全公司(英語:RSA Security)所制定,PKCS 目前共釋出過 15 個標準。更多公鑰加密標準

X.509 是密碼學裡公鑰證書的格式標準。

X.509是常見通用的證書格式。是ITU-T標準化部門基於他們之前的ASN.1定義的一套證書標準。

X.509附帶了證書吊銷列表和用於從最終對證書進行簽名的證書籤發機構直到最終可信點為止的證書合法性驗證演算法。

X.509證書已應用在包括TLS/SSL在內的眾多網路協議裡,同時它也用在很多非線上應用場景裡。

應用場景如電子簽名服務。X.509證書裡含有公鑰、身份資訊(比如網路主機名,組織的名稱或個體名稱等)和簽名信息(可以是證書籤發機構CA的簽名,也可以是自簽名)。

  1. 常用加密標準:

    • PKCS #7: 密碼訊息語法標準(Cryptographic Message Syntax Standard),規範了以公開金鑰基礎設施(PKI)所產生之簽章/密文之格式。其目的一樣是為了拓展數位證書的應用。
    • PKCS #10: 證書申請標準(Certification Request Standard),英語:PKCS_10,規範了向證書中心申請證書之CSR(certificate signing request)的格式。
    • PKCS #12: 個人訊息交換標準(Personal Information Exchange Syntax Standard),定義了包含私鑰與公鑰證書(public key certificate)的檔案格式。私鑰採密碼(password)保護。常見的PFX就履行了PKCS#12。
  2. 常用副檔名:

    • PKCS#7格式: .P7B .P7C .SPC
    • PKCS#12格式: .P12 .PFX .PKCS12
    • JKS格式: .jks .keystore .truststore
    • .pem – 隱私增強型電子郵件(Privacy-enhanced Electronic Mail)格式,通常是Base64格式的。
    • .cer /.crt /.der – 通常是DER(X.690#DER_encoding)二進位制格式的。
    • .cer /.crt是用於存放證書,它是2進位制形式存放的,不含私鑰。
    • .p12 – PKCS#12格式,包含證書的同時可能還包含私鑰
    • .pfx – PFX,PKCS#12之前的格式(通常用PKCS#12格式,比如由網際網路資訊服務產生的PFX檔案)
    • .pfx /.p12 用於存放個人證書/私鑰,他通常包含保護密碼,2進位制方式。
    • .p7r 是CA對證書請求的回覆,只用於匯入。
    • .p7b 以樹狀展示證書鏈(certificate chain),同時也支援單個證書,不含私鑰。

術語介紹

  1. 金鑰對: 在非對稱加密技術中,有兩種金鑰,分為私鑰和公鑰。
  2. 公鑰: 公鑰用來給資料加密,用公鑰加密的資料只能使用私鑰解密,公鑰是金鑰對持有者公佈給他人的。
  3. 私鑰: 用來解密公鑰加密的資料,私鑰是金鑰對所有者持有,不可公佈。
  4. 摘要: 對需要傳輸的文字,做一個HASH計算,一般採用SHA1,SHA2來獲得。
  5. 簽名: 使用私鑰對需要傳輸的文字的摘要進行加密,得到的密文即被稱為該次傳輸過程的簽名。
  6. 簽名驗證: 資料接收端,拿到傳輸文字,但是需要確認該文字是否就是傳送發出的內容,中途是否曾經被篡改。因此拿自己持有的公鑰對簽名進行解密(金鑰對中的一種金鑰加密的資料必定能使用另一種金鑰解密。),得到了文字的摘要,然後使用與傳送方同樣的HASH演算法計算摘要值,再與解密得到的摘要做對比,發現二者完全一致,則說明文字沒有被篡改過。
  7. 金鑰分為兩種: 對稱金鑰非對稱金鑰
    1. 對稱金鑰加密: 又稱私鑰加密或會話金鑰加密演算法,指的就是加、解密使用的同是一串金鑰,所以被稱做對稱加密。它的最大優勢是加/解密速度快,適合於對大資料量進行加密,但金鑰管理困難。
    2. 非對稱金鑰加密: 又稱公鑰金鑰加密。指的是加、解密使用不同的金鑰,一把作為公開的公鑰,另一把作為私鑰儲存。公鑰機制靈活,但加密和解密速度卻比對稱金鑰加密慢得多。

Tips:

  • 金鑰指的是私鑰或者公鑰 —> 金鑰 = 私鑰/公鑰;
  • 金鑰對指的是公鑰加上私鑰 —> 金鑰對 = 私鑰+公鑰;
  • 非對稱加密:
    • 公鑰和私鑰是成對的,公鑰和私鑰唯一對應,它們互相解密。
    • 公鑰一般用來加密和驗證簽名,私鑰用來簽名和解密。
    • 加密(加解密): 公鑰加密,私鑰解密;加密的目的是保證資訊的保密傳輸,使只有具備資格的一方才能解密。
    • 認證(加驗籤): 私鑰數字簽名,公鑰驗證簽名;加簽的目的是讓收到訊息的一方確認該訊息是由特定方傳送的。
  • 在實際的應用中,通常將兩者結合在一起使用,例如,對稱金鑰加密系統用於儲存大量資料資訊,而公開金鑰加密系統則用於加密金鑰。

原文連結:https://blog.csdn.net/qq_41586280/article/details/82669840

PEM 格式

  1. PEM格式是證書頒發機構頒發證書的最常見格式.PEM證書通常具有副檔名,例如.pem,.crt,.cer和.key。
  2. 它們是以二進位制檔案的Base64編碼的儲存,包含“----- BEGIN CERTIFICATE -----”和“----- END CERTIFICATE -----”語句。
  3. 伺服器證書,中間證書和私鑰都可以放入PEM格式。
  4. 相較於PEM的Base64編碼格式以文字檔案的形式存在,CERT格式的檔案為PEM的二進位制格式,副檔名.cert /.cer /.crt。
  5. KEY格式通常用來存放公鑰或者私鑰,並非X.509證書,編碼可能是PEM也有可能是DER,副檔名為 .key。

Apache和其他類似伺服器使用PEM格式證書。幾個PEM證書,甚至私鑰,可以包含在一個檔案中,一個在另一個檔案之下,但是大多數平臺(例如Apache)希望證書和私鑰位於單獨的檔案中。

DER 格式

  1. DER格式只是證書的二進位制形式,不含私鑰。
  2. 副檔名通常是.cer,有時會有.der的副檔名。
  3. 判斷DER .cer檔案和PEM .cer檔案方法是在文字編輯器中開啟它,並查詢BEGIN / END語句。
  4. 所有型別的證書和私鑰都可以用DER格式編碼。
  5. DER通常與Java平臺一起使用。
  6. SSL轉換器只能將證書轉換為DER格式。

PKCS#7 / P7B 格式

  1. PKCS#7是簽名或加密資料的格式標準,官方稱之為容器。由於證書是可驗真的簽名資料,所以可以用SignedData結構表述。
  2. PKCS#7或P7B格式通常以Base64 ASCII格式儲存,副檔名為.p7b或.p7c。
  3. P7B證書包含“----- BEGIN PKCS7 -----”和“----- END PKCS7 -----”語句。
  4. P7B檔案僅包含證書和鏈證書,而不包含私鑰。
  5. 多個平臺支援P7B檔案,包括Microsoft Windows和Java Tomcat。

PKCS#12 / PFX 格式

  1. PKCS#12 是公鑰加密標準,通用格式(rsa公司標準)。規定了可包含所有私鑰、公鑰和證書。檔案格式是加密過的。
  2. PKCS#12 或 PFX 格式是其以二進位制格式儲存,也稱為 PFX 檔案,在windows中可以直接匯入到金鑰區。也可用於匯入和匯出證書和私鑰。
  3. PKCS#12 由 PFX 進化而來的,用於交換公共的和私有的物件的標準格式。
  4. 檔案通常具有副檔名,例如.pkcs12 .pfx .p12。
  5. 金鑰庫和私鑰用相同密碼進行保護

JKS 格式

  1. JKS是java用來儲存金鑰的容器。可以同時容納n個公鑰或私鑰,字尾一般是.jks或者.keystore或.truststore等。
  2. 在Java 8之前,這些檔案的預設格式為JKS(android .keystore 也是jsk格式的證書)。
  3. 從Java 9開始,預設的金鑰庫格式為PKCS12。
  4. Android簽名keystore檔案也是jks格式,且1.8之後要求轉換到p12格式。
  5. JKS是二進位制格式,同時包含證書和私鑰,一般有密碼保護,只能儲存非對稱金鑰對(私鑰 + x509公鑰證書)。
  6. 當應用程式需要通過SSL / TLS進行通訊時,在大多數情況下將使用java keystore和java truststore。
  7. 金鑰庫和私鑰用不同的密碼進行保護

JKS和PKCS12之間的最大區別是JKS是Java專用的格式,而PKCS12是儲存加密的私鑰和證書的標準化且與語言無關的方式。


格式轉換

OpenSSL是一個非常有用的開源命令列工具包,可用於 X.509 證書,證書籤名請求(CSRs)和加密金鑰。

檢視證書

  • 檢視 PEM證書

    openssl x509 -text -noout -in CERTIFICATE.pem

  • 檢視 DER證書

    openssl x509 -inder der -text -noout -in CERTIFICATE.der

  • 檢視 CSR證書

    openssl req -text -noout -in mysite.csr

  • 檢視 P7B證書

    openssl pkcs7 -inform der -in CERTIFICATE.p7b -print_certs -text

  • 檢視 JKS證書

    keytool -list -rfc -keystore server.jks -storepass XXXXXX

轉換證書

轉換 PEM證書(.pem /.crt /.cer)

  • PEM to DER

    openssl x509 -outform der -in CERTIFICATE.pem -out CERTIFICATE.der

  • PEM to P7B

    openssl crl2pkcs7 -nocrl -certfile CERTIFICATE.cer -certfile CACert.cer -out CERTIFICATE.p7b

  • PEM to PFX

    openssl pkcs12 -export -out CERTIFICATE.pfx -inkey PRIVATEKEY.key -in CERTIFICATE.crt [-certfile CACert.crt]

    openssl pkcs12 -export -out CERTIFICATE.pfx -inkey PRIVATEKEY.key -in CERTIFICATE.cer [-certfile CACert.cer]

    openssl pkcs12 -export -out server.p12 -inkey server.key -in server.pem

轉換 DER證書(der /.crt /.cer)

  • DER to PEM

    openssl x509 -inform der -in CERTIFICATE.cer -out CERTIFICATE.pem

轉換 P7B證書(.p7b /.p7c)

  • P7B to PEM

    openssl pkcs7 -print_certs -in CERTIFICATE.p7b -out CERTIFICATE.cer

  • P7B to PFX

    openssl pkcs7 -print_certs -in CERTIFICATE.p7b -out CERTIFICATE.cer

轉換 PFX證書(.pkcs12 /.pfx /.p12)

  • PFX to PEM

    openssl pkcs12 -in CERTIFICATE.pfx -out CERTIFICATE.cer -nodes konwersja poprze OpenSSL

    openssl pkcs12 -nocerts -nodes -in cert.p12 -out private.pem

    openssl pkcs12 -clcerts -nokeys -in cert.p12 -out cert.pem

(PFX to PEM後CERTIFICATE.cer檔案包含認證證書和私鑰,需要把它們分開儲存才能使用。)

常用選項

 -inform PEM|DER    輸入格式 - DER或PEM(x509預設為PEM)
 -in infile         輸入檔案(x509預設為stdin)
 -outform PEM|DER   輸出格式 - DER或PEM(x509預設為PEM)
 -out outfile       輸出檔案(x509預設為stdout)
 -keyform PEM|DER|ENGINE 私鑰格式 - 預設PEM
 -passin val        私鑰密碼/口令來源
 -modulus           列印RSA金鑰模數
 -pubkey            輸出公鑰
 -fingerprint       列印證書的指紋
 -alias             輸出證書別名
 -noout             沒有輸出,只有狀態
 -nocert            無證書輸出
 -trustout          輸出一個受信任的證書
 -setalias val      設定證書別名
 -days int          簽署的證書到期前的時間 - 預設 30 天
 -signkey val       用引數自行簽署證書
 -x509toreq         輸出一個認證請求物件
 -req               輸入是一個證書請求,簽署並輸出
 -CA infile         設定CA證書,必須是PEM格式
 -CAkey val         設定 CA 金鑰,必須是 PEM 格式;如果不在 CAfile 中
 -text              列印文字形式的證書
 -ext val           列印各種X509V3擴充套件檔案
 -extfile infile    要新增X509V3擴充套件的檔案
 -writerand outfile 將隨機資料寫到指定檔案中
 -extensions val    要使用的配置檔案中的部分
 -nameopt val       各種證書名稱選項
 -certopt val       各種證書文字選項
 -checkhost val     檢查證書是否與主機匹配
 -checkemail val    檢查證書是否與電子郵件匹配
 -checkip val       檢查證書是否與ipaddr匹配
 -CAform PEM|DER    CA格式--預設PEM
 -CAkeyform PEM|DER|ENGINE      CA金鑰格式--預設為PEM

 -export        輸出PKCS12檔案
 -nodes         不要加密私鑰
 -nokeys        不輸出私鑰
 -keysig        設定 MS 金鑰簽名型別
 -nocerts       不輸出證書
 -clcerts       只輸出客戶證書
 -cacerts       只輸出CA證書
 -info          列印有關PKCS#12結構的資訊
 -chain         新增證書鏈
 -certpbe val   證書PBE演算法(預設為RC2-40)
 -inkey val     如果不是infile,則為私鑰
 -certfile infile   從檔案中載入證書
 -CApath dir    PEM格式的CA的目錄
 -CAfile infile     PEM格式的CA的檔案
 -no-CAfile     不載入預設的證書檔案
 -no-CApath     不從預設的證書目錄中載入證書


Reference