openssl3.2 - 检查rsa证书和私钥是否匹配(快速手搓一个工具)
文章目录
- openssl3.2 - 检查rsa证书和私钥是否匹配(快速手搓一个工具)
- 概述
- 效果
- 笔记
- 编程环境
- 界面控件的设置
- 增加文件拖拽的类
- RSA证书和key是否匹配的实现
- 在程序中加入环境变量
- 备注
- 备注
- END
openssl3.2 - 检查rsa证书和私钥是否匹配(快速手搓一个工具)
概述
在学习openssl官方的/test/certs的脚本实现, 做到第30个脚本实验时, 发现根CA证书和key不匹配.
估计做实验时, 遇到脚本需要的文件, 就随便拷贝一个同名的文件过来, 导致证书和key不是一个脚本产生的, 所以不匹配
就想从前面的实验中, 找出匹配的证书和key来做实验, 肯定有啊.
这事应该openssl编程就能做到. 不过时间紧, 先不用openssl编程来做.
看有没有简单暴力的方法.
在网上找到如下2个openssl命令, 可以输出证书和key的模块信息.
// 打印X509证书的模块信息
openssl x509 -inform PEM -modulus -in ca-cert.pem -noout// 打印rsa私钥的模块信息
openssl rsa -inform PEM -modulus -in ca-key.pem -noout
这2个命令输出的都是文本信息, 如果这2个文本信息相同, 则说明这2个证书和私钥是匹配的
按照这个原理, 手工输入命令, 然后人肉比对. 原始操作就是这样的, 就可以知道一对证书和key是否匹配.
可以重定向为文件(e.g. openssl x509 -inform PEM -modulus -in ca-cert.pem -noout > cert_info.txt)
然后用win10自带的FC.exe 就可以比较2个文件是否相同(e.g. fc file_a file_b), 如果fc返回0, 这2个文件就是相同的.
但是作为研发, 能用程序做的, 绝对不可能用人工操作来折磨自己, 那肯定不能够啊.
用了一个小时, 手搓了一个原始工具来干活.
效果

笔记
编程环境
vs2019 vc++ MFC + Dialog模板
界面控件的设置
对话框设置为可以接收文件.
2个编辑框(证书和key), 也设置为可以接收文件.
增加文件拖拽的类
从CEdit继承一个类CDropEdit(用类向导很方便), 加入拖拽消息处理(用类向导加入消息处理), 框架代码不用自己写.
#pragma once
#include <afxwin.h>
class CDropEdit :public CEdit
{
public:DECLARE_MESSAGE_MAP()afx_msg void OnDropFiles(HDROP hDropInfo);
};
#include "pch.h"
#include "CDropEdit.h"
BEGIN_MESSAGE_MAP(CDropEdit, CEdit)ON_WM_DROPFILES()
END_MESSAGE_MAP()void CDropEdit::OnDropFiles(HDROP hDropInfo)
{// TODO: 在此添加消息处理程序代码和/或调用默认值// 拖拽实现很多, 可以参考msdn, 我就直接用下面这位同学分享的片段// https://blog.csdn.net/wrl112/article/details/120335725TCHAR szTmp[MAX_PATH * 2];CString strVal;unsigned int nRet = 0, nInx = 0;do {nRet = ::DragQueryFile(hDropInfo, nInx++, szTmp, sizeof(szTmp));if (nRet > 0) {strVal += szTmp;}else {}break;} while (1);::DragFinish(hDropInfo);SetWindowText(strVal);CEdit::OnDropFiles(hDropInfo);
}
RSA证书和key是否匹配的实现
#include <string>std::string my_W2A(std::wstring str)
{USES_CONVERSION;std::string str_rc = W2A(str.c_str());return str_rc;
}void CCertKeyMatchDlg::OnBnClickedButtonMatch()
{// TODO: 在此添加控件通知处理程序代码CString csFileA;CString csFileB;CString csTmp;std::string strFileA;std::string strFileB;char szBuf[10 * 1024];int i_rc = 0;do {this->SetWindowTextW(_T(""));m_EditFileA.GetWindowText(csFileA);m_EditFileB.GetWindowText(csFileB);if ((csFileA.GetLength() <= 0) || (csFileB.GetLength() <= 0)){TRACE(_T("文件名必须都不为空"));break;}strFileA = my_W2A((LPCWSTR)csFileA);strFileB = my_W2A((LPCWSTR)csFileB);/*// 打印X509证书的模块信息openssl x509 -inform PEM -modulus -in ca-cert.pem -noout// 打印rsa私钥的模块信息openssl rsa -inform PEM -modulus -in ca-key.pem -noout*/sprintf(szBuf, "openssl x509 -inform PEM -modulus -in %s -noout > cert_info.txt", strFileA.c_str());i_rc = system(szBuf);_ASSERT(0 == i_rc);sprintf(szBuf, "openssl rsa -inform PEM -modulus -in %s -noout > key_info.txt", strFileB.c_str());i_rc = system(szBuf);_ASSERT(0 == i_rc);i_rc = system("fc cert_info.txt key_info.txt");csTmp.Format(_T("证书和私钥%s"), (0 == i_rc) ? _T("匹配") : _T("不匹配"));this->SetWindowTextW(csTmp);} while (false);}void CCertKeyMatchDlg::OnDropFiles(HDROP hDropInfo)
{// TODO: 在此添加消息处理程序代码和/或调用默认值CDialogEx::OnDropFiles(hDropInfo);
}
在程序中加入环境变量
在对话框初始化时, 加入了openssl的path, 除非必要, 不污染环境变量.
BOOL CCertKeyMatchDlg::OnInitDialog()
{
// ...// TODO: 在此添加额外的初始化代码char* psz_env_buf = new char[1024 * 1024];if (NULL != psz_env_buf){char* psz_env = getenv("path");// ::SetEnvironmentStrings()sprintf(psz_env_buf, "path=%s;%s", "C:\\openssl_3d2\\bin", psz_env);int i_rc = _putenv(psz_env_buf);_ASSERT(0 == i_rc);delete[]psz_env_buf;}return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
加入环境变量后, 调用程序时, 就不用写全路径, 就可以调用openssl.exe了.
备注
感觉自己还挺机智的:P
备注
因为cert和key的pem是成对的, 用everything看一下, 将cert.pem列出来, 然后进入对应目录找一下是否有对应的key.pem, 最好从生成时间早的目录找, 然后用这个工具比对.
很快就找出来了.

END
相关文章:
openssl3.2 - 检查rsa证书和私钥是否匹配(快速手搓一个工具)
文章目录 openssl3.2 - 检查rsa证书和私钥是否匹配(快速手搓一个工具)概述效果笔记编程环境界面控件的设置增加文件拖拽的类RSA证书和key是否匹配的实现在程序中加入环境变量备注备注END openssl3.2 - 检查rsa证书和私钥是否匹配(快速手搓一个工具) 概述 在学习openssl官方的…...
关于网络协议的笔记
简介: 协议, 网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连 接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。它的 三要素是:语 法、语义、时序。 为了使数…...
【江科大】STM32:USART串口(理论部分)上
串口 全双工:可以进行同步通信 单端信号:信号线传输的就是单端信号。(也就是与地线(GND)的电势差) 缺点:防干扰能力差 原因:当信号从A点传输到B点,理想条件是A࿰…...
深入了解Linux中常见的五种文件类型
了解文件类型对于正确理解和管理文件系统非常重要。希望本文能够帮助您更好地了解Linux中常见的文件类型及其在ls -l命令输出中的表示方式。 在Linux操作系统中,文件是操作系统中最基本的概念之一。在Linux中,每个文件都有一个特定的类型,这…...
SSM项目集成Spring Security 4.X版本(使用spring-security.xml 配置文件方式)
目录 前言 实战开发: 一、Spring Security整合到SSM项目 1. pom文件引入包 2. web.xml 配置 3. 添加 spring-security.xml 文件 二、Spring Security实战应用 1. 项目结构 2. pom文件引入 3. web.xml 配置 4. Spring 配置 applicationContext.xml 5. sp…...
如何生成开发语言的排名图表
1、解释说明 生成开发语言排名图表,通常需要以下几个步骤: - 首先,我们需要收集一些关于不同编程语言的统计数据,例如使用人数、市场份额等。这些数据可以从各种来源获取,例如网站、报告、数据库等。 - 然后&#x…...
有哪些简单好用、适合中小型企业的CRM系统?
阅读本文,你将了解:一、中小型企业对CRM系统的主要需求;二、盘点四款好用的CRM系统;三、CRM系统实施策略和优秀实践。 在快速变化的商业环境中,中小型企业面临着独特的挑战:如何在有限的资源下高效地管理客…...
Unity 适配器模式(实例详解)
文章目录 简介1. **Input Adapter 示例**2. **Component Adapter 示例**3. **网络数据解析适配器**4. **物理引擎适配**5. **跨平台服务适配** 简介 Unity中的适配器模式(Adapter Pattern)主要用于将一个类的接口转换为另一个接口,以便于原本…...
Spring boot项目java bean和xml互转
Spring boot项目实现java bean和xml互转 项目场景:互转方法使用jackson进行互转使用jaxws进行xml与bean的互转 搞定收工! 项目场景: 工作中需要给下游第三方收费系统做数据挡板,由于下游系统使用的是soap webservice,里面涉及各种…...
数字证书和数字证书认证机构和数字根证书,CA,RCA
文章目录 一、 数字证书1、什么是数字证书2、数字证书干什么的3、风险 二、数字证书认证机构(Certificate Authority,缩写为CA)参考文章 一、 数字证书 维基百科 公开密钥认证(英语:Public key certificateÿ…...
java web mvc-08-Grails 入门介绍
拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails 开源 The jdbc pool for java.(java …...
深度学习技术栈 —— Pytorch之TensorDataset、DataLoader
深度学习技术栈 —— Pytorch之TensorDataset、DataLoader 前言一、TensorDataset、DataLoader的用法?二、从.csv文件-->tensor张量总结 前言 简单来说,TensorDataset与DataLoader这两个类的作用, 就是将数据读入并做整合,以便…...
远程git开发
两种本地与远程仓库同步 """ 1)你作为项目仓库初始化人员:线上要创建空仓库 > 本地初始化好仓库 > 建立remote链接(remote add) > 提交本地仓库到远程(push)2)你作为项目后期开发人员:远程项目仓库已经创…...
Codeforces Round 812 (Div. 2) ---- C. Build Permutation --- 题解
目录 C. Build Permutation 题目描述: 编辑 思路解析: 代码实现: C. Build Permutation 题目描述: 思路解析: 先证明在任何情况下答案均存在。 假设我们所求的为 m m1 m2.....n 的排列,我们称不小于n…...
Matlab 将工作区变量保存到文件中(save)
语法 1、save(filename) 2、save(filename,variables) 3、save(filename,variables,fmt) 4、save(filename,variables,version) 5、save(filename,variables,version,-nocompression) 6、save(filename,variables,-append) 7、save(filename,variables,-append,-nocompression…...
源码实现简介
本系列所有代码在文章底部,每一章节代码可独立编译运行 随着科技的飞速发展,自动驾驶技术正逐渐成为现实。而在自动驾驶技术中,感知是至关重要的一个环节。通过感知,自动驾驶车辆能够识别和理解周围环境,进而做出相应…...
我每天如何使用 ChatGPT
我们都清楚互联网的运作方式——充斥着各种“爆款观点”,极端分裂的意见,恶搞和无知现象屡见不鲜。 最近,大家对于人工智能(AI)特别是大语言模型(LLMs)和生成式 AI(GenAI࿰…...
MySQL修炼手册14:用户权限管理:安全保障与数据隔离
目录 写在开头1 用户与权限的关系1.1 用户的创建与删除1.1.1 创建新用户1.1.2 批量创建用户1.1.3 安全删除用户 1.2 授予与撤销权限1.2.1 授予权限1.2.2 批量授予权限1.2.3 撤销权限 2 角色的应用2.1 创建与管理角色2.1.1 创建角色2.1.2 管理角色 2.2 将权限赋予角色2.2.1 将权…...
动态规划解决马尔可夫决策过程
马尔可夫决策过程是强化学习中的基本问题模型之一,而解决马尔可夫决策过程的方法我们统称为强化学习算法。 动态规划( dynamic programming, DP )具体指的是在某些复杂问题中,将问题转化为若干个子问题,并在求解每个子…...
ubuntu1604安装及问题解决
虚拟机安装vmbox7 虚拟机操作: 安装增强功能 sudo mkdir /mnt/share sudo mount -t vboxsf sharefolder /mnt/share第一次使用sudo提示is not in the sudoers file. This incident will be reported 你的root需要设置好密码 sudo passwd root 输入如下指令&#x…...
OpenClaw-Subcortex:轻量级自动化任务编排与执行框架详解
1. 项目概述与核心价值最近在折腾一些自动化工具,发现一个挺有意思的项目叫openclaw-subcortex。乍一看这个名字,可能有点摸不着头脑,又是“爪子”又是“皮层下”的,感觉像是什么生物或者神经科学的东西。但实际上,这是…...
Docker里CentOS镜像yum报错?别慌,教你两步搞定‘appstream’仓库元数据下载失败
Docker中CentOS镜像yum报错?三步根治‘appstream’仓库元数据下载失败 当你兴致勃勃地在Docker中启动一个CentOS容器准备大展拳脚时,突然遭遇Failed to download metadata for repo appstream的红色报错,这种挫败感我深有体会。不同于物理机或…...
Noto Emoji字体架构深度解析:现代表情符号渲染的技术实现与性能优化
Noto Emoji字体架构深度解析:现代表情符号渲染的技术实现与性能优化 【免费下载链接】noto-emoji Noto Emoji fonts 项目地址: https://gitcode.com/gh_mirrors/no/noto-emoji Noto Emoji作为Google开源的表情符号字体库,提供了跨平台的Unicode表…...
如何加入GEO从入门到精通知识星球?
很多人学了GEO理论,却不知道怎么落地——因为GEO不是靠手动摸索能高效完成的,它需要工具支撑每一个环节。GEO优化分三个核心环节,每个环节都有对应的工具。第一环节:问题挖掘用什么工具:GEO之家问题大师传统SEO靠关键词…...
别再手动折腾了!用Docker Compose 5分钟搞定ChirpStack LoRaWAN服务器部署(附配置文件详解)
5分钟极速部署ChirpStack LoRaWAN服务器的Docker Compose实战指南 1. 为什么选择Docker Compose部署ChirpStack? 对于物联网开发者而言,时间就是最宝贵的资源。传统的手动部署方式需要逐个安装和配置PostgreSQL、Redis、MQTT broker以及ChirpStack各个组…...
英文专业论文,可以用维普AIGC检测查AI率吗?
维普查重系统目前是国内比较权威的查重系统,目前国内很多高校是和维普系统合作的。 维普系统也是很多大学生都知晓的查重系统,并且上线了维普AIGC检测功能,可以查论文的AI率。 但是英文专业的毕业论文又和其他专业的不一样,那么…...
基于节点电价的电网对电动汽车接纳能力评估模型研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
HSTracker:macOS平台炉石传说智能数据分析与决策辅助系统
HSTracker:macOS平台炉石传说智能数据分析与决策辅助系统 【免费下载链接】HSTracker A deck tracker and deck manager for Hearthstone on macOS 项目地址: https://gitcode.com/gh_mirrors/hs/HSTracker HSTracker是一款专为macOS平台设计的炉石传说智能套…...
彻底解决GeoServer跨域:手把手教你配置web.xml与添加Jetty依赖包
彻底解决GeoServer跨域问题:原理剖析与实战配置指南 当你在OpenLayers或Cesium中调用GeoServer的WMS/WFS服务时,是否遇到过令人头疼的跨域错误?这个问题看似简单,却隐藏着Web安全策略与地理信息服务集成的深层逻辑。本文将带你从H…...
从CuteCom到代码:手把手教你用I.MX6ULL实现串口双向通信(附完整工程)
从CuteCom到代码:手把手教你用I.MX6ULL实现串口双向通信 在嵌入式开发中,串口通信是最基础也最关键的调试手段之一。无论是简单的日志输出,还是复杂的数据交互,串口都扮演着不可或缺的角色。本文将带你从零开始,在I.MX…...
