使用Java读取X.509证书信息

一、算法原理概述

证书的组成

首先,有一个权威的证书签发机构,称为CA——全球就那么几个公司比较权威啦,这个机构,先用RSA产生一对公私钥。
私钥自己留着藏起来,你要是能偷到手就厉害了。
然后用自己的私钥对自己的公钥进行签名,生成所谓的数字证书。

这个过程大概是这样的:
先生成一个文件,文件内容大概是这样的:

  • 公钥内容
  • 签发者ID—-谁签发的证书
  • Subject—-也就是这个证书签发给谁。这里subject和签发者ID相同。
  • 有效期
  • 其他信息
    以上内容都是明文。我们称为内容P。

然后使用hash算法,对内容P进行hash计算,得到一个hash值H。
然后使用签发机构的私钥对H进行RSA加密,得到签名信息S。这个步骤称为签名,就是用私钥对某公开内容的hash值进行加密。

然后将P,S连成一个文件,这个文件就是所谓的数字证书了。所以数字证书里,包括证书持有者的身份信息,证书信息,证书持有人的公钥,以及签名信息。

证书的验证

现在假设某人得到了这个证书,如何确认这个证书属于谁的呢?
我们看数字证书里有些什么?可以得到P,可以得到S。
我们用同样的hash算法对P进行hash计数,得到一个hash值H1。
P里有公钥,签发者ID,Subject,有效期,及其他信息。我们用公钥解密S,得到了一个值H’。
这个H‘就是制作数字证书的时候,用私钥对S加密的H。
现在对比H’和H1是否相等,如果相等,那么就证明这个证书是有签发者签发给subject的证书。否则就说明:1.内容P被篡改过,或者2.证书不是由CA签发的。
这个是对自签发证书的验证过程。需要说明的是,这种自签发证书的验证不常使用,但如何验证证书的原理类似。

证书管理机构 - Certificate Authority

既然自己可以给自己签发证书,那黑客宣称自己是某著名CA,然后给自己签发一个证书。那验证者如何来验证这个证书是黑客自己的呢还是那个著名的CA呢?
如果仅仅按照上文所说的自签发证书验证过程来看,是无法确认身份的。这个问题,就是CA存在的意义了。

所谓全球权威的CA,就那么几个公司,这几个公司的证书,被各软件厂商设置成“可信任的根证书”了。至于这些CA是怎么把自己的数字证书交给软件厂商而且让他们信任自己,我也不知道。
如果你知道了,你就可以自己给自己签发一个证书,交给微软的IE,或者firefox等,让他们把你的证书嵌入到软件里去。这样一来,你就成了全球权威的CA之一了!
现在知道了,自签发的数字证书,要被各软件信任,是不容易的。一旦CA的根证书存在用户的系统了,就可以用这个根证书来验证其他证书了。并用被验证过的证书来认证身份。

我们举一个例子,说明数字证书用来进行身份认证,就是https连接某网站的时候的身份认证过程。
首先,某网站当然是一个web服务器,它要有一个数字证书。这个证书,要么是自己签发的,要么是由第三方签发的,一般这个第三方是全球权威的CA。
IE或者firefox用https连上web server,这个时候,IE或者firefox最担心的是这个web server是冒充的网站,比如我登录某银行网站,结果连上了一个钓鱼网站,用户也没有发现,就在这个钓鱼网站做的和真网站一样的页面里,输入了自己的用户名密码,岂不是就这么泄露了机密信息么?
那么怎么确认这个网站是正确的呢?这个就需要浏览器要求web server提供自己的数字证书来证明自己的身份。
网站的身份是什么?域名,比如https://www.zhihu.com。你如果打了https://www.zihu.com,也出现跟知乎一样的网站,浏览器没有警告你说此网站不合法,结果你输入了自己的用户名和密码登录,你觉得这个是什么问题?

继续刚才的话题。浏览器要求web server的证书来证明我在浏览器中输入的网址,并没有连接到错误的网站上去,于是web server把自己的数字证书传给浏览器。浏览器对之进行验证,确认此网站的身份。

请注意两个情况的区别:一,我在浏览器输入https://www.zhihu.com,连接到了黑客的钓鱼服务器,而没有连接到真正的服务器;二,我在浏览器输入https://www.zihu.com,连接到了一个黑客的钓鱼服务器。

现在我们继续看这个数字证书怎么证明自己的身份。
假设数字证书是第三方签发的,但这个第三方却不权威。也就是说,给网站签发证书的这个CA,没有被IE等浏览器认可。

x.509证书结构的RFC文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Certificate  ::=  SEQUENCE  {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING }

TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1,
serialNumber CertificateSerialNumber,
signature AlgorithmIdentifier,
issuer Name,
validity Validity,
subject Name,
subjectPublicKeyInfo SubjectPublicKeyInfo,
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version shall be v2 or v3
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version shall be v2 or v3
extensions [3] EXPLICIT Extensions OPTIONAL
-- If present, version shall be v3
}

Version ::= INTEGER { v1(0), v2(1), v3(2) }

CertificateSerialNumber ::= INTEGER

Validity ::= SEQUENCE {
notBefore Time,
notAfter Time }

Time ::= CHOICE {
utcTime UTCTime,
generalTime GeneralizedTime }

UniqueIdentifier ::= BIT STRING

SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }

Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension

Extension ::= SEQUENCE {
extnID OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTET STRING }

X.509证书的结构解读

  1. X.509证书基本部分

    1. 版本号:标识证书的版本(版本1、版本2或是版本3)
    2. 序列号:标识证书的唯一整数,由证书颁发者分配的本证书的唯一标识符
    3. 签名:用于签证书的算法标识,由对象标识符加上相关的参数组成,用于说明本证书所用的数字签名算法。例如,SHA-1和RSA的对象标识符就用来说明该数字签名是利用RSA对SHA-1杂凑加密。
    4. 颁发者:证书颁发者的可识别名(DN)
    5. 有效期:证书有效期的时间段。本字段由”Not Before”和”Not After”两项组成,它们分别由UTC时间或一般的时间表示(在RFC2459中有详细的时间表示规则)
    6. 主体:证书拥有者的可识别名,这个字段必须是非空的,除非你在证书扩展中有别名
    7. 主体公钥信息:主体的公钥(以及算法标识符)
    8. 颁发者唯一标识符:标识符—证书颁发者的唯一标识符,仅在版本2和版本3中有要求,属于可选项
    9. 主体唯一标识符:证书拥有者的唯一标识符,仅在版本2和版本3中有要求,属于可选项。
  2. X.509证书扩展部分

    1. 发行者密钥标识符:证书所含密钥的唯一标识符,用来区分同一证书拥有者的多对密钥
    2. 密钥使用:一个比特串,指明(限定)证书的公钥可以完成的功能或服务,如:证书签名、数据加密等。如果某一证书将 KeyUsage 扩展标记为“极重要”,而且设置为“keyCertSign”,则在 SSL 通信期间该证书出现时将被拒绝,因为该证书扩展表示相关私钥应只用于签写证书,而不应该用于 SSL
    3. CRL分布点:指明CRL的分布地点
    4. 私钥的使用期:指明证书中与公钥相联系的私钥的使用期限,它也有Not Before和Not After组成。若此项不存在时,公私钥的使用期是一样的
    5. 证书策略:由对象标识符和限定符组成,这些对象标识符说明证书的颁发和使用策略有关
    6. 策略映射:表明两个CA域之间的一个或多个策略对象标识符的等价关系,仅在CA证书里存在
    7. 主体别名:指出证书拥有者的别名,如电子邮件地址、IP地址等,别名是和DN绑定在一起的
    8. 颁发者别名:指出证书颁发者的别名,如电子邮件地址、IP地址等,但颁发者的DN必须出现在证书的颁发者字段
    9. 主体目录属性:指出证书拥有者的一系列属性。可以使用这一项来传递访问控制信息。

二、总体结构

先使用File类得到证书文件

然后转成InputStream

使用CertificateFactorygetInstance方法(传入一个值为“x.509”CERT_TYPE字符串)

生成具体的X509Certificate 类型的oCert

再调用oCert的方法打印出证书的各个字段值,或者直接使用oCerttoString方法使用自带的输出格式显示证书

三、数据结构

使用了javajava.security.cert.X509Certificate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

Class X509Certificate

java.lang.Object
java.security.cert.Certificate
java.security.cert.X509Certificate

All Implemented Interfaces:
Serializable, X509Extension

public abstract class X509Certificate
extends Certificate
implements X509Extension

Abstract class for X.509 certificates. This provides a standard way to access all the attributes of an X.509 certificate.
In June of 1996, the basic X.509 v3 format was completed by ISO/IEC and ANSI X9, which is described below in ASN.1:

Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signature BIT STRING }

These certificates are widely used to support authentication and other functionality in Internet security systems. Common applications include Privacy Enhanced Mail (PEM), Transport Layer Security (SSL), code signing for trusted software distribution, and Secure Electronic Transactions (SET).
These certificates are managed and vouched for by Certificate Authorities (CAs). CAs are services which create certificates by placing data in the X.509 standard format and then digitally signing that data. CAs act as trusted third parties, making introductions between principals who have no direct knowledge of each other. CA certificates are either signed by themselves, or by some other CA such as a "root" CA.
More information can be found in RFC 3280: Internet X.509 Public Key Infrastructure Certificate and CRL Profile.
The ASN.1 definition of tbsCertificate is:

TBSCertificate ::= SEQUENCE {
version [0] EXPLICIT Version DEFAULT v1,
serialNumber CertificateSerialNumber,
signature AlgorithmIdentifier,
issuer Name,
validity Validity,
subject Name,
subjectPublicKeyInfo SubjectPublicKeyInfo,
issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version must be v2 or v3
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
-- If present, version must be v2 or v3
extensions [3] EXPLICIT Extensions OPTIONAL
-- If present, version must be v3
}

CERT_PATH证书路径

CERT_TYPE证书类型

CertificateFactory cf证书工厂,一个生成证书对象的工厂类

X509Certificate oCertx.509类型证书的具体类

PublicKey publicKeyx.509证书公钥的base64编码后的结果

四、运行结果

学校的iNode的证书inode.cer

1544971073014

1544971116994

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
【输出证书信息】:
[
[
Version: V3
Subject: CN=Hang Zhou H3C Technologies Co. Ltd.
Signature Algorithm: SHA1withRSA, OID = 1.3.14.3.2.29

Key: Sun RSA public key, 1024 bits
modulus: 148199629927405968956382073147616567233179358210113320709306777553967375963856651557851108826478466678839760325469689021553769874186424161095436667548253443028960425672674463116906373514721988033360565175763697136106454790585983463842151732187920249456205730561231776639647622509382558778957726896461373000261
public exponent: 65537
Validity: [From: Thu Jul 18 16:22:18 CST 2013,
To: Sun Jan 01 07:59:59 CST 2040]
Issuer: CN=Hang Zhou H3C Technologies Co. Ltd.
SerialNumber: [ 1b6450ed cb926889 4c4aa843 d7e85a73]

Certificate Extensions: 1
[1]: ObjectId: 2.5.29.1 Criticality=false
Extension unknown: DER encoded OCTET string =
0000: 04 58 30 56 80 10 AA 4E AC 10 3D 41 7D B7 7C 9D .X0V...N..=A....
0010: 72 AC 08 1D 57 9A A1 30 30 2E 31 2C 30 2A 06 03 r...W..00.1,0*..
0020: 55 04 03 13 23 48 61 6E 67 20 5A 68 6F 75 20 48 U...#Hang Zhou H
0030: 33 43 20 54 65 63 68 6E 6F 6C 6F 67 69 65 73 20 3C Technologies
0040: 43 6F 2E 20 4C 74 64 2E 82 10 1B 64 50 ED CB 92 Co. Ltd....dP...
0050: 68 89 4C 4A A8 43 D7 E8 5A 73 h.LJ.C..Zs

]
Algorithm: [SHA1withRSA]
Signature:
0000: C1 48 6D 3A 24 81 1C F2 4B EE AE E5 90 80 FA 97 .Hm:$...K.......
0010: 09 7B F5 06 86 02 65 0D D8 F2 9F C5 F4 DC 1D 7A ......e........z
0020: C5 00 B1 3D E3 B2 6A CE FB F7 EF 4B 15 B5 22 A9 ...=..j....K..".
0030: 7D 5B 75 2B 25 4F 29 1B 29 19 39 E5 C7 79 E4 35 .[u+%O).).9..y.5
0040: FF B3 3B A3 1D F1 94 EB 06 43 F7 9C 27 3D 67 A0 ..;......C..'=g.
0050: 12 ED 2C 08 84 73 84 A5 18 3F 21 81 FD 0E 96 7E ..,..s...?!.....
0060: AF 39 2A D6 DE E9 FB 77 36 70 0A 95 33 79 38 DF .9*....w6p..3y8.
0070: BA 51 D9 5C 6A 1A 88 32 17 1B 26 B7 CB D0 3B A8 .Q.\j..2..&...;.

]
【版本号】:3
【序列号】:1b6450edcb9268894c4aa843d7e85a73
【签名算法】:SHA1withRSA(1.3.14.3.2.29)
【key usage】:null
【主体名】:CN=Hang Zhou H3C Technologies Co. Ltd.
【主体唯一标识符】:null
【颁发者】:CN=Hang Zhou H3C Technologies Co. Ltd.
【颁发者唯一标识符】:null
【有效期起始】:Thu Jul 18 16:22:18 CST 2013
【有效期结束】:Sun Jan 01 07:59:59 CST 2040
【公钥】:
Sun RSA public key, 1024 bits
modulus: 148199629927405968956382073147616567233179358210113320709306777553967375963856651557851108826478466678839760325469689021553769874186424161095436667548253443028960425672674463116906373514721988033360565175763697136106454790585983463842151732187920249456205730561231776639647622509382558778957726896461373000261
public exponent: 65537
【公钥算法】:RSA
【公钥格式】:X.509
-----------------公钥--------------------
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDTCxRJ54O8cntEyaVZQ7UqaKYo+L5+0hP0Q4r2
o3RIEVW41Ol7hjZ6YuUvBnf5juCWpra+9yvRbsPCK2V0AWLbu5QOABTgHucf9oJWep7cmVv5Nnu3
OzDjcpo3/dW+pU4V8taHaZxnLthVklI9pNG7zXrcrjDda7xBQj4+qbRKRQIDAQAB
-----------------公钥--------------------

百度的证书baidu.cer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
【输出证书信息】:
[
[
Version: V3
Subject: CN=baidu.com, O="Beijing Baidu Netcom Science Technology Co., Ltd", OU=service operation department, L=beijing, ST=beijing, C=CN
Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11

Key: Sun RSA public key, 2048 bits
modulus: 22172950717468251613668444875897120488703425532662862483103420701617929650537839906065889896923285650743692555435137842732783831907918690488914494122782477964261081577111977044858269604672009397876639673425534669405254576080135838706555234239353117490420574379981969266290050697162015267336579248812885254821722617819124501130335093539872969608638385845140739342340028796625937864592665678529725841552502548286812576831707844983511423469247911313988375396159760319617929146140544943472626985235820703186652935210022309292717815782425293404638922877551096137336550299928498654911692840356476167058740463555196585223603
public exponent: 65537
Validity: [From: Tue Apr 03 11:26:03 CST 2018,
To: Sun May 26 13:31:02 CST 2019]
Issuer: CN=GlobalSign Organization Validation CA - SHA256 - G2, O=GlobalSign nv-sa, C=BE
SerialNumber: [ 21ed2cc2 f1092c66 6b15e527]

Certificate Extensions: 9
[1]: ObjectId: 1.3.6.1.4.1.11129.2.4.2 Criticality=false
Extension unknown: DER encoded OCTET string =
0000: 04 81 F5 04 81 F2 00 F0 00 76 00 87 75 BF E7 59 .........v..u..Y
0010: 7C F8 8C 43 99 5F BD F3 6E FF 56 8D 47 56 36 FF ...C._..n.V.GV6.
0020: 4A B5 60 C1 B4 EA FF 5E A0 83 0F 00 00 01 62 89 J.`....^......b.
0030: 8A 4F 0A 00 00 04 03 00 47 30 45 02 20 1B 6D A7 .O......G0E. .m.
0040: 3A 50 CD C0 BB 47 F9 22 2B A3 58 21 0F 99 94 77 :P...G."+.X!...w
0050: B1 8A D1 AF 1C DC D8 40 7B 35 3C AE DC 02 21 00 .......@.5<...!.
0060: D6 8C F9 2A A9 8A 6A 5B CF 8A FA E7 50 88 5F E8 ...*..j[....P._.
0070: 61 0B 2C 1D CC B1 B7 24 4E B3 02 B8 32 8F 1D 88 a.,....$N...2...
0080: 00 76 00 BB D9 DF BC 1F 8A 71 B5 93 94 23 97 AA .v.......q...#..
0090: 92 7B 47 38 57 95 0A AB 52 E8 1A 90 96 64 36 8E ..G8W...R....d6.
00A0: 1E D1 85 00 00 01 62 89 8A 51 44 00 00 04 03 00 ......b..QD.....
00B0: 47 30 45 02 21 00 98 4E 80 AC 67 2D 9F F3 26 FA G0E.!..N..g-..&.
00C0: 73 FB 73 71 C3 F6 7F EC 60 57 BF 14 9E 67 DB 71 s.sq....`W...g.q
00D0: 64 88 BD AB 4F DA 02 20 62 C9 26 5D 45 DA C5 26 d...O.. b.&]E..&
00E0: 03 FB 2E E1 84 FB 76 27 39 47 BD F7 20 C2 65 66 ......v'9G.. .ef
00F0: 27 3D 1D 03 89 A0 84 C8 '=......

[2]: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false
AuthorityInfoAccess [
[
accessMethod: caIssuers
accessLocation: URIName: http://secure.globalsign.com/cacert/gsorganizationvalsha2g2r1.crt
,
accessMethod: ocsp
accessLocation: URIName: http://ocsp2.globalsign.com/gsorganizationvalsha2g2
]
]

[3]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: 96 DE 61 F1 BD 1C 16 29 53 1C C0 CC 7D 3B 83 00 ..a....)S....;..
0010: 40 E6 1A 7C @...
]
]

[4]: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
CA:false
PathLen: undefined
]

[5]: ObjectId: 2.5.29.32 Criticality=false
CertificatePolicies [
[CertificatePolicyId: [1.3.6.1.4.1.4146.1.20]
[PolicyQualifierInfo: [
qualifierID: 1.3.6.1.5.5.7.2.1
qualifier: 0000: 16 26 68 74 74 70 73 3A 2F 2F 77 77 77 2E 67 6C .&https://www.gl
0010: 6F 62 61 6C 73 69 67 6E 2E 63 6F 6D 2F 72 65 70 obalsign.com/rep
0020: 6F 73 69 74 6F 72 79 2F ository/

]] ]
[CertificatePolicyId: [2.23.140.1.2.2][] ]
]

[6]: ObjectId: 2.5.29.37 Criticality=false
ExtendedKeyUsages [
serverAuth
clientAuth
]

[7]: ObjectId: 2.5.29.15 Criticality=true
KeyUsage [
DigitalSignature
Key_Encipherment
]

[8]: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
DNSName: baidu.com
DNSName: baifubao.com
DNSName: www.baidu.cn
DNSName: www.baidu.com.cn
DNSName: mct.y.nuomi.com
DNSName: baifae.com
DNSName: apollo.auto
DNSName: *.baidu.com
DNSName: *.baifubao.com
DNSName: *.baidustatic.com
DNSName: *.bdstatic.com
DNSName: *.bdimg.com
DNSName: *.hao123.com
DNSName: *.nuomi.com
DNSName: *.chuanke.com
DNSName: *.trustgo.com
DNSName: *.bce.baidu.com
DNSName: *.eyun.baidu.com
DNSName: *.map.baidu.com
DNSName: *.mbd.baidu.com
DNSName: *.fanyi.baidu.com
DNSName: *.baidubce.com
DNSName: *.mipcdn.com
DNSName: *.news.baidu.com
DNSName: *.baidupcs.com
DNSName: *.aipage.com
DNSName: *.aipage.cn
DNSName: *.bcehost.com
DNSName: *.safe.baidu.com
DNSName: *.im.baidu.com
DNSName: *.ssl2.duapps.com
DNSName: *.baifae.com
DNSName: *.baiducontent.com
DNSName: *.dlnel.com
DNSName: *.dlnel.org
DNSName: *.dueros.baidu.com
DNSName: *.su.baidu.com
DNSName: *.91.com
DNSName: *.hao123.baidu.com
DNSName: *.apollo.auto
DNSName: *.xueshu.baidu.com
DNSName: *.bj.baidubce.com
DNSName: *.gz.baidubce.com
DNSName: click.hm.baidu.com
DNSName: log.hm.baidu.com
DNSName: cm.pos.baidu.com
DNSName: wn.pos.baidu.com
DNSName: update.pan.baidu.com
]

[9]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 45 36 AC EA 1D 89 68 E1 2B 39 11 AD 23 9C D1 59 E6....h.+9..#..Y
0010: 36 8B B0 CC 6...
]
]

]
Algorithm: [SHA256withRSA]
Signature:
0000: B9 EC A7 08 DF 8D D5 88 22 FC 56 6A D0 03 61 00 ........".Vj..a.
0010: CC 2F D3 F9 E3 E7 4E D7 A5 4A 95 AC 86 B7 E9 55 ./....N..J.....U
0020: 93 CC F7 B9 16 7B E8 B8 09 8D AC 0A 6B 42 96 45 ............kB.E
0030: D8 DA B7 4C EE C0 09 6E D9 F1 43 BF 00 16 57 A9 ...L...n..C...W.
0040: 76 E7 A7 95 A5 D5 C8 E1 D9 53 98 5A 70 6E 41 0F v........S.ZpnA.
0050: 83 03 CF 72 ED 92 05 39 43 CA 3C 1A A7 C2 6E 7A ...r...9C.<...nz
0060: 05 05 33 8D 3E 00 1D 8F C3 94 8A 2C F1 76 DC CD ..3.>......,.v..
0070: A0 5F 82 EC CA 63 A0 28 19 3B 4A AB 36 9D 90 11 ._...c.(.;J.6...
0080: B5 B2 8C 76 67 13 7E 8E 51 FF 32 A3 2F 3D 30 D5 ...vg...Q.2./=0.
0090: C8 0C 58 B9 D2 81 42 66 91 CA 77 8E D7 AE 02 31 ..X...Bf..w....1
00A0: 72 3B 96 99 0A 9D E7 06 81 87 26 A4 05 FD B3 94 r;........&.....
00B0: 29 E0 B8 32 A3 D3 0F 02 CB D6 AE 5F C5 98 68 D1 )..2......._..h.
00C0: 18 52 E4 C5 E0 E9 8F 3A A2 02 CC 17 7F A5 EA 4C .R.....:.......L
00D0: CD A3 C3 4D DD C0 FB 15 BB 32 8E A7 D2 F6 AC 57 ...M.....2.....W
00E0: FB 19 23 5C B6 A8 CA EA B3 BA AF 22 DA 82 D1 83 ..#\......."....
00F0: 09 4A 5C 52 67 AE D2 9D 66 63 03 08 06 97 1B 9A .J\Rg...fc......

]
【版本号】:3
【序列号】:21ed2cc2f1092c666b15e527
【签名算法】:SHA256withRSA(1.2.840.113549.1.1.11)
【key usage】:[Z@1540e19d
【主体名】:CN=baidu.com, O="Beijing Baidu Netcom Science Technology Co., Ltd", OU=service operation department, L=beijing, ST=beijing, C=CN
【主体唯一标识符】:null
【颁发者】:CN=GlobalSign Organization Validation CA - SHA256 - G2, O=GlobalSign nv-sa, C=BE
【颁发者唯一标识符】:null
【有效期起始】:Tue Apr 03 11:26:03 CST 2018
【有效期结束】:Sun May 26 13:31:02 CST 2019
【公钥】:
Sun RSA public key, 2048 bits
modulus: 22172950717468251613668444875897120488703425532662862483103420701617929650537839906065889896923285650743692555435137842732783831907918690488914494122782477964261081577111977044858269604672009397876639673425534669405254576080135838706555234239353117490420574379981969266290050697162015267336579248812885254821722617819124501130335093539872969608638385845140739342340028796625937864592665678529725841552502548286812576831707844983511423469247911313988375396159760319617929146140544943472626985235820703186652935210022309292717815782425293404638922877551096137336550299928498654911692840356476167058740463555196585223603
public exponent: 65537
【公钥算法】:RSA
【公钥格式】:X.509
-----------------公钥--------------------
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr6TDKhmBjiKc5USSOTCKxoz7yh+6TbA5
MwWfKz7ZIMFjMJmSbqEsfyjIHtXnkz3x/GLGszJnXI2Ylk73VGzW64Nks7svAo+p01icllfjHHc6
9A0Z2EZKU3LI5/DzcdKI/vdzkSi6PXgbHsV2Y8aIIbcXbD5YA0DyhpWA5yBrmneSr2E2Xo+s88KF
cg0yieS6opsqxdKMSpS6ixbFEQLr2XgyGmb2tbslOD6UuxGNRhRgXhx0kcGLJzhLh4IDFZemxYZ8
fScewYkrFGZm6WzNdQZAWkw/QjkdS7EWCN+DBqToDaEBLtQkhiCiLLHLwsK69gfFfQvf4f79dJK3
fo+lswIDAQAB
-----------------公钥--------------------

五、源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.security.PublicKey;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import sun.misc.BASE64Encoder;
public class x509 {
//证书路径
private static final String CERT_PATH = "/home/janking/Desktop/jankingwang.cer";
private static final String CERT_TYPE = "X.509";

public static void main(String[] args) throws Exception {
File file = new File(CERT_PATH);
InputStream inputStream = new FileInputStream(file);

CertificateFactory cf = CertificateFactory.getInstance(CERT_TYPE);
X509Certificate oCert = (X509Certificate)cf.generateCertificate(inputStream);
System.out.println("【输出证书信息】:\n"+oCert.toString());
//主体部分
System.out.println("【版本号】:"+oCert.getVersion());
System.out.println("【序列号】:"+ oCert.getSerialNumber().toString(16));
System.out.println("【签名算法】:"+oCert.getSigAlgName() + "(" + oCert.getSigAlgOID() + ")");
System.out.println("【主体名】:"+oCert.getSubjectX500Principal());
System.out.println("【主体唯一标识符】:"+oCert.getSubjectUniqueID());
System.out.println("【颁发者】:" + oCert.getIssuerX500Principal());
System.out.println("【颁发者唯一标识符】:" + oCert.getIssuerUniqueID());
System.out.println("【有效期起始】:"+oCert.getNotBefore());
System.out.println("【有效期结束】:"+oCert.getNotAfter());
System.out.println("【公钥】:\n "+ oCert.getPublicKey());
System.out.println("【公钥算法】:"+ oCert.getPublicKey().getAlgorithm());
System.out.println("【公钥格式】:"+oCert.getPublicKey().getFormat());

PublicKey publicKey = oCert.getPublicKey();
BASE64Encoder base64Encoder=new BASE64Encoder();
String publicKeyString = base64Encoder.encode(publicKey.getEncoded());
System.out.println("-----------------公钥--------------------");
System.out.println(publicKeyString);
System.out.println("-----------------公钥--------------------");
}
}

六、参考资料

RFC2459

X.509证书结构简介

数字证书工作原理

感谢资助辣条吃!
  • 本文作者: Janking
  • 本文链接: https://janking.wang/post/x509.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!