1、什么叫數字簽名
將報文按雙方約定的HASH算法計算得到一個固定位數的報文摘要。在數學上保證:只要改動報文中任何一位,重新計算出的報文摘要值就會與原先的值不相符。這樣就保證了報文的不可更改性。
將該報文摘要值用發送者的私人密鑰加密,然后連同原報文一起發送給接收者,而產生的報文即稱數字簽名
2、什么叫數字證書
數字證書就是互聯網通訊中標志通訊各方身份信息的一系列數據,提供了一種在Internet上驗證您身份的方式,其作用類似於司機的駕駛執照或日常生活中的身份證。它是由一個由權威機構—–CA機構,又稱為證書授權,(Certificate Authority)中心發行的,人們可以在網上用它來識別對方的身份。數字證書是一個經證書授權中心數字簽名的包含公開密鑰擁有者信息以及公開密鑰的文件。最簡單的證書包含一個公開密鑰、名稱以及證書授權中心的數字簽名。
3、交互過程
1.鮑勃有兩把鑰匙,一把是公鑰,另一把是私鑰。
2.鮑勃把公鑰送給他的朋友們—-帕蒂、道格、蘇珊—-每人一把。
3.蘇珊要給鮑勃寫一封保密的信。她寫完后用鮑勃的公鑰加密,就可以達到保密的效果
4.鮑勃收信后,用私鑰解密,就看到了信件內容。這里要強調的是,只要鮑勃的私鑰不泄露,這封信就是安全的,即使落在別人手里,也無法解密。
5.鮑勃給蘇珊回信,決定采用 “數字簽名”。他寫完后先用Hash函數,生成信件的摘要(digest)。
6.然后,鮑勃使用私鑰,對這個摘要加密,生成”數字簽名”(signature)。
7.鮑勃將這個簽名,附在信件下面,一起發給蘇珊。
8.蘇珊收信后,取下數字簽名,用鮑勃的公鑰解密,得到信件的摘要。由此證明,這封信確實是鮑勃發出的。
9.蘇珊再對信件本身使用Hash函數,將得到的結果,與上一步得到的摘要進行對比。如果兩者一致,就證明這封信未被修改過。
10.復雜的情況出現了。道格想欺騙蘇珊,他偷偷使用了蘇珊的電腦,用自己的公鑰換走了鮑勃的公鑰。此時,蘇珊實際擁有的是道格的公鑰,但是還以為這是鮑勃的公鑰。因此,道格就可以冒充鮑勃,用自己的私鑰做成”數字簽名”,寫信給蘇珊,讓蘇珊用假的鮑勃公鑰進行解密。
11.后來,蘇珊感覺不對勁,發現自己無法確定公鑰是否真的屬於鮑勃。她想到了一個辦法,要求鮑勃去找”證書中心”(certificate authority,簡稱CA),為公鑰做認證。證書中心用自己的私鑰,對鮑勃的公鑰和一些相關信息一起加密,生成”數字證書”(Digital Certificate)。
12.鮑勃拿到數字證書以后,就可以放心了。以后再給蘇珊寫信,只要在簽名的同時,再附上數字證書就行了。
13.蘇珊收信后,用CA的公鑰解開數字證書,就可以拿到鮑勃真實的公鑰了,然后就能證明”數字簽名”是否真的是鮑勃簽的。
4、什么叫X.509數字證書
X.509 標准規定了證書可以包含什么信息,並說明了記錄信息的方法(數據格式)。除了簽名外,所有 X.509 證書還包含以下數據:
**版本** 識別用於該證書的 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 (這些指主體的通用名、組織單位、組織和國家)。 **主體公鑰信息** 這是被命名實體的公鑰,同時包括指定該密鑰所屬公鑰密碼系統的算法標識符及所有相關的密鑰參數。
常見的X.509證書格式包括:
cer/crt是用於存放證書,它是2進制形式存放的,不含私鑰。 pem跟crt/cer的區別是它以Ascii來表示,可以用於存放證書或私鑰。 pfx/p12用於存放個人證書/私鑰,他通常包含保護密碼,2進制方式。 p10是證書請求。 p7r是CA對證書請求的回復,只用於導入 p7b以樹狀展示證書鏈(certificate chain),同時也支持單個證書,不含私鑰。
證書文件/私鑰文件
在HTTPS通訊中最常用的是cer/crt和pem。下面以pem格式的證書為例進行說明。下面是一個完整的PEM格式證書:
Certificate:
Data: Version: 1 (0x0) Serial Number: 1 (0x1) Signature Algorithm: md5WithRSAEncryption Issuer: C=US, ST=Montana, L=Bozeman, O=sawtooth, OU=consulting, CN=www.sawtooth-consulting.com/emailAddress=info@yassl.com Validity Not Before: Jun 30 18:52:17 2010 GMT Not After : Mar 26 18:52:17 2013 GMT Subject: C=US, ST=Montana, L=Bozeman, O=yaSSL, OU=support, CN=www.yassl.com/emailAddress=info@yassl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (512 bit) Modulus (512 bit): 00:c6:7b:c0:68:81:2f:de:82:3f:f9:ac:c3:86:4a:66:b7:ec:d4:f1:f6:64:21:ff:f5:a2:34:42:d0:38:9f:c6:dd:3b:6e:26:65:6a:54:96:dd:d2:7b:eb:36:a2:ae:7e:2a:9e:7e:56:a5:b6:87:9f:15:c7:18:66:7e:16:77:e2:a7 Exponent: 65537 (0x10001) Signature Algorithm: md5WithRSAEncryption 58:a9:98:e7:16:52:4c:40:e7:e1:47:92:19:1b:3a:8f:97:6c:7b:b7:b0:cb:20:6d:ad:b5:d3:47:58:d8:e4:f2:3e:32:e9:ef:87:77:e5:54:36:f4:8d:50:8d:07:b4:77:45:ea:9d:a4:33:36:9b:0b:e0:74:58:11:c5:01:7b:4d -----BEGIN CERTIFICATE----- MIICFDCCAb4CAQEwDQYJKoZIhvcNAQEEBQAwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdNb250YW5hMRAwDgYDVQQHEwdCb3plbWFuMREwDwYDVQQKEwhzYXd0b290aDETMBEGA1UECxMKY29uc3VsdGluZzEkMCIGA1UEAxMbd3d3LnNhd3Rvb3RoLWNvbnN1bHRpbmcuY29tMR0wGwYJKoZIhvcNAQkBFg5pbmZvQHlhc3NsLmNvbTAeFw0xMDA2MzAxODUyMTdaFw0xMzAzMjYxODUyMTdaMIGKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMHTW9udGFuYTEQMA4GA1UEBxMHQm96ZW1hbjEOMAwGA1UEChMFeWFTU0wxEDAOBgNVBAsTB3N1cHBvcnQxFjAUBgNVBAMTDXd3dy55YXNzbC5jb20xHTAbBgkqhkiG9w0BCQEWDmluZm9AeWFzc2wuY29tMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMZ7wGiBL96CP/msw4ZKZrfs1PH2ZCH/9aI0QtA4n8bdO24mZWpUlt3Se+s2oq5+Kp5+VqW2h58VxxhmfhZ34qcCAwEAATANBgkqhkiG9w0BAQQFAANBAFipmOcWUkxA5+FHkhkbOo+XbHu3sMsgba2100dY2OTyPjLp74d35VQ29I1QjQe0d0XqnaQzNpsL4HRYEcUBe00= -----END CERTIFICATE----- 從Certificate開始到“-----BEGIN CERTIFICATE-----”為止,中間的內容是證書的明文格式。 從“-----BEGIN CERTIFICATE-----”開始到“-----END CERTIFICATE-----”為止是證書的明文格式經過ASN.1編碼再經過Base64編碼得到的。 對於私鑰文件,真正的私鑰是包含在字符串"-----BEGIN PRIVATE KEY-----"和字符串"-----END PRIVATE KEY-----"之間。
如果該私鑰文件是pkcs8格式的,那么該私鑰文件的格式為
PrivateKeyInfo ::= SEQUENCE { version Version(INTEGER), privateKeyAlgorithm PrivateKeyAlgorithmIdentifier (AlgorithmIdentifier), privateKey PrivateKey(OCTET STRING), attributes [0] IMPLICIT Attributes OPTIONAL(SET OF Attribute) } 如果不是pkcs8格式的,那么"-----BEGIN PRIVATE KEY-----"和"-----END PRIVATE KEY-----"之間的內容就是私鑰的Base64編碼。 在客戶端或服務器在交換證書時,需要首先把Base64編碼轉換為ASCII編碼再進行傳輸。
公鑰和私鑰
公鑰和私鑰是證書文件和私鑰文件中最核心的內容。
在SSL/TLS協議中需要是用公鑰算法,來進行對稱密鑰的交換。最常見的算法是RSA和DH,而RSA算法和DH算法的公鑰、私鑰的數據格式是不同的。
5、X.509證書數據結構
此證書結構來着白皮書
https://tools.ietf.org/html/rfc2459#section-4.1
Certificate ::= SEQUENCE { tbsCertificate TBSCertificate, -- 證書主體 signatureAlgorithm AlgorithmIdentifier, -- 證書簽名算法標識 signatureValue BIT STRING --證書簽名值,是使用signatureAlgorithm部分指定的簽名算法對tbsCertificate證書主題部分簽名后的值. } TBSCertificate ::= SEQUENCE { version [0] EXPLICIT Version DEFAULT v1, -- 證書版本號 serialNumber CertificateSerialNumber, -- 證書序列號,對同一CA所頒發的證書,序列號唯一標識證書 signature AlgorithmIdentifier, --證書簽名算法標識 issuer Name, --證書發行者名稱 validity Validity, --證書有效期 subject Name, --證書主體名稱 subjectPublicKeyInfo SubjectPublicKeyInfo,--證書公鑰 issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, -- 證書發行者ID(可選),只在證書版本2、3中才有 subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, -- 證書主體ID(可選),只在證書版本2、3中才有 extensions [3] EXPLICIT Extensions OPTIONAL -- 證書擴展段(可選),只在證書版本3中才有 } Version ::= INTEGER { v1(0), v2(1), v3(2) } CertificateSerialNumber ::= INTEGER AlgorithmIdentifier ::= SEQUENCE { algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL } parameters: Dss-Parms ::= SEQUENCE { -- parameters ,DSA(DSS)算法時的parameters, RSA算法沒有此參數 p INTEGER, q INTEGER, g INTEGER } signatureValue: Dss-Sig-Value ::= SEQUENCE { -- sha1DSA簽名算法時,簽名值 r INTEGER, s INTEGER } Name ::= CHOICE { RDNSequence } RDNSequence ::= SEQUENCE OF RelativeDistinguishedName RelativeDistinguishedName ::= SET OF AttributeTypeAndValue AttributeTypeAndValue ::= SEQUENCE { type AttributeType, value AttributeValue } AttributeType ::= OBJECT IDENTIFIER AttributeValue ::= ANY DEFINED BY AttributeType Validity ::= SEQUENCE { notBefore Time, -- 證書有效期起始時間 notAfter Time -- 證書有效期終止時間 } Time ::= CHOICE { utcTime UTCTime, generalTime GeneralizedTime } UniqueIdentifier ::= BIT STRING SubjectPublicKeyInfo ::= SEQUENCE { algorithm AlgorithmIdentifier, -- 公鑰算法 subjectPublicKey BIT STRING -- 公鑰值 } subjectPublicKey: RSAPublicKey ::= SEQUENCE { -- RSA算法時的公鑰值 modulus INTEGER, -- n publicExponent INTEGER -- e -- } Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension Extension ::= SEQUENCE { extnID OBJECT IDENTIFIER, critical BOOLEAN DEFAULT FALSE, extnValue OCTET STRING }