你好2023-使用msys64 openssl 制作QSslSocket实验所需证书

news2024/11/16 22:55:37

2023年开始了,第一篇,记录最近帮朋友制作QSslSocket所需证书的过程。


使用传统的TCP连接依旧是很多工业软件的常见通信方法。但如果恰好不希望别人通过抓包等方法研究上位机和控制器模块之间的协议格式,那使用SSL连接是一种掩耳盗铃的好办法,能够抵御不是很执着的逆向行为。

SSL一般可以通过openssl实现,这样即使是嵌入式设备里也有类似的支持。在建立SSL通道时,最常见的认证方法是客户端认证服务器证书的有效性。此时,服务端需要具备自己的私钥、由根证书签名的公钥,客户端只需要安装根证书,即可验证服务器的签名。当然,你可以通过忽略各种ssl错误,在没有验证签名的情况下依然建立连接,很多嵌入式设备里也是这样干的——只要证书是一个证书,就可以连接。
openssl

正是在下面这种非专业的作坊操作下,一堆貌似可靠的工业控制SSL协议就诞生了。下文仅仅用于SSL编程实验使用,若用于流水线环境,带来的损失和本文无关。

1.使用MSYS64直接获取openssl

在msys64中,可以直接安装openssl,而且版本很新。我们选择mingw64环境,安装64位的openSSL

$ pacman -S mingw64/mingw-w64-x86_64-openssl
resolving dependencies...
looking for conflicting packages...

Packages (1) mingw-w64-x86_64-openssl-1.1.1.s-1

Total Download Size:    4.80 MiB
Total Installed Size:  69.51 MiB
Net Upgrade Size:       0.00 MiB

:: Proceed with installation? [Y/n] y
:: Retrieving packages...
 mingw-w64-x86_64-openssl-1...     4.8 MiB  2.29 MiB/s 00:02 [###############################] 100%
(1/1) checking keys in keyring                               [###############################] 100%
(1/1) checking package integrity                             [###############################] 100%
(1/1) loading package files                                  [###############################] 100%
(1/1) checking for file conflicts                            [###############################] 100%
(1/1) checking available disk space                          [###############################] 100%
:: Processing package changes...
(1/1) installing mingw-w64-x86_64-openssl                                    [###########################################] 100%

2. 制作证书前的准备

openssl的配置默认在C:\msys64\mingw64\ssl\openssl.cnf里查看。如果是默认安装,则例子配置里默认的证书仓库位于当前文件夹相对路径的demoCA里,如下:

####################################################################
[ ca ]
default_ca	= CA_default		# The default ca section

####################################################################
[ CA_default ]

dir		= ./demoCA		# Where everything is kept

因此,我们要在准备制作证书的文件夹下,创建demoCA文件夹,并touch两个文件出来。

mkdir demoCA
touch demoCA/index.txt
echo 0100 > demoCA/serial

上面三个操作,相当于建立了一个demoCA文件夹,并生成了一个0字节的空白txt,以及一个文件serial,里面有四个字符 0100(填什么无所谓,只要是一个数字即可)

3. 生成证书

3.1 生成根证书

(1) 生成私钥

$ openssl genrsa -des3 -out ca_privkey.pem 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
.................................................
e is 65537 (0x010001)
Enter pass phrase for ca_privkey.pem:【敲你的口令】
Verifying - Enter pass phrase for ca_privkey.pem:【敲你的口令】

(2)导出公钥

注意,下面的询问中,Common Name (e.g. server FQDN or YOUR name) []:一般要和url里的域名一样,或者局域网里的服务器地址一样。例子里为了方便,所有的询问都用 192.168.1.100回答了。

$ openssl req -new -x509 -key ca_privkey.pem -out ca_cert.pem -days 16384
Enter pass phrase for ca_privkey.pem:【敲你的口令】
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:192.168.1.100
Locality Name (eg, city) []:192.168.1.100
Organization Name (eg, company) [Internet Widgits Pty Ltd]:192.168.1.100
Organizational Unit Name (eg, section) []:192.168.1.100
Common Name (e.g. server FQDN or YOUR name) []:192.168.1.100
Email Address []:192.168.1.100

3.2 生成服务器证书

(1) 生成私钥

$  openssl genrsa -out svr_privkey.pem 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
...........................................+
e is 65537 (0x010001)

(2)导出签名请求

要导出一个签名请求,以便后续用根证书为服务器公钥签名。注意,下面的询问中,Common Name (e.g. server FQDN or YOUR name) []:一般要和url里的域名一样,或者局域网里的服务器地址一样。例子里为了方便,所有的询问都用 192.168.1.100回答了。

$  openssl req -new -key svr_privkey.pem -out svr_cert.csr
Using configuration from C:/msys64/mingw64/ssl/openssl.cnf
Enter pass phrase for ca_privkey.pem:【敲你的口令】
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:192.168.1.100
Locality Name (eg, city) []:192.168.1.100
Organization Name (eg, company) [Internet Widgits Pty Ltd]:192.168.1.100
Organizational Unit Name (eg, section) []:192.168.1.100
Common Name (e.g. server FQDN or YOUR name) []:192.168.1.100
Email Address []:192.168.1.100

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:192.168.1.100
An optional company name []:192.168.1.100

(3)签名生成服务器公钥

 openssl ca -keyfile ca_privkey.pem -outdir . -in svr_cert.csr -out svr_cert.pem -cert ca_cert.pem -days 7200
Using configuration from C:/msys64/mingw64/ssl/openssl.cnf
Enter pass phrase for ca_privkey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 256 (0x100)
        Validity
            Not Before: Jan  1 01:43:19 2023 GMT
            Not After : Sep 18 01:43:19 2042 GMT
        Subject:
            countryName               = AU
            stateOrProvinceName       = 192.168.1.100
            organizationName          = 192.168.1.100
            organizationalUnitName    = 192.168.1.100
            commonName                = 192.168.1.100
            emailAddress              = 192.168.1.100
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                65:6D:2A:0B:F6:DE:79:2E:07:38:83:F8:4C:09:83:8F:B1:49:AA:C7
            X509v3 Authority Key Identifier:
                keyid:B4:89:B7:A0:02:56:26:9A:A1:9F:1B:9F:F4:A6:31:33:3B:F7:8E:BA

Certificate is to be certified until Sep 18 01:43:19 2042 GMT (7200 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

4. 发布证书

把 ca_cert.pem 拷贝到客户端,并设置客户端连接时加入此根证书。
把 svr_cert.pem,svr_privkey.pem 拷贝到服务器,并设置握手时使用此证书。

具体的使用方法,参考 Qt QSslSocket的例子,或者我下一篇博文。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132343.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pyinstaller - 你的“神”队友

哈哈!今天是我在2023年发布的第一篇文章呀! 这两天,我在做一个爬虫项目。因为我做好后准备给我的朋友看看,但我朋友没有 Python 环境。所以,只好想办法把 .py 打包成 .exe 。 在网上搜了一下,发现目前相对…

设计模式 ——工厂模式

前言 有一些重要的设计原则在开篇和大家分享下,这些原则将贯通全文: 面向接口编程,而不是面向实现。这个很重要,也是优雅的、可扩展的代码的第一步,这就不需要多说了吧。 职责单一原则。每个类都应该只有一个单一的功…

第三十一讲:神州路由器策略路由的配置

从局域网去往广域网的流量有时需要进行分流,即区别了不同用户又进行了负载分担,有时这种目标是通过对不同的源地址进行区别对待完成的,通过策略路由的方法可以解决此问题。 实验拓扑图如下所示 R1 R2 R3 F0/0 1.1.3.1/24 F0/0 1.1.3.2…

【AcWing每日一题】4261. 孤独的照片

Farmer John 最近购入了 N 头新的奶牛,每头奶牛的品种是更赛牛(Guernsey)或荷斯坦牛(Holstein)之一。 奶牛目前排成一排,Farmer John 想要为每个连续不少于三头奶牛的序列拍摄一张照片。 然而&#xff0c…

java多线程(11):线程协作

1 线程通信 应用场景 : 生产者和消费者问题 假设仓库中只能存放一件产品 , 生产者将生产出来的产品放入仓库 , 消费者将仓库中产品取走消费 如果仓库中没有产品 , 则生产者将产品放入仓库 , 否则停止生产并等待 , 直到仓库中的产品被消费者取走为止 如果仓库中放有产品 ,…

Chrome Extension 基础篇

Extensions are software programs, built on web technologies (such as HTML, CSS, and JavaScript) that enable users to customize the Chrome browsing experience. 扩展程序是基于 Web 技术(例如 HTML、CSS 和 JavaScript)构建的软件程序&#xf…

C语言递归

递归指的是在函数的定义中使用函数自身的方法。 举个例子: 从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚…

redis的安装

1.Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖: yum install -y gcc tcl2.上传安装包并解压 tar -xzf redis-6.2.6.tar.gz3.解压后,进入redis目录 cd redis-6.2.64.运行编译命令 make && make install如果没有…

3_运行时数据区概述及线程

前言 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时…

56. 数据增广 / 图像增广

1. CES上的真实故事 2. 数据增强 增加一个已有数据集,使得有更多的多样性 在语言里加入各种不同的背景噪音改变图片的颜色和形状 例如,我们可以以不同的方式裁剪图像,使感兴趣的对象出现在不同的位置,减少模型对于对象出现位置…

Linux系统如何添加磁盘分区基本情况

Linux系统如何添加磁盘&&分区基本情况 原理介绍 Linux来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成整个文件系统的一部分。 Linux采用了一种…

JavaScript-DOM和BOM详解

文章目录DOM 和 BOM1. DOM2. BOM2.1 BOM 简介2.2 分类2.3 语法1) Navigator 当前浏览器2)Histry 向前或向后翻页3)Location 地址栏的信息DOM 和 BOM 1. DOM 浏览器已经为我们提供了文档节点的对象,这个对象是 window 对象的属性可以在页面中…

Netconf协议讲解

目录 什么是Netconf 为什么要提出Netconf 数据的类别 传统网络配置协议 Netconf配置协议 Netconf协议架构 安全传输层 消息层 操作层 内容层 Netconf配置设备流程 通过Python进行Netconf配置 什么是Netconf NETCONF(Network Configuration Protocol&…

Unity运行时代码编辑插件介绍-InGame Code Editor-IDE类文本编辑器

因为某些原因,需要在Runtime显示一下代码,也方便做样式设计 所以找到了这个插件 特色什么的都不展开说了,开源的代码都是好代码,样式什么的就不能要求过多 基础使用方法 导入TextMeshPro 基于这个插件的,所以需要先从Package Manager先下载TextMeshPro 创建编辑器 T…

【SpringBoot应用篇】SpringBoot集成j2cache二级缓存框架

【SpringBoot应用篇】SpringBoot集成j2cache二级缓存框架j2cache介绍j2cache入门使用pomapplication.ymlcaffeine.propertiesCacheTestController启动类j2cache介绍 j2cache是OSChina(开源中国)目前正在使用的两级缓存框架。 j2cache的两级缓存结构: L1&#xff…

《悠悠岁月》悠悠岁月,浅藏浅忆,且行且珍惜

《悠悠岁月》悠悠岁月,浅藏浅忆,且行且珍惜 安妮埃尔诺,法国当代著名女作家,2022年获诺贝尔文学奖。埃尔诺从1974年开始创作,至今已出版了约十五部作品。《悠悠岁月》这部历经二十余年思考和推敲的杰作,使她…

Apache Shiro(一)

1.Apache Shiro Apache Shiro Reference Documentation | Apache Shiro Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。Shiro 可以完 成:认证、授权、加密、会话管理、与 Web 集成、缓存 等。借助 Shiro 您可以快速轻松 地保护任何应用程序——从最…

PHPExcel基本使用(2) 导入图片

一、效果二、代码一、效果 基于这篇 PHPExcel基本使用&#xff08;2&#xff09; 导入图片 调整 二、代码 基于thinkphp5.1 <?phpnamespace app\index\controller;use think\facade\Env;class Test {public function test(){self::excelAction();}/*** todo 导出报表*…

Microcontent - 微内容

这两年&#xff0c;微内容不断被人提及。微内容是什么&#xff1f;微内容解决什么问题&#xff1f;今天我们一起来看看这个话题。 作者&#xff1a;Sarah Cuellar - 1 - 什么是微内容 什么是微内容&#xff1f;微内容指的是小块的内容&#xff0c;它们遵循具体的的结构规则…

classnames 源码学习笔记与解读

前言 这里我引用源码文档中的一句话来作为开场白&#xff1a; A simple JavaScript utility for conditionally joining classNames together. 话不多说&#xff0c;咱们直接开始 classnames 的源码学习。 核心源码解读 直接来看它的源码部分&#xff0c;以下这是 classnam…