證書主要包括頒發者和被辦法者的信息,以及被頒發者的公鑰,和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
查看PEM格式證書的信息:openssl x509 -in certificate.pem -text -noout
Apache和*NIX服務器偏向於使用這種編碼格式.github
查看DER格式證書的信息:openssl x509 -in certificate.der -inform der -text -noout
Java和Windows服務器偏向於使用這種編碼格式.web
總結起來:crt cer約等於x509證書,key保存公鑰或私鑰,csr是證書籤名請求,pfx包含證書和私鑰
當我發現還有PKCS系列時,我很凌亂,
PKCS系列是 Public-Key Cryptography Standards ,是RSA制定的一系列的標準,注意前面寫的什麼文件後綴啥的,都不算是標準,只有X509和PKCS能夠稱爲標準,
PKCS中常用的就是:PKCS1 PKCS8 PKCS12算法
總結:PKCS1,8,12均可以在某些狀況下看成文件格式,PKCS1描述基礎的密鑰格式,PKCS8也描述密鑰,但格式和1不一樣,PKCS12等價於PFX文件,包含證書和私鑰
# 生成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
爲何難以破解:
在已知 公鑰 N E 的狀況下,想要知道 私鑰的額D 就須要知道m,而 m=(p-1)(Q-1),想要知道P Q
就只能對 N 進行分解,而大整數的因式分解是難以破解的,因此保證了安全安全
以前我一直奇怪爲何私鑰能夠轉換出公鑰,覺得是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...