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…...
FPGA实战:手把手教你用Verilog给NAND Flash数据上把“安全锁”(附完整ECC代码)
FPGA实战:用Verilog为NAND Flash打造硬件级ECC防护系统 1. 为什么你的NAND Flash需要硬件ECC? NAND Flash存储芯片在工业控制、物联网终端和边缘计算设备中扮演着关键角色,但它的物理特性导致数据可靠性存在先天缺陷。想象一下,当…...
激发创意:利用快马平台ai模型辅助设计与优化cmhhc算法
激发创意:利用快马平台AI模型辅助设计与优化CMHHC算法 最近在做一个字符串压缩相关的项目,需要实现一个自定义的压缩算法CMHHC。这个算法的核心思想其实很简单:对于连续出现的相同字符,用该字符加上出现次数来表示。比如"aa…...
Starry Night Art Gallery效果展示:黄金渐变按钮交互+实时生成反馈
Starry Night Art Gallery效果展示:黄金渐变按钮交互实时生成反馈 1. 沉浸式艺术体验:当AI遇见文艺复兴 想象一下,你走进的不是一个冰冷的AI工具界面,而是一座数字艺术殿堂。四周是深邃的墨蓝色背景,如同梵高笔下的夜…...
Halcon清晰度检测实战:5种算法全解析,手把手教你选出最清晰的PCB图像
Halcon清晰度检测实战:5种算法全解析,手把手教你选出最清晰的PCB图像 在工业视觉检测领域,PCB板的图像清晰度直接影响缺陷检测的准确率。当相机对焦不准确或存在景深限制时,如何从多张候选图像中自动选择最清晰的一张,…...
安规设计规范-3(如何计算电气间隙和爬电距离)
详尽的计算方式建议参考各个标准的要求,本文只指出常规的基础计算流程。以下示例严格遵循 GB/T 16935.1-2023/IEC 60664-1:2020《低压系统内设备的绝缘配合》,选用储能 PCS(储能变流器)最常见的230V AC 电网侧对低压控制侧场景&am…...
WAN2.2文生视频开源镜像快速上手:ComfyUI界面操作+SDXL Prompt Styler详解
WAN2.2文生视频开源镜像快速上手:ComfyUI界面操作SDXL Prompt Styler详解 想试试用几句话就让AI帮你生成一段视频吗?WAN2.2文生视频开源镜像,结合了强大的ComfyUI界面和SDXL Prompt Styler风格化工具,让这个过程变得直观又简单。…...
华为交换机等保2.0实战:手把手配置身份鉴别,从密码策略到登录超时
华为交换机等保2.0身份鉴别全流程配置指南 当企业网络面临等保2.0合规检查时,身份鉴别环节往往是整改重点。作为网络安全工程师,我曾协助多家企业通过等保测评,发现华为交换机的身份鉴别配置存在不少易忽略的细节。本文将分享一套经过实战验证…...
影刀+即刻:碎片化信息自动归类的联动玩法
影刀与即刻联动实现信息自动归类影刀RPA作为自动化工具,与即刻APP的推送功能结合,可高效管理碎片化信息。以下为具体实现方法:创建即刻机器人 在即刻APP中创建自定义机器人,设置关键词触发规则。例如设置"#工作""#…...
特朗普政府发布《国家人工智能立法框架》,多维度布局AI领域
【《国家人工智能立法框架》六大核心目标锚定AI发展方向】特朗普政府发布的《国家人工智能立法框架》,意在通过统一国家政策确保美国在AI领域的全球领先地位。该框架包含六大核心目标,分别是保护儿童与赋能家长、维护与强化美国社区、尊重知识产权与支持…...
Spring Boot 实现网络限速:让流量“收放自如”
Spring Boot 实现网络限速:让流量“收放自如” 一、为啥要网络限速? 在当今这个数字化时代,网络服务就像我们生活中的水电一样不可或缺,而网络限速则是保障这些服务稳定、高效运行的关键一环。它能确保在各种复杂的网络环境下&…...
