X.509数据结构,实例分析与使用

来源:互联网 发布:如何设置网络唤醒 编辑:程序博客网 时间:2024/04/28 02:37
  • X.509被广泛使用的数字证书标准,是由国际电联电信委员会(ITU-T)为单点登录(SSO-Single Sign-on)和授权管理基础设施 (PMI-Privilege Management Infrastructure)制定的PKI标准,其中,单点登录指的是用户只需要登录一次就可以访问所有相互信任的应用系统,PKI标准指的是为支持公开密钥管理并能支持认证、加密、完整性和可追究性服务的基础设施。
  • X.509证书数据结构详细描述:<摘自:RCF 2459 4.1 Basic Certificate Fields >
 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 }

X.509数字证书实例
<摘自RCF 2459 Appendix D. Examples> –下文在此附加翻译与注释
D.3 End-Entity Certificate Using RSA
包含一个结束实体证书的转储,包含一个RSA公钥,并与RSA和MD5签署。这
证书不是最小认证路径的一部分。
证书包含675字节,证书版本号为3。
(a) 证书序列号是256 (0x100);
(b) 证书使用RSA和MD2哈希算法签署;
(c) 证书发行者的名字是OU=Dept. Arquitectura de Computadors; O=Universitat Politecnica de Catalunya; C=ES
(d) 证书主体的名字是CN=Francisco Jordan;OU=Dept. Arquitectura de Computadors; O=Universitat Politecnica de Catalunya; C=ES
(e) 证书于1996年5月21日签发,并1997年5月21日到期;
(f) 证书包含一个768位RSA 公钥;
(g) 证书是一个结束实体证书(不是CA证书);
(h) 证书包含证书主体别名、证书发行者别名–都是URLs
(i) 证书包括一个权威密钥标识符和证书政策扩展;
(j) 证书包含一个密钥用法的扩展,指定用于数字签名

0000 30 80           : SEQUENCE   (size undefined) // Certificate:: SEQUENCE类型(30),数据块长度不定,由00、00作为结束符0002 30 82 02 40 576: . SEQUENCE     // tbsCertificate:: SEQUENCE类型,长度5760006 a0 03          3: . . [0]   // Version:: 特殊内容-证书版本(a0),长度30008 02 01          1: . . . INTEGER 2   //整数类型(02),长度1                     : 02                // 版本3(2)0011 02 02          2: . . INTEGER 256   //serialNumber:: 整数类型(02),长度2                     : 01 00   // 证书序列号2560015 30 0d         13: . . SEQUENCE      // signature:: SEQUENCE类型(30),长度130017 06 09          9: . . . OID 1.2.840.113549.1.1.2: MD2WithRSAEncryption                 // signature:: OBJECT IDENTIFIER类型,长度9                     : 2a 86 48 86 f7 0d 01 01 02 //MD2WithRSAEncryption算法0028 05 00          0: . . . NULL0030 30 68         88: . . SEQUENCE   // 以下的数据块表示issuer信息0032 31 0b         11: . . . SET0034 30 09          9: . . . . SEQUENCE0036 06 03          3: . . . . . OID 2.5.4.6: C                     : 55 04 060041 13 02          2: . . . . . PrintableString 'ES'                     : 45 530045 31 2d         45: . . . SET0047 30 2b         43: . . . . SEQUENCE0049 06 03          3: . . . . . OID 2.5.4.10: O                     : 55 04 0a0054 13 24         36: . . . . . PrintableString                     'Universitat Politecnica de Catalunya'                     : 55 6e 69 76 65 72 73 69 74 61 74 20 50 6f 6c 69                     : 74 65 63 6e 69 63 61 20 64 65 20 43 61 74 61 6c                     : 75 6e 79 610092 31 2a         42: . . . SET0094 30 28         40: . . . . SEQUENCE0096 06 03          3: . . . . . OID 2.5.4.11: OU                     : 55 04 0b0101 13 21         33: . . . . . PrintableString                     'OU=Dept. Arquitectura de Computadors'                     : 44 65 70 74 2e 20 41 72 71 75 69 74 65 63 74 75                     : 72 61 20 64 65 20 43 6f 6d 70 75 74 61 64 6f 72                     : 730136 30 1e         30: . . SEQUENCE       // validity:: SEQUENCE类型(30),长度300138 17 0d         13: . . . UTCTime '960521095826Z' // notBefore:: UTCTime类型(23)长度13                     : 39 36 30 37 32 32 31 37 33 38 30 32 5a0153 17 0d         13: . . . UTCTime '979521095826Z' // notBefore:: UTCTime类型(23)长度13                     : 39 37 30 37 32 32 31 37 33 38 30 32 5a0168 30 81 83     112: . . SEQUENCE              // 以下的数据块表示subject信息0171 31 0b         11: . . . SET0173 30 09          9: . . . . SEQUENCE0175 06 03          3: . . . . . OID 2.5.4.6: C                     : 55 04 060180 13 02          2: . . . . . PrintableString 'ES'                     : 45 530184 31 2d         12: . . . SET0186 30 2b         16: . . . . SEQUENCE0188 06 03          3: . . . . . OID 2.5.4.10: O                     : 55 04 0a0193 13 24         36: . . . . . PrintableString                     'Universitat Politecnica de Catalunya'                     : 55 6e 69 76 65 72 73 69 74 61 74 20 50 6f 6c 69                     : 74 65 63 6e 69 63 61 20 64 65 20 43 61 74 61 6c                     : 75 6e 79 610231 31 2a         42: . . . SET0233 30 28         40: . . . . SEQUENCE0235 06 03          3: . . . . . OID 2.5.4.11: OU                     : 55 04 0b0240 13 21         33: . . . . . PrintableString                     'Dept. Arquitectura de Computadors'                     : 44 65 70 74 2e 20 41 72 71 75 69 74 65 63 74 75                     : 72 61 20 64 65 20 43 6f 6d 70 75 74 61 64 6f 72                     : 730275 31 19         22: . . . SET0277 30 17         20: . . . . SEQUENCE0279 06 03          3: . . . . . OID 2.5.4.3: CN                     : 55 04 030284 13 10         16: . . . . . PrintableString 'Francisco Jordan'                     : 46 72 61 6e 63 69 73 63 6f 20 4a 6f 72 64 61 6e0302 30 7c          2: . . SEQUENCE // subjectPublicKeyInfo:: SEQUENCE类型(30),长度不定0304 30 0d         13: . . . SEQUENCE0306 06 09          9: . . . . OID 1.2.840.113549.1.1.1: RSAEncryption //algorithm:: OBJECT IDENTIFIER类型,长度9                     : 2a 86 48 86 f7 0d 01 01 01 // 表示RSA算法(见下文)0317 05 00          0: . . . . NULL0319 03 6b        107: . . . BIT STRING  (0 unused bits) //subjectPublicKey:: 公钥值,BIT STRING类型,长度107字节                     : 00   (0 unused bits)     0321 03 68        104: . . . . BIT STRING  (0 unused bits)0323 02 61         97: . . . . . INTEGER (0 unused bits) // 公钥值,96字节,768位                     : 00   (0 unused bits) : be aa 8b 77 54 a3 af ca 77 9f 2f b0 cf 43 88 ff                     : a6 6d 79 55 5b 61 8c 68 ec 48 1e 8a 86 38 a4 fe                     : 19 b8 62 17 1d 9d 0f 47 2c ff 63 8f 29 91 04 d1                     : 52 bc 7f 67 b6 b2 8f 74 55 c1 33 21 6c 8f ab 01                     : 95 24 c8 b2 73 93 9d 22 61 50 a9 35 fb 9d 57 50                     : 32 ef 56 52 50 93 ab b1 88 94 78 56 15 c6 1c 8b0423 02 03          3: . . . . . INTEGER   // RSA加密算法的exponent值                     : 01 00 010428 a3 81 97     151: . . [3]         // extensions:: 特殊内容-证书扩展部分(a3),长度1510431 30 3c         60: . . . SEQUENCE0433 30 1f         31: . . . . SEQUENCE        // 扩展发行者密钥标识符authorityKeyIdentifier0435 06 03          3: . . . . . OID 2.5.29.35: authorityKeyIdentifier                     : 55 1d 230440 04 14         22: . . . . . OCTET STRING                     : 30 12 80 10 0e 6b 3a bf 04 ea 04 c3 0e 6b 3a bf                     : 04 ea 04 c30464 30 19         25: . . . . SEQUENCE       // 扩展keyUsage0466 06 03          3: . . . . . OID 2.5.29.15: keyUsage                     : 55 1d 0f0471 01 01          1: . . . . . TRUE                     : ff0474 04 04          4: . . . . . OCTET STRING                     : 03 02 07 800480 30 19         25: . . . . SEQUENCE       //扩展certificatePolicies0482 06 03          3: . . . . . OID 2.5.29.32: certificatePolicies                     : 55 1d 200487 04 21         33: . . . . . OCTET STRING                     : 30 1f 30 1d 06 04 2a 84 80 00 30 15 30 07 06 05                     : 2a 84 80 00 01 30 0a 06 05 2a 84 80 00 02 02 01                     : 0a0522 30 1c         28: . . . . SEQUENCE   //扩展subjectAltName0524 06 03          3: . . . . . OID 2.5.29.17: subjectAltName                     : 55 1d 110529 04 15         21: . . . . . OCTET STRING                     : 30 13 86 11 68 74 74 70 3a 2f 2f 61 63 2e 75 70                     : 63 2e 65 73 2f0552 30 19         25: . . . . SEQUENCE   //扩展issuerAltName0554 06 03          3: . . . . . OID 2.5.29.18: issuerAltName                     : 55 1d 120559 04 12         18: . . . . . OCTET STRING                     : 30 14 86 12 68 74 74 70 3a 2f 2f 77 77 77 2e 75                     : 70 63 2e 650579 30 80           : . SEQUENCE (indefinite length)                         // signatureAlgorithm0581 06 07          7: . . OID0583 05 00          0: . . NULL0585 00 00          0: . . end of contents marker0587 03 81 81      47: . BIT STRING      // 签名值                     : 00      (0 unused bits)                     : 5c 01 bd b5 41 88 87 7a 0e d3 0e 6b 3a bf 04 ea                     : 04 cb 5f 61 72 3c a3 bd 78 f5 66 17 fe 37 3a ab                     : eb 67 bf b7 da a8 38 f6 33 15 71 75 2f b9 8c 91                     : a0 e4 87 ba 4b 43 a0 22 8f d3 a9 86 43 89 e6 50                     : 5c 01 bd b5 41 88 87 7a 0e d3 0e 6b 3a bf 04 ea                     : 04 cb 5f 61 72 3c a3 bd 78 f5 66 17 fe 37 3a ab                     : eb 67 bf b7 da a8 38 f6 33 15 71 75 2f b9 8c 91                     : a0 e4 87 ba 4b 43 a0 22 8f d3 a9 86 43 89 e6 500637 00 00          0: . . end of contents marker

-RSA算法简要描述如下:
n = p *q; p,q为互质的大素数
(d * e) mod ( (p-1) * (q-1) ) = 1
其中n,e为公钥,n,p,q,d,e自己保留。
加密方法:
Y(密文) = X(明文)**d mod n;
解密方法:
X(明文) = Y(密文)**e mod n;
密钥格式
公钥包含两个整数:
n RSA 合数模,是一个正整数
e RSA 公开幂,是一个正整数
私钥有两种表达方法,这两种方法是等价的。
1、
n RSA 合数模,是一个正整数
d RSA 私有幂,是一个正整数
2、
p 第一个因子,是一个正整数
q 第二个因子,是一个正整数
dP 第一个因子的CRT 幂,是一个正整数
dQ 第二个因子的 CRT 幂,是一个正整数
qInv (第一个)CRT 系数,是一个正整数
对于RSA算法中的公钥部分,包含两个INTEGER类型的数字n和e。
对于RSA私钥的第一种表述方法,私钥中包含5个INTEGER类型的数字依次为n, e, d, p, q;对于RSA私钥的第二种表达方法,私钥中包含8个INTEGER类型的数字依次为n, e, d, p, q, dP, dQ和qInv;
交互方法:
SSL/TLS协议中,服务器端用Certificate消息把证书(公钥)传递给客户端,客户端随机生成48byte的预主密钥,用公钥加密传递给服务器端,作为双方对称加密中一系列密钥计算的基础。如下图:

这里写图片描述

参考:
https://tools.ietf.org/html/rfc2459

https://wenku.baidu.com/view/4fba1b56f01dc281e53af06e.html

http://www.cnblogs.com/chnking/archive/2007/08/28/872104.html

http://blog.csdn.net/tl437002770/article/details/51112741

http://blog.csdn.net/dww410/article/details/6887895