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:

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

原文鏈接://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