当前位置: 首页 > news >正文

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官方的…...

关于网络协议的笔记

简介&#xff1a; 协议&#xff0c; 网络协议的简称&#xff0c;网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连 接、怎么样互相识别等。只有遵守这个约定&#xff0c;计算机之间才能相互通信交流。它的 三要素是&#xff1a;语 法、语义、时序。 为了使数…...

【江科大】STM32:USART串口(理论部分)上

串口 全双工&#xff1a;可以进行同步通信 单端信号&#xff1a;信号线传输的就是单端信号。&#xff08;也就是与地线&#xff08;GND&#xff09;的电势差&#xff09; 缺点&#xff1a;防干扰能力差 原因&#xff1a;当信号从A点传输到B点&#xff0c;理想条件是A&#xff0…...

深入了解Linux中常见的五种文件类型

了解文件类型对于正确理解和管理文件系统非常重要。希望本文能够帮助您更好地了解Linux中常见的文件类型及其在ls -l命令输出中的表示方式。​ 在Linux操作系统中&#xff0c;文件是操作系统中最基本的概念之一。在Linux中&#xff0c;每个文件都有一个特定的类型&#xff0c;这…...

SSM项目集成Spring Security 4.X版本(使用spring-security.xml 配置文件方式)

目录 前言 实战开发&#xff1a; 一、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、解释说明 生成开发语言排名图表&#xff0c;通常需要以下几个步骤&#xff1a; - 首先&#xff0c;我们需要收集一些关于不同编程语言的统计数据&#xff0c;例如使用人数、市场份额等。这些数据可以从各种来源获取&#xff0c;例如网站、报告、数据库等。 - 然后&#x…...

有哪些简单好用、适合中小型企业的CRM系统?

阅读本文&#xff0c;你将了解&#xff1a;一、中小型企业对CRM系统的主要需求&#xff1b;二、盘点四款好用的CRM系统&#xff1b;三、CRM系统实施策略和优秀实践。 在快速变化的商业环境中&#xff0c;中小型企业面临着独特的挑战&#xff1a;如何在有限的资源下高效地管理客…...

Unity 适配器模式(实例详解)

文章目录 简介1. **Input Adapter 示例**2. **Component Adapter 示例**3. **网络数据解析适配器**4. **物理引擎适配**5. **跨平台服务适配** 简介 Unity中的适配器模式&#xff08;Adapter Pattern&#xff09;主要用于将一个类的接口转换为另一个接口&#xff0c;以便于原本…...

Spring boot项目java bean和xml互转

Spring boot项目实现java bean和xml互转 项目场景&#xff1a;互转方法使用jackson进行互转使用jaxws进行xml与bean的互转 搞定收工&#xff01; 项目场景&#xff1a; 工作中需要给下游第三方收费系统做数据挡板&#xff0c;由于下游系统使用的是soap webservice,里面涉及各种…...

数字证书和数字证书认证机构和数字根证书,CA,RCA

文章目录 一、 数字证书1、什么是数字证书2、数字证书干什么的3、风险 二、数字证书认证机构&#xff08;Certificate Authority&#xff0c;缩写为CA&#xff09;参考文章 一、 数字证书 维基百科 公开密钥认证&#xff08;英语&#xff1a;Public key certificate&#xff…...

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的用法&#xff1f;二、从.csv文件-->tensor张量总结 前言 简单来说&#xff0c;TensorDataset与DataLoader这两个类的作用&#xff0c; 就是将数据读入并做整合&#xff0c;以便…...

远程git开发

两种本地与远程仓库同步 """ 1&#xff09;你作为项目仓库初始化人员&#xff1a;线上要创建空仓库 > 本地初始化好仓库 > 建立remote链接(remote add) > 提交本地仓库到远程(push)2&#xff09;你作为项目后期开发人员&#xff1a;远程项目仓库已经创…...

Codeforces Round 812 (Div. 2) ---- C. Build Permutation --- 题解

目录 C. Build Permutation 题目描述&#xff1a; ​编辑 思路解析&#xff1a; 代码实现&#xff1a; C. Build Permutation 题目描述&#xff1a; 思路解析&#xff1a; 先证明在任何情况下答案均存在。 假设我们所求的为 m m1 m2.....n 的排列&#xff0c;我们称不小于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…...

源码实现简介

本系列所有代码在文章底部&#xff0c;每一章节代码可独立编译运行 随着科技的飞速发展&#xff0c;自动驾驶技术正逐渐成为现实。而在自动驾驶技术中&#xff0c;感知是至关重要的一个环节。通过感知&#xff0c;自动驾驶车辆能够识别和理解周围环境&#xff0c;进而做出相应…...

我每天如何使用 ChatGPT

我们都清楚互联网的运作方式——充斥着各种“爆款观点”&#xff0c;极端分裂的意见&#xff0c;恶搞和无知现象屡见不鲜。 最近&#xff0c;大家对于人工智能&#xff08;AI&#xff09;特别是大语言模型&#xff08;LLMs&#xff09;和生成式 AI&#xff08;GenAI&#xff0…...

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 将权…...

动态规划解决马尔可夫决策过程

马尔可夫决策过程是强化学习中的基本问题模型之一&#xff0c;而解决马尔可夫决策过程的方法我们统称为强化学习算法。 动态规划&#xff08; dynamic programming, DP &#xff09;具体指的是在某些复杂问题中&#xff0c;将问题转化为若干个子问题&#xff0c;并在求解每个子…...

ubuntu1604安装及问题解决

虚拟机安装vmbox7 虚拟机操作&#xff1a; 安装增强功能 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…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析

LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...

用js实现常见排序算法

以下是几种常见排序算法的 JS实现&#xff0c;包括选择排序、冒泡排序、插入排序、快速排序和归并排序&#xff0c;以及每种算法的特点和复杂度分析 1. 选择排序&#xff08;Selection Sort&#xff09; 核心思想&#xff1a;每次从未排序部分选择最小元素&#xff0c;与未排…...

C#最佳实践:为何优先使用as或is而非强制转换

C#最佳实践&#xff1a;为何优先使用as或is而非强制转换 在 C# 的编程世界里&#xff0c;类型转换是我们经常会遇到的操作。就像在现实生活中&#xff0c;我们可能需要把不同形状的物品重新整理归类一样&#xff0c;在代码里&#xff0c;我们也常常需要将一个数据类型转换为另…...