X.509 证书结构描述

常见的X.509证书格式包括:

后缀 作用
cer/crt 用于存放证书,它是2进制形式存放的,不含私钥
pem 以Ascii来表示,可以用于存放证书或私钥。
pfx/p12 用于存放个人证书/私钥,他通常包含保护密码,2进制方式。
p10 证书请求
p7r CA对证书请求的回复,只用于导入
p7b 以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。

对于常见的https证书 一般是用crt或者pem来保存, http证书可电器网页前的锁按钮得到, 并且进行导出

证书数据结构

此证书结构来着白皮书

https://tools.ietf.org/html/rfc2459#section-4.1

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 }

参考博客:

https://blog.csdn.net/xy010902100449/article/details/52145009

源代码

这里利用的是python3 的 Openssl 库进行解析, 此库的说明文档如下,

https://pyopenssl.org/en/0.15.1/api/crypto.html#x509name-objects

通过阅读说明文档, 可以轻松读取证书相关信息

代码如下

import OpenSSL
import time
from dateutil import parser cert = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, open("test.cer").read())
certIssue = cert.get_issuer() print ("证书版本: ",cert.get_version() + 1) print ("证书序列号: ",hex(cert.get_serial_number())) print ("证书中使用的签名算法: ",cert.get_signature_algorithm().decode("UTF-8")) print ("颁发者: ",certIssue.commonName) datetime_struct = parser.parse(cert.get_notBefore().decode("UTF-8")) print ("有效期从: ",datetime_struct.strftime('%Y-%m-%d %H:%M:%S')) datetime_struct = parser.parse(cert.get_notAfter().decode("UTF-8")) print ("到: ",datetime_struct.strftime('%Y-%m-%d %H:%M:%S')) print ("证书是否已经过期: ",cert.has_expired()) print("公钥长度" ,cert.get_pubkey().bits()) print("公钥:\n" ,OpenSSL.crypto.dump_publickey(OpenSSL.crypto.FILETYPE_PEM, cert.get_pubkey()).decode("utf-8")) print("主体信息:") print("CN : 通用名称 OU : 机构单元名称")
print("O : 机构名 L : 地理位置")
print("S : 州/省名 C : 国名") for item in certIssue.get_components():
print(item[0].decode("utf-8"), " —— ",item[1].decode("utf-8")) print(cert.get_extension_count())

编译运行输出结果

windows 自带的解析结果对比

是完全相同的. 读取成功

使用Python Openssl库解析X509证书信息的更多相关文章

  1. [转贴]使用CryptoAPI解析X509证书和P12证书

    原文在 http://bbs.pediy.com/archive/index.php?t-97663.html,但是觉得这篇文章非常好,我抄下来作我笔记用 一.解析X509证书 1.从磁盘上的证书文件 ...

  2. Python标准库09 当前进程信息 (部分os包)

    原文:Python标准库09 当前进程信息 (部分os包) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们在Linux的概念 ...

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

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

  4. openssl查看apk的证书信息

    查看apk的证书信息: openssl pkcs7 -inform DER -in CERT.RSA -noout -print_certs -text

  5. Python zxing 库解析(条形码二维码识别)

    各种扫码软件 最近要做个二维码识别的项目,查到二维码识别有好多开源的不开源的软件 http://www.oschina.net/project/tag/238/ Zbar 首先试了一下Zbar,pyt ...

  6. Python标准库09 当前进程信息 (os包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们在Linux的概念与体系,多次提及进程的重要性.Python的os包中有查询和 ...

  7. 用Python+qrcode库创建一个包含信息的二维码

    安装qrcode库和PIL库 在命令行中分别输入pip install qrcode 和pip install pillow 导入库格式如下: import PIL import qrcode 下面以 ...

  8. 使用windows crypt API解析X509证书

    一.版本号 结构体CERT_INFO中的字段dwVersion即为证书版本,可以直接通过下面的代码获得: DWORD dwCertVer = m_pCertContext->pCertInfo- ...

  9. 查看ISTIO-CITADEL的证书信息

    进行任何一个POD,查看/etc/certs目录,即可知道证书信息. kubectl exec -it reviews-v1-fd6c96c74-wptxg -c istio-proxy bash l ...

随机推荐

  1. Burp Suite Report - 报告功能

    1. 通过点击Host选择不同的颜色,可以设置严重性: 2.生成网页版应用分析报告:选中所有条目->右击网址,保存所有选中项目,存储格式为html.

  2. Python Ethical Hacking - TROJANS Analysis(1)

    TROJANS A trojan is a file that looks and functions as a normal file(image, pdf, song ..etc). When e ...

  3. vue : 在vuex里写一个数组首尾元素互换的方法

    不着急上代码,先想几个问题. vuex里怎么写方法? mutation里写vuex方法,组件中用commit调用. 数组首尾元素怎么互换? arr.splice(0, 0, arr[arr.lengt ...

  4. 试一试 GraphQL

    GraphQL 简介 一种用于 API 的查询语言. GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时. GraphQL 对你的 API 中的数据提供了一套易于理解的完整 ...

  5. vue学习(五) 访问vue内部元素或者方法

    //html <div id="app"> <input type="button" value="ok" v-bind: ...

  6. Js数组对象的属性值升序排序,并指定数组中的某个对象移动到数组的最前面

    需求整理: 本篇文章主要实现的是将一个数组的中对象的属性值通过升序的方式排序,然后能够让程序可以指定对应的数组对象移动到程序的最前面. 数组如下所示: var arrayData= [{name: & ...

  7. Zabbix-server自动发现,批量添加主机,并链接模板

    zabbix可以手动添加agent客户端,当主机数量比较多时,这时手工重复工作会大大增加.zabbix的自动发现功能可以帮我们解决这个问题. 准备条件: 1. 被监控主机都装上zabbix-agent ...

  8. Centos 7下编译安装Nginx

    一.下载源代码 百度云网盘下载地址:https://pan.baidu.com/s/19MQODvofRNnLV9hdAT-R6w 提取码:zi0u 二.安装依赖及插件 yum -y install ...

  9. Bug -- WebService报错(两个类具有相同的 XML 类型名称 "{http://webService.com/}getPriceResponse"。请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。)

    调用WebService时报错 解决方法: 在提示的两个java文件中加如一行代码namespace = "http://namespace.thats.not.the.same.as.th ...

  10. makefile for Linux纯小白版

    某大佬曾说过: 不会makefile,不要说你会linux,因为makefile是合格程序员的必经之路 首先你要有个vi或者emacs 之类的编辑器 编写几个程序 test1.c #include&l ...