1、环境

QT 5.15.2 MinGW8.1.0 64Bit

OpenSSL 1.1.1f  31 Mar 2020
built on: Wed Nov 24 13:20:48 2021 UTC
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(int) blowfish(ptr)

本机的OpenSSL是随QT安装的。

2、QT使用openSSL

2.1 项目文件添加以下依赖

LIBS += $$quote(D:\SoftWareTools\Qt5.15.2_64\Tools\OpenSSL\Win_x64\lib\libcrypto.lib)
LIBS += $$quote(D:\SoftWareTools\Qt5.15.2_64\Tools\OpenSSL\Win_x64\lib\libssl.lib)
INCLUDEPATH += $$quote(D:\SoftWareTools\Qt5.15.2_64\Tools\OpenSSL\Win_x64\include)

2.2 项目工程中需要添加applink.c,文件位于openssl的include下:

2.3 生成的exe文件夹下添加dll,在openssl的bin目录:

3、实现

添加相关头文件:

UI设计:

关键代码:

void MainWindow::on_pushButton_create_clicked()
{/*! check valid */if (ui->lineEdit_country->text().isEmpty()) {QMessageBox::about(NULL, "notice", "country is empty, error!");return;}if (ui->lineEdit_city->text().isEmpty()) {QMessageBox::about(NULL, "notice", "city is empty, error!");return;}if (ui->lineEdit_province->text().isEmpty()) {QMessageBox::about(NULL, "notice", "province is empty, error!");return;}if (ui->lineEdit_organization->text().isEmpty()) {QMessageBox::about(NULL, "notice", "organization is empty, error!");return;}if (ui->lineEdit_unit->text().isEmpty()) {QMessageBox::about(NULL, "notice", "unit is empty, error!");return;}if (ui->lineEdit_name->text().isEmpty()) {QMessageBox::about(NULL, "notice", "name is empty, error!");return;}/*! create pri and pub key */FILE* private_key_file;FILE* public_key_file;private_key_file = fopen("./prikey.pem", "w+");public_key_file  = fopen("./pubkey.pem", "w+");int bits              = 1024;unsigned long e_value = RSA_3;BIGNUM* bne = BN_new();if (1 != BN_set_word(bne, e_value)) {QMessageBox::about(NULL, "notice", "openssl set bne word error!");BN_free(bne);return;}RSA* rsa = RSA_new();if (1 != RSA_generate_key_ex(rsa, bits, bne, NULL)) {QMessageBox::about(NULL, "notice", "openssl rsa gen error!");RSA_free(rsa);rsa = NULL;return;}PEM_write_RSAPrivateKey(private_key_file, rsa, NULL, NULL, 0, NULL, NULL);PEM_write_RSA_PUBKEY(public_key_file, rsa);RSA_free(rsa);rsa = NULL;BN_free(bne);bne = NULL;fclose(private_key_file);fclose(public_key_file);/*! create csr */// 1. set version of x509 reqX509_REQ* x509_req = X509_REQ_new();int nVersion       = 1;if (1 != X509_REQ_set_version(x509_req, nVersion)) {QMessageBox::about(NULL, "notice", "X509 req set version error!");X509_REQ_free(x509_req);return;}// 2. set subject of x509 reqX509_NAME* x509_name = X509_REQ_get_subject_name(x509_req);const char* pbCN     = NULL; const char* pbOU     = NULL; const char* pbO      = NULL; const char* pbL      = NULL; const char* pbST     = NULL;const char* pbC      = NULL; QByteArray ba;ba.clear();ba.append(ui->lineEdit_name->text().toUtf8());pbCN = ba.data();ba.clear();ba.append(ui->lineEdit_unit->text().toUtf8());pbOU = ba.data();ba.clear();ba.append(ui->lineEdit_organization->text().toUtf8());pbO = ba.data();ba.clear();ba.append(ui->lineEdit_city->text().toUtf8());pbL = ba.data();ba.clear();ba.append(ui->lineEdit_province->text().toUtf8());pbST = ba.data();ba.clear();ba.append(ui->lineEdit_country->text().toUtf8());pbC = ba.data();X509_NAME_add_entry_by_txt(x509_name, "CN", V_ASN1_UTF8STRING, (const unsigned char*)pbCN, -1, -1, 0);X509_NAME_add_entry_by_txt(x509_name, "OU", V_ASN1_UTF8STRING, (const unsigned char*)pbOU, -1, -1, 0);X509_NAME_add_entry_by_txt(x509_name, "O", V_ASN1_UTF8STRING, (const unsigned char*)pbO, -1, -1, 0);X509_NAME_add_entry_by_txt(x509_name, "L", V_ASN1_UTF8STRING, (const unsigned char*)pbL, -1, -1, 0);X509_NAME_add_entry_by_txt(x509_name, "ST", V_ASN1_UTF8STRING, (const unsigned char*)pbST, -1, -1, 0);X509_NAME_add_entry_by_txt(x509_name, "C", V_ASN1_UTF8STRING, (const unsigned char*)pbC, -1, -1, 0);// 3. set public key of x509 reqconst char* key_file_path = "./prikey.pem";BIO* key_file_BIO         = BIO_new_file(key_file_path, "r");if (key_file_BIO == NULL) {QMessageBox::about(NULL, "notice", "BIO new file error!");BIO_free_all(key_file_BIO);X509_REQ_free(x509_req);return;}rsa = PEM_read_bio_RSAPrivateKey(key_file_BIO, NULL, NULL, NULL);if (rsa == NULL) {QMessageBox::about(NULL, "notice", "PEM read bio RSAPrivateKey error!");BIO_free_all(key_file_BIO);X509_REQ_free(x509_req);RSA_free(rsa);return;}EVP_PKEY* pKey = EVP_PKEY_new();EVP_PKEY_assign_RSA(pKey, rsa);rsa = NULL; // will be free rsa when EVP_PKEY_free(pKey)if (1 != X509_REQ_set_pubkey(x509_req, pKey)) {QMessageBox::about(NULL, "notice", "X509 REQ set pubkey error!");BIO_free_all(key_file_BIO);X509_REQ_free(x509_req);EVP_PKEY_free(pKey);RSA_free(rsa);return;}// 4. set sign key of x509 reqint ret = X509_REQ_sign(x509_req, pKey, EVP_sha1()); // return x509_req->signature->lengthif (ret <= 0) {QMessageBox::about(NULL, "notice", "X509 REQ sign error!");BIO_free_all(key_file_BIO);X509_REQ_free(x509_req);EVP_PKEY_free(pKey);RSA_free(rsa);return;}m_file_name = ui->lineEdit_name->text();ba.clear();QString csr_file = m_file_name + ".csr";ba.append(csr_file.toLatin1());BIO* out = BIO_new_file(ba.data(), "w");if (1 == PEM_write_bio_X509_REQ(out, x509_req)) {QMessageBox::about(NULL, "notice", QString("create %1 success!").arg(ui->lineEdit_name->text() + ".csr"));ui->textEdit_csr_msg->append(ui->lineEdit_name->text() + ".csr create success");} else {QMessageBox::about(NULL, "notice", "creat csr error!");}BIO_free_all(key_file_BIO);X509_REQ_free(x509_req);EVP_PKEY_free(pKey);BIO_free_all(out);RSA_free(rsa);
}

最终实现效果

QT 开发openSSL CSR证书请求工具相关推荐

  1. 怎样生成CSR证书请求文件

    在安装数字证书时,需要准备CSR证书请求文件,使用SSL工具CSR生成器:https://csr.wiki 即可在线自助生成 CSR和密钥文件,另外一种方法使用openSSL/Keytools在服务器 ...

  2. 基于QT开发PC端文件加密工具

    基于QT开发PC端文件加密工具 1.客户需求 某案子.该方案,通过外挂TF卡实现,本地教育资源的调取使用.按客户需求,把TF卡内的内容进行加密,并在软件中写好解密,确保资源文件只能在教育机中才能正常播 ...

  3. QT开发一款MD5校验工具

    这是一款基于QT开发的MD5校验工具,在这你可以学习到界面UI的设计方法,以及QT应对字符串的处理方法.以及如何去使用QT进行多线程的开发. 实现后的程序运行截图: MD5.pro工程文件 #---- ...

  4. 制作多域名(SAN/UCC)CSR(证书请求文件)

    http://blog.csdn.net/poniu_2008/article/details/7583867 多域名证书,有2种叫法,一种:SAN certificater(SubjectAltNa ...

  5. java 产生p10证书_【国密SM2算法】JAVA创建pkcs10格式的csr证书请求文件

    代码: public static void main(String[] args) throws Exception { Security.addProvider(new org.bouncycas ...

  6. java csr 证书_使用JAVA自带security,创建测试用的CSR证书请求文件

    项目中要用到安全证书,生成CSR测试. 不多说,直接上干货. 1.什么是数字证书,这篇文章讲的不错,通俗易懂,简单明了. http://www.ruanyifeng.com/blog/2011/08/ ...

  7. iOS开发——openssl生成CSR (pkcs10) 请求证书

    由于涉及在线开户相关,所以整理一下~ 本文在前人的基础上更加完善:通过openssl 生成证书请求CSR  符合pkcs10的语法规范 为客户端生成,代码为C语言,可以直接在xcode的中于objec ...

  8. Elasticsearch基础3——密钥库工具、证书生成工具及四种生成模式、https请求步骤流程

    文章目录 一.密钥库工具(elasticsearch-keystore) 1.1 列出密钥库里的设置 1.2 查看密钥库密码 1.3 设置/改变秘钥库密码 1.4 添加字符串设置 1.5 添加文件设置 ...

  9. VS+QT开发环境搭建

    VS+QT开发环境搭建 1.工具准备 VisualStudio最新版直接官网下载,根据需要进行下载,我下载的免费社区版本.日常开发完全够用. QT建议不要下最新版本,同样,为了减少病毒的风险,直接官网 ...

最新文章

  1. iframe怎么用_怎么样减少无效URL的爬行和索引
  2. 求和(dfs序+线段树)
  3. php 错误传递,php-调用时通过引用传递错误,无法修复代码
  4. java常量信用_JAVA常量
  5. 优秀大数据GitHub项目一览
  6. spring执行定时任务
  7. 【Pygame小游戏】别找了,休闲游戏专题来了丨泡泡龙小程序——休闲游戏研发推荐
  8. [转]docker入门(利用docker部署web应用)
  9. 随机JCache内容:多个提供程序和JMX Bean
  10. matlab仿真模拟随机过程,基于MATLAB的随机过程仿真.pdf
  11. 浏览器了解(四)javascript解析
  12. 精通Hyperledger之Hyperledger composer建模语言(15)
  13. Insyde uefi 隐藏设置_联想台式机10代cpu装win10及bios设置教程(新bios设置)
  14. JVM运行原理及优化
  15. 安尼泰科T1行车记录仪说明书
  16. linux连接交换机命令,Linux连接路由器交换机防火墙Console接口的5个实用命令
  17. Tiled结合Unity实现瓦片地图
  18. 用vue写一个天气webAPP
  19. 做H5页面需要学什么
  20. 计算机识别技术检测交通标志,基于计算机视觉的交通标志检测与识别算法研究...

热门文章

  1. 【翻译】eXpressAppFramework QuickStart 业务模型设计(十)——在代码中实现数据验证...
  2. mysql innodb_sort_buffer_size_mysql优化---第7篇:参数 innodb_buffer_pool_instances设置
  3. Linux C 数据结构---单向链表
  4. 一个能自动搜索源文件并自动推导的Makefile
  5. 系统没有远程桌面,如何安装远程桌面
  6. Oracle中Number(p,s)的意义
  7. [react] 说说react diff的原理是什么
  8. [react] React组件的构造函数是必须的吗?
  9. [react] 说说你对React的渲染原理的理解
  10. 深入react技术栈(5):React生命周期