關於X509證書和密鑰的概念

證書概述

證書主要包括頒發者和被辦法者的信息,以及被頒發者的公鑰,和CA機構對這些信息的認證,
主要內容:node

**版本**  
識別用於該證書的 X.509 標準的版本,這能夠影響證書中所能指定的信息。迄今爲止,已定義的版本有三個。  
**序列號**  
發放證書的實體有責任爲證書指定序列號,以使其區別於該實體發放的其它證書。此信息用途不少。例如,若是某一證書被撤消,其序列號將放到證書撤消清單 (CRL) 中。  
**簽名算法標識符**  
用於識別 CA 簽寫證書時所用的算法。  
**簽發人姓名**  
簽寫證書的實體的 X.500 名稱。它一般爲一個 CA。 使用該證書意味着信任簽寫該證書的實體(注意:有些狀況下(例如根或頂層 CA 證書),簽發人會簽寫本身的證書)。  
**有效期**  
每一個證書均只能在一個有限的時間段內有效。該有效期以起始日期和時間及終止日期和時間表示,能夠短至幾秒或長至一世紀。所選有效期取決於許多因素,例如用於簽寫證書的私鑰的使用頻率及願爲證書支付的金錢等。它是在沒有危及相關私鑰的條件下,實體能夠依賴公鑰值的預計時間。  
**主體名**  
證書能夠識別其公鑰的實體名。此名稱使用 X.500 標準,所以在Internet中應是惟一的。它是實體的特徵名 (DN),例如,
CN=Java Duke,OU=Java Software Division,O=Sun Microsystems Inc,C=US
(這些指主體的通用名、組織單位、組織和國家)。  
**主體公鑰信息**  
這是被命名實體的公鑰,同時包括指定該密鑰所屬公鑰密碼系統的算法標識符及全部相關的密鑰參數。

PEM DER 只是編碼方式,注意並不指定是證書的編碼方式,也能夠是密鑰的編碼方式git

各類名詞和文件後綴

  1. X.509 - 這是一種證書標準,主要定義了證書中應該包含哪些內容.
  2. 兩種編碼方式:
  • PEM - Privacy Enhanced Mail,打開看文本格式,以"-----BEGIN..."開頭, "-----END..."結尾,內容是BASE64編碼.

查看PEM格式證書的信息:openssl x509 -in certificate.pem -text -noout
Apache和*NIX服務器偏向於使用這種編碼格式.github

  • DER - Distinguished Encoding Rules,打開看是二進制格式,不可讀.

查看DER格式證書的信息:openssl x509 -in certificate.der -inform der -text -noout
Java和Windows服務器偏向於使用這種編碼格式.web

  1. 各類文件拓展名:
  • CRT - CRT應該是certificate的三個字母,其實仍是證書的意思,常見於*NIX系統,有多是PEM編碼,也有多是DER編碼,大多數應該是PEM編碼
  • CER - 仍是certificate,仍是證書,常見於Windows系統,一樣的,多是PEM編碼,也多是DER編碼,大多數應該是DER編碼.
  • KEY - 一般用來存放一個公鑰或者私鑰,並不是X.509證書,編碼一樣的,多是PEM,也多是DER.
  • CSR - Certificate Signing Request,即證書籤名請求,這個並非證書,而是向權威證書頒發機構得到簽名證書的申請,其核心內容是一個公鑰(固然還附帶了一些別的信息),在生成這個申請的時候,同時也會生成一個私鑰
  • PFX/P12 - predecessor of PKCS#12,對*nix服務器來講,通常CRT和KEY是分開存放在不一樣文件中的,但Windows的IIS則將它們存在一個PFX文件中,(所以這個文件包含了證書及私鑰)這樣會不會不安全?應該不會,PFX一般會有一個"提取密碼"
總結起來:crt cer約等於x509證書,key保存公鑰或私鑰,csr是證書籤名請求,pfx包含證書和私鑰
  1. PKCS系列

當我發現還有PKCS系列時,我很凌亂,
PKCS系列是 Public-Key Cryptography Standards ,是RSA制定的一系列的標準,注意前面寫的什麼文件後綴啥的,都不算是標準,只有X509和PKCS能夠稱爲標準,
PKCS中常用的就是:PKCS1 PKCS8 PKCS12算法

  • PKCS#1:定義RSA公開密鑰算法加密和簽名機制,主要用於組織PKCS#7中所描述的數字簽名和數字信封。
  • PKCS#8:描述私有密鑰信息格式,該信息包括公開密鑰算法的私有密鑰以及可選的屬性集等。注意pkcs8不僅是能表示RSA,因此比PKCS1更具備通用性
  • PKCS#12:描述我的信息交換語法標準。描述了將用戶公鑰、私鑰、證書和其餘相關信息打包的語法。
總結:PKCS1,8,12均可以在某些狀況下看成文件格式,PKCS1描述基礎的密鑰格式,PKCS8也描述密鑰,但格式和1不一樣,PKCS12等價於PFX文件,包含證書和私鑰

OpenSSL

# 生成PKCS#1的公私鑰
openssl genrsa -out pkcs1_private.pem 1024
openssl rsa -in pkcs1_private.pem -RSAPublicKey_out -out pkcs1_public.pem

查看私鑰
 openssl rsa -in rsa_private_key.pem -text -noout
查看公鑰
openssl rsa -pubin -in  rsa_public_key.pem  -text

# 由PKCS#1的私鑰,生成PKCS#8的公私鑰
openssl pkcs8 -topk8 -inform PEM -in pkcs1_private.pem -outform PEM -nocrypt -out from_pkcs1_private_to_pkcs8_private.pem

openssl rsa -in pkcs1_private.pem -pubout -out from_pkcs1_private_to_pkcs8_public.pem

# 由PKCS#8的私鑰,生成PKCS#1的公私鑰
openssl rsa -in from_pkcs1_private_to_pkcs8_private.pem -out from_pkcs8_private_to_pkcs1_private.pem

openssl rsa -in from_pkcs1_private_to_pkcs8_private.pem -RSAPublicKey_out -out from_pkcs8_private_to_pkcs1_public.pem

# 由PKCS1公鑰生成PKCS#8公鑰:
openssl rsa -RSAPublicKey_in -in pkcs1_public.pem -pubout -out from_pkcs1_public_to_pkcs8_public.pem

# 由PKCS8公鑰生成PKCS#1公鑰:
openssl rsa -pubin -in from_pkcs1_private_to_pkcs8_public.pem -RSAPublicKey_out -out from_pkcs8_public_to_pkcs1_public.pem

產生證書請求 注意PKCS1 8均可以
openssl req -new -key private_key.pem -out rsaCerReq.csr

產生證書 注意PKCS1 8均可以
openssl x509 -req -days 3650 -in rsaCerReq.csr -signkey private_key.pem -out rsaCert.crt

從證書得到公鑰:
openssl x509 -in rsaCert.crt  -noout  -pubkey  > public_key.pem

生成PKCS12
openssl pkcs12 -export -inkey serverprikey.pem -in server.pem -password pass:"123456" -out server_nocret.pfx


從PKCS12得到證書和私鑰
openssl pkcs12 -in server_nocret.pfx -nocerts -nodes  -out alicekey.pem

openssl pkcs12 -in server_nocret.pfx  -nokeys  -out cert.pem

查看pkcs12內容 -nodes:由於私鑰在在輸出前會輸出加密結果,因此須要nodes來保證不用打密碼和不加密
openssl pkcs12 -in server_nocret.pfx -nocerts -nodes  -out alicekey.pem

RSA

  1. 隨機找兩個質數 P 和 Q ,定義n= p*q
  2. 計算 n 的歐拉函數 m= φ(n) =(p-1)*(1-1),爲何是這樣我就不懂了 ,即表示在小於n的數中有多少個與n構成互質,
  3. 隨機選擇一個整數 e,條件是1< e < m,且 e 與 m 互質。
  4. 計算d : e*d % m=1 ,雖然是二元一次方程,但經過拓展歐幾里得算法能夠得出,反正這個算法我也不懂,能算出來就能算出來吧
  5. 公鑰 (n,e) 私鑰(n,d)

爲何難以破解:
在已知 公鑰 N E 的狀況下,想要知道 私鑰的額D 就須要知道m,而 m=(p-1)(Q-1),想要知道P Q
就只能對 N 進行分解,而大整數的因式分解是難以破解的,因此保證了安全安全

PKCS的結構

以前我一直奇怪爲何私鑰能夠轉換出公鑰,覺得是RSA算法的原理所致使,但看起來原理並不知足私鑰算出公鑰的操做,因此我以爲問題出在PKCS內容上:服務器

PKCS1 的公鑰結構:
RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
}

PKCS1 的私鑰結構:
RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}

PKCS1 公鑰:
PublicKeyInfo ::= SEQUENCE {
  algorithm       AlgorithmIdentifier,
  PublicKey       BIT STRING
}

AlgorithmIdentifier ::= SEQUENCE {
  algorithm       OBJECT IDENTIFIER,
  parameters      ANY DEFINED BY algorithm OPTIONAL
}


PKCS8私鑰
PrivateKeyInfo ::= SEQUENCE {
  version         Version,
  algorithm       AlgorithmIdentifier,
  PrivateKey      BIT STRING
}

AlgorithmIdentifier ::= SEQUENCE {
  algorithm       OBJECT IDENTIFIER,
  parameters      ANY DEFINED BY algorithm OPTIONAL
}

能夠看出PKCS1 的私鑰包含了密鑰產生的全部元素,因此能算出公鑰就不奇怪了,至於PKCS8 看起來不包含,但爲何也能夠,我想應該只是結構不一樣,內容應該都是有的函數

參考

https://blog.csdn.net/xy01090...
注意這個文章的漫畫有一個錯誤的地方,證書並非CA私鑰對公司公鑰加密的結果
而應該是以下面這個文章的說法,證書=s_KeyPub + s_Info + ca_Info + enc_s_Hash
s_KeyPub:公司公鑰
s_Info:公司信息
ca_Info:ca機構
enc_s_Hash:ca對公司的認證,=ca_pri(hash(s_KeyPub + s_Info + ca_Info))

證書在通信中如何加簽和驗籤,ui

https://zhuanlan.zhihu.com/p/...

闡述PKCS1 PKCS8的區別,以及PKCS的結構編碼

https://www.shangyang.me/2017...

描述PKCS

https://qsiofttt.iteye.com/bl...

密鑰之間轉換:

https://xuanxuanblingbling.gi...

RSA:

https://www.zhihu.com/questio...
相關文章
相關標籤/搜索