x509证书格式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了x509证书格式相关的知识,希望对你有一定的参考价值。

参考技术A x509证书格式?一、 X.509证书结构
x.509标准规定了证书可以包含什么信息,并说明了记录信息的方法。

X.509结构中包括版本号(integer)、序列号(integer)、签名算法(object)、颁布者(set)、有效期(utc_time)、主体(set)、主体公钥(bit_string)、主体公钥算法(object)、签名值(bit_string)。

使用ASN.1描述,我们可以将其抽象为以下结构

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,

subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
extensions [3] EXPLICIT Extensions OPTIONAL

`

而本次实验,我选择使用从chrome上直接下载证书,此时我们可以看到,证书结构如下:

类 结构 信息 备注
TBSCertificate 版本信息 证书的使用版本 整数格式,0-V1,1-V2,2-V3
TBSCertificate 序列号 每个证书都有一个唯一的证书序列号 整数格式
TBSCertificate 签名算法 得到签名时使用的算法 有OID与之对应
TBSCertificate 颁发者 命名命规则一般采用X.500格式 Name
TBSCertificate 有效期 通用的证书一般采用UTC时间格式,计时范围为1950-2049 Format:yymmddhhmssZ
TBSCertificate 使用者 使用证书的主体 Name
TBSCertificate 主体密钥 证书所有人的公开密钥  
Certificate 公钥签名算法 证书公钥的加密算法 有OID与之对应
Certificate 签名值 得到的签名结果  
二、 数据结构
【编码方法】

X509的编码方法为TLV结构,使用T记录当前数据的类型(type),使用L记录当前数据的长度(length),使用V记录当前数据的取值(value),其中,不同的type值对应不同的数据类型

Type 数据类型 编码格式
01 Boolean 01;01;FF/00
02 Integer 长度大于7f时,长度n与0x80进行“位或”运算的结果赋给length的第一个字节
03 Bit string 填充0成为8的倍数,Value的第一个字节记录填充数
04 Ectet string 04;len;val
05 Null value部分为空,一共两字节
06 Object Identifier V1.V2.V3.V4.V5....Vn (1)计算40*V1+V2作为第一字节;(2)将Vi(i>=3)表示为128进制,每一个128进制位作为一个字节,再将除最后一个字节外的所有字节的最高位置1;(3)依次排列,就得到了value部分
19 ASCII string 13;len;val
23 UTCtime yymmddhhmssZ
24 Generalize time yyyymmddhhmssZ
48 Sequence constructer 序列内所有项目的编码的依次排列
49 Set constructer 集合内所有项目的编码
160 Tag 对于简单类型,type=80+tag序号;对于构造类型,type=A0+tag序号。length和value不变
【数据结构】

类的声明:均使用string类型记录数据,数据具体的内容已经在注释中标出

openssl

基本知识

1,证书标准 X.509

X.509 - 这是一种证书标准,主要定义了证书中应该包含哪些内容.其详情可以参考RFC5280,SSL使用的就是这种证书标准.

X.509的证书文件,一般以.crt结尾,根据该文件的内容编码格式,可以分为以下二种格式:

PEM - Privacy Enhanced Mail

打开看文本格式,以"-----BEGIN..."开头, "-----END..."结尾,内容是BASE64编码.

Apache和*NIX服务器偏向于使用这种编码格式.

DER - Distinguished Encoding Rules

打开看是二进制格式,不可读.

Java和Windows服务器偏向于使用这种编码格式

2,KEY - 通常指私钥。

通常用来存放一个公钥或者私钥,并非X.509证书,编码同样的,可能是PEM,也可能是DER.
查看KEY的办法:openssl rsa -in mykey.key -text -noout
如果是DER格式的话,同理应该这样了:openssl rsa -in mykey.key -text -noout -inform der

3,CSR 是Certificate Signing Request的缩写,即证书签名请求

这不是证书,可以简单理解成公钥,生成证书时要把这个提交给权威的证书颁发机构。
其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好.

4,CRT应该是certificate的三个字母,其实还是证书的意思

常见于*NIX系统,有可能是PEM编码,也有可能是DER编码,大多数应该是PEM编码,相信你已经知道怎么辨别.

5,PFX/P12 - predecessor of PKCS#12

对*nix服务器来说,一般CRT和KEY是分开存放在不同文件中的,但Windows的IIS则将它们存在一个PFX文件中
(因此这个文件包含了证书及私钥)这样会不会不安全?应该不会,PFX通常会有一个"提取密码",你想把里面的东西读取出来的话,它就要求你提供提取密码

 

以上是关于x509证书格式的主要内容,如果未能解决你的问题,请参考以下文章

使用 node.js 验证带有 CA 证书的 X509 证书

Java X509 证书解析和验证

java 从 PKCS12(比如pfx格式)证书中提取私钥证书(PrivateKey)和受信任的公钥证书(X509Certificate)的序列号(SerialNumber)

如何创建一个自签名的SSL证书(X509)

C# 如何验证 Root-CA-Cert 证书 (x509) 链?

C#如何验证Root-CA-Cert证书(x509)链?