一、 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类型记录数据,数据具体的内容已经在注释中标出

三、 算法流程

  1.  打开.cer文件,选择按字节读取,即每次读取一个字符
    
  2.  读取的整体流程如下:
    

a) 读取一个字节的type

b) 读取一个字节的length

c) 对type进行判断:如果type是非标签的:直接根据类型判断当前的数据类型是什么

d) 对real length进行判断:根据type决定读取的数据长度,如integer区分长短数据,减去0x80后才是真正的长度值,同时换算出真正的长度

e) 对value进行记录:根据长度读入实际的数据,并转换成自己需要的格式,如06的格式为V11.V2.V3….

  1.  每次读取到value后,直接赋值给证书中的内容,此时,我们首先需要对当前的赋值对象进行判断
    

a) 根据证书的结构,我们对读取的过程划分为以下阶段: "ver", "seq", "sigalg", "iss", "starttime","endtime", "usr", "keyalg",”sigalg”

b) 此时,我们可以根据当前的赋值阶段n和此时读取的数据类型type来判断当前的赋值对象究竟是什么,避免产生因为发布者数目不统一而无法读取所有.cer文件的问题

P.S. 参考了https://www.cnblogs.com/jiu0821/p/4598352.html 并进行了优化

详见githubhttps://github.com/SongXiaotong/websecurity-course/tree/master/x.509

X509证书结构及解析相关推荐

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

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

  2. gmssl编程之X509证书解析

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

  3. openssl解析国密X509证书

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

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

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

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

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

  6. Python解析证书结构方法

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

  7. 数字证书 X509详解 python解析SSL证书

    数字证书 ​ 数字证书就是互联网通讯中标志通讯各方身份信息的一系列数据,提供了一种在Internet上验证您身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证.它是由一个由权威机构-----C ...

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

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

  9. OPENSSL X509证书验证

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

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

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

最新文章

  1. VMware上实现LVS负载均衡(NAT)
  2. mysql基础sql语句_SQL基础语句汇总
  3. 编译时,输出信息重定向到文件
  4. 基于Docker方式实现Elasticsearch集群
  5. linux修改端口监听地址,修改nginx/Tomcat等Web服务的端口监听地址
  6. 【PAT乙】1083 是否存在相等的差 (20分) map
  7. matlab padarray
  8. vivado ip xdc 和user xdc 编译顺序
  9. 基于java的网络抓包方法
  10. C#从入门到精通之第一篇: C#概述与入门
  11. 线性代数学习之坐标转换和线性变换
  12. NOIP2015斗地主
  13. B站学习法之深度学习笔记一
  14. 解决 Maven ‘parent.relativePath‘ of POM
  15. 有什么方法可以把WPS转为Word:小白教你一招搞定
  16. 程序员专属手机壁纸来了。。。
  17. Messari 2022年度报告9 - DAO亦有道
  18. C/C++中的exit()函数
  19. 听说台积电去美国建厂出问题了?张忠谋:明年再说
  20. RD自身修养 生命不息,学习不止

热门文章

  1. linux内存使用率如何查看,linux内存使用率 linux查看内存
  2. 大学计算机基础知识课本,大学计算机基础 教材简介
  3. 安装wget 、 wget命令
  4. python为什么叫胶水语言-为什么称python为胶水语言
  5. jclasslib插件
  6. 业务需求分析师最重要的5项顶级技能
  7. 戴尔dell电脑恢复出厂设置教程(BIOS恢复出厂设置,新版台式机)
  8. ANSYS入门——模态分析步骤与实例详解
  9. 通过子网掩码和ip地址计算网络地址和广播地址
  10. 扫雷(简易版) 10*10