openssl3.2 - 檢查rsa證書和私鑰是否匹配(快速手搓一個(gè)工具)
概述
在學(xué)習(xí)openssl官方的/test/certs的腳本實(shí)現(xiàn), 做到第30個(gè)腳本實(shí)驗(yàn)時(shí), 發(fā)現(xiàn)根CA證書和key不匹配.
估計(jì)做實(shí)驗(yàn)時(shí), 遇到腳本需要的文件, 就隨便拷貝一個(gè)同名的文件過(guò)來(lái), 導(dǎo)致證書和key不是一個(gè)腳本產(chǎn)生的, 所以不匹配
就想從前面的實(shí)驗(yàn)中, 找出匹配的證書和key來(lái)做實(shí)驗(yàn), 肯定有啊.
這事應(yīng)該openssl編程就能做到. 不過(guò)時(shí)間緊, 先不用openssl編程來(lái)做.
看有沒(méi)有簡(jiǎn)單暴力的方法.
在網(wǎng)上找到如下2個(gè)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個(gè)命令輸出的都是文本信息, 如果這2個(gè)文本信息相同, 則說(shuō)明這2個(gè)證書和私鑰是匹配的
按照這個(gè)原理, 手工輸入命令, 然后人肉比對(duì). 原始操作就是這樣的, 就可以知道一對(duì)證書和key是否匹配.
可以重定向?yàn)槲募?e.g. openssl x509 -inform PEM -modulus -in ca-cert.pem -noout > cert_info.txt)
然后用win10自帶的FC.exe 就可以比較2個(gè)文件是否相同(e.g. fc file_a file_b), 如果fc返回0, 這2個(gè)文件就是相同的.
但是作為研發(fā), 能用程序做的, 絕對(duì)不可能用人工操作來(lái)折磨自己, 那肯定不能夠啊.
用了一個(gè)小時(shí), 手搓了一個(gè)原始工具來(lái)干活.
效果
筆記
編程環(huán)境
vs2019 vc++ MFC + Dialog模板
界面控件的設(shè)置
對(duì)話框設(shè)置為可以接收文件.
2個(gè)編輯框(證書和key), 也設(shè)置為可以接收文件.
增加文件拖拽的類
從CEdit繼承一個(gè)類CDropEdit(用類向?qū)Ш芊奖?, 加入拖拽消息處理(用類向?qū)Ъ尤胂⑻幚?, 框架代碼不用自己寫.
#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: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值
// 拖拽實(shí)現(xiàn)很多, 可以參考msdn, 我就直接用下面這位同學(xué)分享的片段
// https://blog.csdn.net/wrl112/article/details/120335725
TCHAR 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是否匹配的實(shí)現(xiàn)
#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: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值
CDialogEx::OnDropFiles(hDropInfo);
}
在程序中加入環(huán)境變量
在對(duì)話框初始化時(shí), 加入了openssl的path, 除非必要, 不污染環(huán)境變量.
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; // 除非將焦點(diǎn)設(shè)置到控件,否則返回 TRUE
}
加入環(huán)境變量后, 調(diào)用程序時(shí), 就不用寫全路徑, 就可以調(diào)用openssl.exe了.
備注
感覺(jué)自己還挺機(jī)智的:P文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-821706.html
備注
因?yàn)閏ert和key的pem是成對(duì)的, 用everything看一下, 將cert.pem列出來(lái), 然后進(jìn)入對(duì)應(yīng)目錄找一下是否有對(duì)應(yīng)的key.pem, 最好從生成時(shí)間早的目錄找, 然后用這個(gè)工具比對(duì).
很快就找出來(lái)了.文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-821706.html
END
到了這里,關(guān)于openssl3.2 - 檢查rsa證書和私鑰是否匹配(快速手搓一個(gè)工具)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!