X.509证书的使用

2023-10-26

总结一下如何使用X.509证书来保护我们的设备的数据传输。

证书的签发

以下是证书签发的流程,为了更好的演示,我们需要分别创建两个根证书,并且用每个根证书来颁发一个客户端证书。这两个根证书分别为root_1.crt以及root_2.crt,对应的两个客户端证书分别为client_1.crt以及client_2.crt

  1. openssl genrsa -out rootkey.pem 2048
    生成根证书的密匙
  2. openssl req -x509 -new -key rootkey.pem -out root.crt -subj="/C=CN/ST=GD/L=GZ/O=RootCA/OU=RootCA/CN=RootCA"
    生成X509格式根证书
  3. openssl genrsa -out clientkey.pem 2048
    生成客户端的密匙
  4. openssl req -new -key clientkey.pem -out client.csr -subj="/C=CN/ST=GD/L=GZ/O=BMW/OU=Vehicle/CN=Vehicle1"
    生成客户端证书的请求文件,请求根证书来签发
  5. openssl x509 -req -in client.csr -CA root.crt -CAkey rootkey.pem -CAcreateserial -days 3650 -out client.crt
    用根证书来签发客户端请求文件,生成客户端证书client.crt

证书的验证

验证客户端的证书是否是受信任的机构签发,例如以下的代码将验证client_1.crt是由root_1.crt签发,而client_2.crt不是由root_1.crt签发。

from OpenSSL.crypto import load_certificate, X509Store, X509StoreContext, X509StoreContextError

root_cert_1 = load_certificate(FILETYPE_PEM, open('root_1.crt').read())
root_cert_2 = load_certificate(FILETYPE_PEM, open('root_2.crt').read())
client_cert_1 = load_certificate(FILETYPE_PEM, open('client_1.crt').read())
client_cert_2 = load_certificate(FILETYPE_PEM, open('client_2.crt').read())

store_1 = X509Store()
store_1.add_cert(root_cert_1)
store_2 = X509Store()
store_2.add_cert(root_cert_2)

store_ctx = X509StoreContext(store_1, client_cert_1)
try:
    if store_ctx.verify_certificate()==None:
        print('Verify passed')
except X509StoreContextError:
    print('Verfiy fail')

store_ctx = X509StoreContext(store_1, client_cert_2)
try:
    if store_ctx.verify_certificate()==None:
        print('Verify passed')
except X509StoreContextError:
    print('Verfiy fail')

信息签名

有了证书之后,我们就可以用客户端的证书来对一段消息生成的摘要进行签名,这样可以确保消息没有被第三方篡改。

from cryptography import x509
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding

#Load the private key and sign the message digest
with open("clientkey_1.pem", "rb") as key_file:
    private_key = serialization.load_pem_private_key(key_file.read(),password=None)
message = b"A message I want to sign"
signature = private_key.sign(
    message,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)

#Load the public key from cert and verify the signature
client_cert_1 = x509.load_pem_x509_certificate(open('client_1.crt', 'rb').read())
public_key = client_cert_1.public_key()
public_key.verify(
    signature,
    message,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

X.509证书的使用 的相关文章

  • node.js http 服务器,检测客户端何时断开连接

    我使用express 和node js 作为http 服务器 我存储响应对象 以便可以将事件流式传输到该通道上的客户端 有没有办法检测客户端何时断开连接 当我杀死我的客户端时 我仍然可以写入响应对象 而不会收到任何类型的异常 错误 看起来只
  • 如何用 Java 以编程方式下载网页

    我希望能够获取网页的 html 并将其保存到String 这样我就可以对其进行一些处理 另外 我如何处理各种类型的压缩 我将如何使用 Java 来做到这一点 我会使用像样的 HTML 解析器Jsoup http jsoup org 那么就很
  • Django:如何在ajax中返回模型表单集并在模板中使用

    我需要在运行时使用ajax动态地将表单添加到我的表单集中 我指的是使用 Ajax 将表单动态添加到 Django 表单集 https stackoverflow com questions 501719 dynamically adding
  • Http PUT 请求到 jpeg

    我收到了如下 HTTP PUT PUT photo HTTP 1 1 X Apple AssetKey F92F9B91 954E 4D63 BB9A EEC771ADE6E8 X Apple Transition Dissolve Con
  • 如何使用 Jade 和 Node.js 迭代 JSON 数组

    所以我有这个 JSON 数组apiData被传递到视图作为data Backend router get function req res var data JSON stringify apiData res render gallery
  • video 元素发送多个网络请求

    我有一个带有 mp4 源的视频元素
  • IIS7 和 HTTP 状态代码处理

    我因试图对 IIS7 集成模式 中的错误呈现进行完整的编程控制而感到非常头疼 我想要做的是给出一个错误 找不到页面 内部服务器错误 未经过身份验证等 将整个请求传输到自定义 ASPX 或 HTML 我更喜欢后者 并使用正确的 HTTP 状态
  • 文件下载时文件名损坏 (IE)

    我实现了一个简单的文件上传下载机制 当用户单击文件名时 将下载带有以下 HTTP 标头的文件 HTTP 1 1 200 OK Date Tue 30 Sep 2008 14 00 39 GMT Server Microsoft IIS 6
  • Angular:将数据从工厂 ajax 调用传递回我的控制器

    我一直在使用 Angular 并且已经从使用本地数据 似乎工作正常 转向尝试通过工厂中的 ajax 调用来填充我的视图 这是代码 div h2 Get data using a Factory h2 div div div
  • 如何为 HTTP GET 的多个 Key-Value 参数设计 REST URI

    我正在设计一个 RESTful API 一项服务应该提供多个键值对的查询功能 例如 客户端可以使用一个 HTTP GET 请求来查询不同的产品及其关联的数量 客户想要查询金额为 44 的产品 1 和金额为 55 的产品 2 我实际上不希望我
  • Perl:读取网页文本文件并“打开”它

    我正在尝试创建一个脚本来读取文本文件 然后分析它们 无论文本文件是在线还是离线 离线部分完成 使用 open FILENAME anyfilename txt analyze file sub analyze file while
  • 有什么方法可以处理 HTTP/2 Goaway 在 HttpClient java 中收到的 IOException 吗?

    我在应用程序中进行 API 调用 在某个时候它会随机抛出java io IOException 149 222 1 1 553232 GOAWAY received 使用Java 11环境 无论如何要解决此异常而不是迁移到 Http 1 1
  • gradle - 从 url 下载并解压文件

    从 url 下载和解压文件的正确 gradle 方法是什么 http 如果可能的话 我想防止每次运行任务时重新下载 在ant get可以通过以下方式实现skipexisting true 我当前的解决方案是 task foo ant get
  • 无法更改 php 会话 cookie 名称

    我将现有且成功运行的站点复制到新的开发服务器 新服务器上的登录现在已损坏 我追踪到虽然会话 cookie 已重命名 ini set session name DOMAIN1 浏览器继续将会话 cookie 存储为 PHPSESSID 当我从
  • C# HttpWebRequest 服务器未返回完整响应

    我正在向返回带有数据的 HTML 的服务器发出 HTTP 请求 但有时它会 停在中间 没有任何明确的解释 例如响应结束 Content length 14336 chars p p br ul ul example com var auth
  • RxJS Angular2 在 Observable.forkjoin 中处理 404

    我目前正在链接一堆 http 请求 但是在订阅之前我无法处理 404 错误 My code 在模板中 service getData subscribe data gt this items data err gt console log
  • 我应该使用哪种协议来传输音频(非直播)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 脚本和链接标签的简写 http:// 为 // ?有人以前看过/用过这个吗?

    问题如下 如果您使用 addthis 共享按钮 查看任何网站 一旦您浮动在 addthis 按钮上 并且加载了所有必需的资源 请使用 firebug 或 chrome 检查器查看文档的正文 不是源代码 而是屏幕上的实际文档 对象检查器 你会
  • 使用PHP获取http url参数而不自动解码

    我有一个像这样的网址 test php x hello world y 00h 00e 00l 00l 00o 当我将它写入文件时 file put contents x txt GET x gt hello world file put
  • Http Auth 不适用于 PHP

    我使用 Laravel Lumen Shield 扩展进行 Http 身份验证 但是在我的本地计算机上一切都很完美 我只在我们的服务器上遇到了问题 问题是在我提交正确的登录数据后 登录屏幕再次出现 我尝试了不同的登录数据 不同的浏览器 登录

随机推荐

  • 使用Qt designer 向菜单栏和工具栏添加action

    在使用Qt创建桌面程序的时候 经常会使用Qt designer来设计程序界面 而Qt窗口类中 QMenuBar和QToolBar中并没有按钮或选项类的控件 取而代之的是要向这些控件中添加QAction 这一个个Action构成了类似按钮似的
  • 分享几个开源且跨平台的视频编辑软件的网站

    视频后期制作和剪辑 可以说Adobe家的PR AE等软件就是王者 功能全面又强大 但是 这些软件都收费不菲 一年都要缴费上千元 用盗版也不是长久之际 这里分享几个剪辑 特效 字幕相关的视频编辑软件 而是是永久免费的开源软件 像爱剪辑之类的软
  • java连接mysql数据库代码_Java连接mysql数据库经典代码

    连其他数据库方式与以下方式类似 package dao impl import java sql Connection import java sql DriverManager import java sql PreparedStatem
  • c语言中断程序运行,C语言实现 "软中断" 程序小结

    参考网友帖子改写 呵呵 对于系统级语言设计之一的中断程序设计包括软中断和硬中断 后者设计到硬件端口的读写操作等等 应该用汇编实现比较好 而前者用C实现就要方便得多的了 对于软中断程序应该有3部分组成 中断程序的编写 安装和使用 由于我们可以
  • 文心大模型加持,百度知识中台三大案例入选信通院优秀案例

    近日 中国信息通信研究院依托中国人工智能产业发展联盟 AI工程化委员会知识计算工作组公布了 2023可信AI案例 知识计算应用优秀案例 名单 基于百度知识中台打造的 国能绥中电厂设备知识库应用 银联云闪付APP智能推荐平台应用 以及 南网智
  • 解决 node.js+MySQL 数据库读取Date日期 前端显示时间差8个小时

    问题描述 后端使用 node js Express 框架 连接 mysql 数据库 前端实现数据的编辑修改功能 发现前端发出的更新数据请求正常 数据库中显示的 Date 类型的日期正确 但前端页面上展示的日期少一天 不设定format 直接
  • VTK编译和安装

    准备工作 请先安装好以下工具和下载需要的VTK源码 Virtual Studio CMake Qt 如果需要结合Qt开发 需要安装好Qt VTK源码 以下是本人的环境 VS 2019 CMake 3 20 1 Qt 5 15 2 VTK 8
  • C/C++编程:定时器

    什么是定时器 很多场景都会用到定时器 比如心跳检测 倒计时 技能冷却等 定时器分类 一般定时任务的形式表现为 经过固定时间后触发 按照固定频率周期性触发 在某个时刻触发 定时器的本质 那定时器到底是什么呢 可以理解为这样一个数据结构 存储一
  • ImportError: rocketmq dynamic library not found

    Traceback most recent call last File initialtomq py line 10 in
  • centOS-7静态ip配置

    centOS 7静态ip配置 1 确定网关 vmware虚拟机 gt 编辑菜单 gt 虚拟网络编辑器 gt 打开窗口 gt 选中vmnet8虚拟网卡 gt nat设置 gt 查看网关 具体如下图 2 查看可用的ip网段 vmware虚拟机
  • 06-----the inferior stopped because it triggered an exception

    这个问题总结一下 1 指针非法访问或者数组越界导致的 2 相关的静态库 动态库版本与编译器的位数不一致导致的 而我就是第2个问题导致的 因为我出错的地方是一个int型的变量 并非指针 故将QT的MSCV编译位数改成32位后 程序正常 因为我
  • 快手did did_gt edid的注册过程

    接口 https gdfp ksapisrv com rest infra gdfp report kuaishou android did 是本地生成的16进制 或者 获取的 android id did gt 是did生成时间戳 159
  • wx小程序结构目录介绍及创建和删除

    仔细查看之前创建的项目 可以发现项目里生成很多不同类型的文件 json 后缀 JSON 配置文件 wxml 后缀 WXML 模板文件 wxss 后缀 WXSS 样式文件 js 后缀 JS 脚本逻辑文件 1 sitemap json小程序收录
  • 人机交互的困难之一常常在于没有形成有效的你、我、他之间的互换。

    人机交互的困难之一常常在于没有形成有效的你 我 他之间的互换 而要形成交互过程中有效的你 我 他角色的互换 可以考虑以下几个方面 清晰定义角色 在交互开始之前 明确定义每个参与者的角色和身份 机器可以被定义为 你 而用户则为 我 这样可以建
  • 《Cesium 进阶知识点》 - 加载天地图三维地名服务(无Cesium 版本依赖)

    一 解决依赖 天地图官网说只支持 1 52 1 58 1 63 1 这 3个版本 其它版本报错 但我只使用三维地名服务 所以做了如下修改 我在 1 80 版 和 1 84 版中测试有效 操作部署是 1 根据官网安装 cesium tdt 插
  • Python------- if-else语句介绍

    Python的if else语句是一个判断性语句 要判断就需要有条件以及满足条件和不满足条件的情况 以下就此进行说明 1 if else的使用格式 if 条件 满足条件所要做的事情 else 不满足条件所要做的事情 这里需要注意的是 if和
  • 数据库SQL性能优化之详解

    一 问题的提出 在应用系统开发初期 由于开发数据库数据比较少 对于查询SQL语句 复杂视图的的编写等体会不出SQL语句各种写法的性能优劣 但是如果将应用系统提交实际应用后 随着数据库中数据的增加 系统的响应速度就成为目前系统需要解决的最主要
  • c语言 (3×3)矩阵转置

    题目描述 写一个函数 使给定的一个二维数组 转置 即行列互换 输入 一个3x3的矩阵 输出 转置后的矩阵 样例输入 1 2 3 4 5 6 7 8 9 样例输出 1 4 7 2 5 8 3 6 9 废话不说还是直接上代码 include
  • 使用STM32CUBEIDE创建工程,点亮LED

    1 创建LED驱动文件 先在工程下新建一个文件夹命名为icode存放驱动程序 然后对每一个外设新建新的驱动文件夹 如驱动LED就新建文件夹led 然后在led文件夹下创建对应的头文件和源文件 即led h和led c 然后编写对应外设的驱动
  • X.509证书的使用

    总结一下如何使用X 509证书来保护我们的设备的数据传输 证书的签发 以下是证书签发的流程 为了更好的演示 我们需要分别创建两个根证书 并且用每个根证书来颁发一个客户端证书 这两个根证书分别为root 1 crt以及root 2 crt 对