X509证书是采用DER编码的ASN1结构数据:

Certificate::=SEQUENCE{

tbsCertificate TBSCertificate,

signatureAlgorithm AlgorithmIdentifier,

signatureValue BIT STRING

}

整体X509证书是SEQUENCE类型,包括三个元素。其中,tbsCertificate是证书数据本身, TBSCertificate类型,是整个X509证书数据的主体。所谓”TBS”就是“To be signed”的缩写,tbsCertificate的意思就是“要被签名的证书内容”。因为在前面的文章讲过,每张证书都是被上一级证书对应的私钥签过名的(顶级证书是自签名);signatureAlgorithm就是所使用的的签名算法标识;signatureValue就是签名结果。

建议使用一些ASN1解析工具,打开一个证书cer文件,对照实例学习。我这里用的是Asn1Editor,打开证书文件效果如下:

下面介绍一下各个元素。第一个是tbsCertificate,TBSCertificate类型,其结构定义如下。

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

}

TBSCertificate同样是SEQUENCE,其各个元素说明如下:

  • version
    证书的版本号,Version类型,其定义如下:

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

version的默认值是V1,但实际上现在使用的证书基本是V2或V3版本。由于Tag标记为[0] EXPLICIT,所以版本号如果没有被省略,编码时会在它外面加一个新的标识。如下图,可见此证书的版本是V3:

  • serialNumber
    证书的序列号,CertificateSerialNumber类型,即INTEGER类型。

CertificateSerialNumber ::= INTEGER

  • signature
    虽然名字叫”signature”,它实际上是证书进行签名时的算法标识,AlgorithmIdentifier类型,定义如下:

AlgorithmIdentifier ::= SEQUENCE {

algorithm OBJECT IDENTIFIER,

parameters ANY DEFINED BY algorithm OPTIONAL

}

下图可以看出,此证书的签名算法标识是‘’1.2.156.10197.1.501”,也就是使用SM2和SM3的签名算法。

  • issuer
    证书颁发者信息,Name类型,相关类型定义如下:

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

本文中的证书颁发者包含三个信息:所在国别(countryName),颁发机构名称(organizationName)和通用名称(commonName)。

  • validity
    证书有效期,Validity类型

Validity ::= SEQUENCE {

notBefore Time, – 证书有效期起始时间

notAfter Time – 证书有效期终止时间

}

Time ::= CHOICE {

utcTime UTCTime,

generalTime GeneralizedTime }

从上图可以看出,本文证书有效期起始和终止时间是UTCTime类型,长度5年。

  • subject
    证书持有人(主体)信息。本文证书包含国别,所在省(stateOrProviceName),地址(localityName),机构名称和通用名称等持有人信息。
  • subjectPublicKeyInfo
    证书公钥信息,SubjectPublicKeyInfo类型,定义如下:

SubjectPublicKeyInfo ::= SEQUENCE {

algorithm AlgorithmIdentifier, – 公钥算法

subjectPublicKey BIT STRING – 公钥值

}

本证书algorithm的算法标识是ecPublicJKey,说明使用ECC算法,第二个OBJECT IDENTIFIER是参数,具体说明是采用基于ECC算法的SM2算法。

  • issuerUniqueID
    证书颁发者ID,UniqueIdentifier类型,可选。本证书里不包括。

UniqueIdentifier ::= BIT STRING

  • subjectUniqueID
    证书持有人ID,UniqueIdentifier类型,可选。本证书里不包括。
  • extensions
    证书扩展字段,Extensions类型,可选。

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

Extension ::= SEQUENCE {

extnID OBJECT IDENTIFIER,

critical BOOLEAN DEFAULT FALSE,

extnValue OCTET STRING }

本文证书包含的扩展字段如下图,具体不再一一说明。

第二个元素signatureAlgorithm值也是‘’1.2.156.10197.1.501”,说明同样是SM2签名。

第三个元素signatureValue是BIT STRING类型。值为对tbsCertificate的SM2签名,而按照国密标准本身SM2签名也是ASN1结构,所以从下图可以看出签名的r-s结构。

证书的X509结构就介绍完毕,欢迎各位指正。

X509证书结构解析相关推荐

  1. gmssl编程之X509证书解析

    gmssl编程之X509证书解析 引言 X509语法结构 基本项 证书版本号 证书序列号 证书颁发者 证书使用者 证书有效期 证书公钥 扩展项 基本约束 密钥用途 增强型密钥用途 颁发者标识 使用者标 ...

  2. openssl解析国密X509证书

    openssl解析国密X509证书,把公钥拿出来重写一下就行了         x = strToX509(pbCert, pulCertLen); dwRet = getCertPubKey(x,  ...

  3. 通过OpenSSL解析X509证书基本项

    在之前的文章"通过OpenSSL解码X509证书文件"里,讲述了如何使用OpenSSL将证书文件解码,得到证书上下文结构体X509的方法.下面我们接着讲述如何通过证书上下文结构体X ...

  4. 使用Python Openssl库解析X509证书信息

    文章目录 X.509 证书结构描述 证书数据结构 源码 编译运行输出结果 参考文献 X.509 证书结构描述 常见的X.509证书格式包括: 对于常见的https证书 一般是用crt或者pem来保存, ...

  5. Python解析证书结构方法

    Python解析证书结构方法 示例代码 示例代码 推荐使用:Python库 pyasn1 和 pyasn1-modules,pip安装失败的话,用conda安装即可. from pyasn1_modu ...

  6. 【Qt】x509证书操作之解析证书信息

    QSslCertificate支持x509证书信息的解析 证书信息接口 函数 功能 QByteArray version() const 版本 QByteArray serialNumber() co ...

  7. java解码p7b证书文件,通过OpenSSL解码X509证书文件

    在Windows平台下,如果要解析一个X509证书文件,最直接的办法是使用微软的CryptoAPI.但是在非Windows平台下,就只能使用强大的开源跨平台库OpenSSL了.一个X509证书通过Op ...

  8. Fabric Block区块结构解析

    Fabric Block区块结构解析 作者: AlexTan CSDN: http://blog.csdn.net/alextan_ Github: https://github.com/AlexTa ...

  9. OPENSSL X509证书验证

    openssl实现了标准的x509v3数字证书,其源码在crypto/x509和crypto/x509v3中.其中x509目录实现了数字证书以及证书申请相关的各种函数,包括了X509和X509_REQ ...

  10. 关于X509证书和密钥的概念

    证书概述 证书主要包括颁发者和被办法者的信息,以及被颁发者的公钥,和CA机构对这些信息的认证, 主要内容: **版本** 识别用于该证书的 X.509 标准的版本,这可以影响证书中所能指定的信息.迄今 ...

最新文章

  1. consul作为服务注册中心
  2. Mysql8报You need either to explicitly disable SSL by setting useSSL=false
  3. Monitorix 2.6.0 发布,系统监控工具
  4. 2016年工作中遇到的问题11-20
  5. Htmlunit 使用记录
  6. keil中 code、data、idata的区别
  7. JetBrains:webstrom中代码模板设置
  8. 三角函数公式大全(速查手册)
  9. 单例模式几种实现方式和代码
  10. java-php-net-python-海鲜购物淘电商平台计算机毕业设计程序
  11. 道路覆盖 (二分答案+状压DP)
  12. python corpora.Dictionary corpus dictionary.doc2bow 词袋模型转为稀疏矩阵 词向量 不要词袋模型
  13. html5 自动连接wifi,怎么设置自动切换wifi 点击右上角的【高级设置】
  14. 【IDEA】idea 调试技巧 异常断点 断点之前显示异常字段
  15. HTML无序列表布局
  16. 【第一章】浅谈游戏作弊类型与核心原理
  17. Lagrange乘子法
  18. CentOS主要镜像文件类型介绍
  19. GIF动画制作工具哪个好
  20. Oracle导数常见问题-IMP-00003: 遇到 ORACLE 错误 20001,导数据出现问题

热门文章

  1. 手机查看IGES,STP,STEP文件APP推荐-Glovius
  2. debian 文件夹中文件大小_linux 查看文件和文件夹大小
  3. 【线性分类器】(三)线性分类器的松弛求解: LEMS 算法,H-K 算法
  4. 自定义 Bean 作用域
  5. 电子绘本pdf_【孩子必看的】20本世界著名英文绘本 | PDF电子版+MP3音频
  6. ESS 控制台之访问控制篇
  7. 疲劳检测(一)Landmark + HeadPose
  8. 利用公网Msf+MS17010跨网段攻击内网
  9. 微信小程序自定义tabbar 图标凸出效果
  10. OV7725摄像头软件实现简单的二值化处理