数字证书 X509详解 && python解析SSL证书

2023-11-16

数字证书

​ 数字证书就是互联网通讯中标志通讯各方身份信息的一系列数据,提供了一种在Internet上验证您身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构-----CA机构,又称为证书授权,(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份。数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。

X.509信息

​ X.509 标准规定了证书可以包含什么信息,并说明了记录信息的方法(数据格式)。除了签名外,所有 X.509 证书还包含以下数据:

名称 含义
版本 识别用于该证书的 X.509 标准的版本,这可以影响证书中所能指定的信息。迄今为止,已定义的版本有三个。
序列号 发放证书的实体有责任为证书指定序列号,以使其区别于该实体发放的其它证书。此信息用途很多。例如,如果某一证书被撤消,其序列号将放到证书撤消清单 (CRL) 中。
签名算法标识符 用于识别 CA 签写证书时所用的算法。
签发人姓名 签写证书的实体的 X.500 名称。它通常为一个 CA。 使用该证书意味着信任签写该证书的实体(注意:有些情况下(例如根或顶层 CA 证书),签发人会签写自己的证书)。
有效期 每个证书均只能在一个有限的时间段内有效。该有效期以起始日期和时间及终止日期和时间表示,可以短至几秒或长至一世纪。所选有效期取决于许多因素,例如用于签写证书的私钥的使用频率及愿为证书支付的金钱等。它是在没有危及相关私钥的条件下,实体可以依赖公钥值的预计时间。
主体名 证书可以识别其公钥的实体名。此名称使用 X.500 标准,因此在Internet中应是唯一的。它是实体的特征名 (DN),例如,
CN=Java Duke,OU=Java Software Division,O=Sun Microsystems Inc,C=US
(这些指主体的通用名、组织单位、组织和国家)。
主体公钥信息 这是被命名实体的公钥,同时包括指定该密钥所属公钥密码系统的算法标识符及所有相关的密钥参数。
成员 格式
版本号 INTEGER
序列号 INTEGER
签名算法 OBJECT
颁发者 SET
有效期 UTC_TIME
主体 SET
主体公钥 BIT_STRING
主体公钥算法 OBJECT
签名值 BIT_STRING

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

​ cer/crt是用于存放证书,它是2进制形式存放的,不含私钥。

​ pem跟crt/cer的区别是它以Ascii来表示,可以用于存放证书或私钥。

​ pfx/p12用于存放个人证书/私钥,他通常包含保护密码,2进制方式。

​ p10是证书请求。

​ p7r是CA对证书请求的回复,只用于导入

​ p7b以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。

X.509证书数据结构:

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 }

python解析X509证书

导入对应的包
import ssl
import OpenSSL
from dateutil import parser
获取证书返回信息
resp=ssl.get_server_certificate(('www.qq.com', 443))
解析证书信息
x509 =OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM,resp )
解析具体数据
issuer=x509.get_issuer()    #获取证书发行者名称
time1=parser.parse(x509.get_notBefore().decode("UTF-8"))  #获取证书发放时间
对应函数
 'get_issuer',                    证书发行者名称
    "CN : 通用名称  OU : 机构单元名称"
    "O  : 机构名    L  : 地理位置"
    "S  : 州/省名   C  : 国名"
 'get_notAfter',                  证书有效期终止时间
 'get_notBefore',                 证书有效期终止时间
 'get_pubkey',                    证书公钥值
 'get_serial_number',             证书序列号,对同一CA所颁发的证书,序列号唯一标识证书
 'get_signature_algorithm',       证书签名算法标识
 'get_subject',                   证书主体名称
 'get_version',					  证书版本
 'has_expired',                   证书是否已经过期
  'gmtime_adj_notAfter',
 'gmtime_adj_notBefore',
 'set_issuer',
 'set_notAfter',
 'set_notBefore',
 'set_pubkey',
 'set_serial_number',
 'set_subject',
 'set_version',
 'sign',
 'subject_name_hash',
 'to_cryptography'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数字证书 X509详解 && python解析SSL证书 的相关文章

  • 让 VoiceChannel.members 和 Guild.members 返回完整列表的问题

    每当我尝试使用 VoiceChannel members 或 Guild members 时 它都不会提供适用成员的完整列表 我从文本命令的上下文中获取 VoiceChannel 和 Guild 如下所示 bot command name
  • 计算另一个字符串中多个字符串的出现次数

    在 Python 2 7 中 给定以下字符串 Spot是一只棕色的狗 斑点有棕色的头发 斑点的头发是棕色的 查找字符串中 Spot brown 和 hair 总数的最佳方法是什么 在示例中 它将返回 8 我正在寻找类似的东西string c
  • 在 Celery 任务中调用 Google Cloud API 永远不会返回

    我正在尝试拨打外部电话Google Cloud Natural Language API从一个内Celery任务 使用google cloud python包裹 问题是对 API 的调用永远不会返回 挂起 celery task def g
  • 更好地相当于这个疯狂的嵌套 python for 循环

    for a in map for b in map a for c in map b for d in map c for e in map d print a b c d e 上面的代码用于创建图中一定长度的所有路径 map a 表示从
  • PyQt 使用 ctrl+Enter 触发按钮

    我正在尝试在我的应用程序中触发 确定 按钮 我当前尝试的代码是这样的 self okPushButton setShortcut ctrl Enter 然而 它不起作用 这是有道理的 我尝试查找一些按键序列here http ftp ics
  • 使用 luasocket smtp 和 ssl 发送电子邮件

    我一直在尝试使用帖子中描述的代码发送电子邮件 lua使用gmail账户发送邮件 https stackoverflow com questions 11070623 lua send mail with gmail account 代码由米
  • 从 Powershell 脚本安装 Python

    当以管理员身份从 PowerShell 命令行运行以下命令时 可以在 Windows 11 上成功安装 Python c temp python 3 11 4 amd64 exe quiet InstallAllUsers 0 Instal
  • 使用 Python Oauthlib 通过服务帐户验证 Google API

    我不想使用适用于 Python 的 Google API 客户端库 但仍想使用 Python 访问 Google APIOauthlib https github com idan oauthlib 创建服务帐户后谷歌开发者控制台 http
  • python的shutil.move()在linux上是原子的吗?

    我想知道python的shutil move在linux上是否是原子的 如果源文件和目标文件位于两个不同的分区上 行为是否不同 或者与它们存在于同一分区上时的行为相同吗 我更关心的是如果源文件和目标文件位于同一分区上 shutil move
  • Python GTK+ 画布

    我目前正在通过 PyGobject 学习 GTK 需要画布之类的东西 我已经搜索了文档 发现两个小部件似乎可以完成这项工作 GtkDrawingArea 和 GtkLayout 我需要一些基本函数 如 fillrect 或 drawline
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • Protobuf 如何编码 oneof 消息结构

    对于这个 python 程序 在编码时运行 protobuf 编码会给出以下输出 0a 10 08 7f8a 0104 08 02 10 0392 0104 08 02 10 03 18 01 我不明白的是为什么8a后面有一个01 为什么9
  • 为什么 csv.DictReader 给我一个无属性错误?

    我的 CSV 文件是 200 Service 我放入解释器的代码是 snav csv DictReader open screennavigation csv delimiter print snav fieldnames 200 for
  • 如果 PyPy 快 6.3 倍,为什么我不应该使用 PyPy 而不是 CPython?

    我已经听到很多关于PyPy http en wikipedia org wiki PyPy项目 他们声称它比现有技术快 6 3 倍CPython http en wikipedia org wiki CPython口译员开启他们的网站 ht
  • 制作一份 Python 文档的 PDF 文件

    Python 官方网站提供 PDF 文档下载 但它们是按章节分隔的 我下载了源代码并构建了 PDF 文档 这些文档也是单独的 PDF 我怎么能够从源代码中的 Makefile 构建一个 PDF 文件 我认为这样阅读起来会更方便 如果连接单独
  • Firebase Firestore:获取文档的生成 ID (Python)

    我可以创建一个新文档 带有自动生成的 ID 并存储对其的引用 如下所示 my data key value doc ref db collection u campaigns add my data 我可以像这样访问数据本身 print d
  • pandas.read_csv 将列名移动一倍

    我正在使用位于的 ALL zip 文件here http www fec gov disclosurep PDownload do 我的目标是用它创建一个 pandas DataFrame 但是 如果我跑 data pd read csv
  • 将索引与值交换的最快方法

    考虑pd Series s s pd Series list abcdefghij list ABCDEFGHIJ s A a B b C c D d E e F f G g H h I i J j dtype object 交换索引和值并
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是
  • 如何在Python脚本中从youtube-dl中提取文件大小?

    我是 python 编程新手 我想在下载之前提取视频 音频大小 任何 YouTube 视频 gt gt gt from youtube dl import YoutubeDL gt gt gt url https www youtube c

随机推荐

  • 用AI给图片上色 在线将黑白照片处理成彩色照片工具(干货)

    一个在线的网址 用此工具可以给黑白照片上色 刚刚测试了一下 效果算是可以吧 图片直接进行拖拽 或者是在页面点击添加 处理后点击download即可 AI智能上色 效果看起来还不错吧 下面是测试的 图片转换地址 https imagecolo
  • timesten常见的一些简单问题

    环境为 instance name为eservice安装目录为 home timesten TimesTen 下面这些问题是针对新手而言的 通过这些问题可以帮助刚接触timesten的人可以快速配置timesten more 如何启动 ho
  • 成为优秀程序员的方法就是抛开编程?

    原文 How To Become a Better Programmer by Not Programming 作者 Jeff Atwood 我在2006年写过一篇题为 Programmers as Human Beings 程序员 亦人类
  • Python自动化操作Excel表格

    目录 一 Python打开及读取Excel表格内容 二 Python向Excel表格中写 三 批量调整字体 样式 四 编程生成Excel内图表 一 Python打开及读取Excel表格内容 打开以及读取Excel表格内容 列 column
  • 查看Google Chrome浏览器里的Cookie 文件

    文章目录 环境 步骤 扩展 chrome postman自动带入cookie 参考 平时访问各种网站查阅资料时 总是会弹框询问是否可以保存Cookie信息等 于是就好奇 看下Cookie文件存在哪里的 本文主要是基于这个问题出发 不了解co
  • MAVEN常用命令

    Maven库 http repo2 maven org maven2 Maven依赖查询 http mvnrepository com Maven常用命令 1 创建Maven的普通java项目 mvn archetype create Dg
  • Apache Derby 数据库 - 教程

    阿帕奇德比 本文介绍如何安装 Apache Derby 数据库 如何启动 Derby 服务器 如何通过 Java 连接到 Derby 以及如何使用 Derby 命令行工具发出 SQL 语句 还解释了将 Apache Derby 安装为 Wi
  • BCompare 4 key SN 亲测可用

    支持BCompare 4 2 32位 亲测可用 key w4G in5u3SH75RoB3VZIX8htiZgw4ELilwvPcHAIQWfwfXv5n0IHDp5hv 1BM3 H1XygMtiE0 JBgacjE9tz33sIh542
  • 《机器学习》理论——速读学习2 常用方法(3)

    机器学习 理论 速读学习2 常用方法 3 该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 time 2021 12 24 学习目标 我需要了解神经网络除了工程化部分之外的更多内容 以便于在实际有效数据中可以获得抽象
  • ArcGis Server开发Web GIS新手体验(一)

    ArcGIS Server是ESRI公司最新推出的服务器端品 主要可以实现两大功能 强大的Web GIS系统的开发 分布式GIS系统的开发 ArcGIS Server其内核与ArcGIS Desktop和ArcGIS Engine一样 都是
  • Oracle数据库中日期的操作、主键自增与分页查询

    1 oracle数据库中的日期 在Oracle数据库中 DATE类型的存储范围为公历前4712年1月1日至公历后 9999年12月31日 这个日期范围也被称为Oracle库中支持的 Gregorian calendar 尽管在实际应用中一般
  • react 事件监听

    react事件监听 在react js里监听事件很容易 需要给被监听的事件元素加上属性类似于onclick onkeydown这样的属性 例如我们现在要给title 加上点击时间的监听 class Title extends Compone
  • 懒人神器:自动生成单元测试插件 Squaretest

    你是否常常因代码需编写单元测试而痛苦不堪 你是否因单元测试历史债而惆怅不断 Squaretest或许能帮你消除痛苦消除惆怅 前言 一 Squaretest是什么 二 使用步骤 1 引入插件 2 使用步骤 总结 背景 近来公司增加了代码质量门
  • Matlab_牛顿迭代法解非线性方程

    例 用牛顿迭代法 取x初值为1 5 解算非线性方程 x 3 x 1 0 的根 程序代码 manewton m function x manewton fun dfun x0 ep N if nargin lt 5 N 500 end if
  • matlab画一个正弦函数y=sin(x)(全网最简便,没有之一)

    本博日常打卡 x 0 pi 100 2 pi y sin x plot x y plottools 说明 plottools on 按照您上次使用时的布局在当前图窗上显示图窗选项板 绘图浏览器和属性编辑器 不带参数的 plottools 与
  • live reload enabled是什么意思_老外说“Pigheaded”什么意思?猪头三?才不是

    最近 猪肉价格 一路飞涨 老妈买完菜 每天都在唠唠叨叨 今天排骨又涨了xx块钱 五花肉又涨了xx 邻居家长里短 聊得都是 猪肉 简直像小猪佩奇花一亿买了 小区热搜榜 似的 所以 小编就想着倒腾一篇 猪猪 相关的英语知识 分享给大家 咳咳 蹭
  • 初级5 题目一 认识哈希函数和哈希表

    1 哈希函数的定义及性质 1 哈希函数是函数 所以接收一个变量 返回一个值 接收的变量 其定义域理论上是无穷大 返回的值是哈希值 也就是每个变量都能生成对应的哈希值 2 哈希函数的值域是有穷的 哈希值有穷个 并非无穷大 哈希函数相当于把无穷
  • 作用域&内存空间

    作用域 C 语言编译器可以确认 4 种不同类型的作用域 代码块作用域 文件作用域 原型作用域和函数作用域 文件作用域 全局变量 函数名 链接属性 简单的来说 编译器将你的源文件变成可执行程序需要经过两个步骤 编译和链接 编译过程主要是将你写
  • nginx基本介绍(安装、常用命令、反向代理)

    文章目录 引言 一 nginx是什么 二 nginx的下载和安装 1 下载 2 windows下安装 3 运行 4 外部服务器无法访问问题 三 nginx的常用命令 四 nginx config 五 FileZilla 1 什么是FileZ
  • 数字证书 X509详解 && python解析SSL证书

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