探索GmSSL+Nginx实践及原理
前言
随着大国崛起步伐的迈进,敏感单位的数据安全问题越发受到重视,数据的加密安全传输尤为重要,对于安全问题,国家自研加密算法提供了有力的保障。
作为信创行业的国有企业,十分有必要在网络通信中使用国密算法加密通信,保障客户数据安全,做出客户放心满意的产品。
本文将介绍如何制作出支持国密算法的nginx,及相关原理。
GmSSL
介绍
- 是由北京大学自主开发的国产商用密码开源库。
- 实现了对国密算法、标准和安全通信协议的全面功能覆盖,支持包括移动端在内的主流操作系统和处理器。
- 支持密码钥匙、密码卡等典型国产密码硬件。
- 提供功能丰富的命令行工具及多种编译语言编程接口。
它在国密算法中,主要两个作用:提供库、生成证书。
版本问题
- 根据 github 分支可以看出版本有:master(也称为 v3)、GmSSL-v2、GmSSL-v1。
- GmSSL 起始是由 OpenSSL 开源项目变更而来,相当于 OpenSSL 的一个分支。v2 版本及以前版本提供和 OpenSSL 相同的 API,可以很好的兼容依赖 OpenSSL API的应用,比如兼容 nginx、tomcat 等。
- 但是最新版 v3 版本,采用了新设计的架构和API,不再兼容 OpenSSL API的应用。
- 为了体现 v3 版本的适用性,团队开源出了基于 Nginx 1.21.0 修改的 Nginx-with-GmSSLv3(部署启动后 tls 流程我是没跑通的)。
- v3 版本还有一个重要变更:支持TLS 1.3,而 v2 版本只支持 TLS 1.2。
安装
下载代码
GmSSL Github 代码下载地址
我们切换分支使用 GmSSL-v2。
编译安装
git clone https://github.com/guanzhi/GmSSL.git
cd GmSSL
# 指定 gmssl 安装路径
./config --prefix=/usr/local/gmssl
# 编译安装
make && make install
# 检查安装成功否
/usr/local/gmssl/bin/gmssl version
错误处理提示:
- 出现
.so文件找不到的报错,这表示动态链接库找不到,这种情况要么某库未安装,去yum安装一下;要么是需要库已经装了,但是路径不在当前系统的LIB路径里,需要export LD_LIBRARY_PATH=${库的路径}:$LD_LIBRARY_PATH - 使用
/usr/local/gmssl/bin/gmssl命令,大概率会出现undefined symbol: xxx的错误。这说明找到库了,但找错了,可能找到默认库路径里去了,而默认库里恰好存在同名的so文件(比如 libcrypto.so.1.1、libssl.so.1.1 文件是 gmssl 所需的,但默认库路径也有的)。添加环境变量export LD_LIBRARY_PATH=/usr/local/gmssl/lib:$LD_LIBRARY_PATH即可解决。
Nginx 安装
下载代码
nginx 下载
这里提供下载的 1.22.0 版本,你也可以选择合适的版本下载,并解压。
编译安装
准备
在刚解压的路径,vim 编辑nginx/auto/lib/openssl/conf文件:
将文中内容:
CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"
修改为:
CORE_INCS="$CORE_INCS $OPENSSL/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libcrypto.a"
执行安装
./configure --with-pcre \--with-http_ssl_module \--with-http_v2_module \--with-http_realip_module \--with-http_addition_module \--with-http_sub_module \--with-http_flv_module \--with-http_mp4_module \--with-http_gunzip_module \--with-http_gzip_static_module \--with-http_random_index_module \--with-http_secure_link_module \--with-http_stub_status_module \--with-http_auth_request_module \--with-http_slice_module \--with-mail \--with-threads \--with-file-aio \--with-stream \--with-mail_ssl_module \--with-stream_ssl_module \--with-openssl="${gmssl 安装路径}" \--with-cc-opt="-I${gmssl 安装路径}/include" \--with-ld-opt="-lm"
# 编译安装
make && make install
上述命令可以看出,with-openssl是指定 openssl 安装路径的,但我们实际需要填写安装 gmssl 的路径。
证书
TLS 介绍
tls 是传输层安全协议,其“简单化”的握手流程如下:
- Client 向 Server 请求建立连接(client hello)。
- Server 将自己的证书发送给 Client(server hello)。
- Client 验证证书,然后使用证书中的公钥加密后续通信的对称密钥,将加密内容发送给 Server。
- Server 收到后解密获得对称密钥,且将用该对称密钥上层数据进行加解密。
- 自此 TLS 握手完成,接下来使用对称密钥进行通信。
真实的 tls 握手流程会比上述复杂,主要是为了防止降级攻击、重放攻击等攻击手段。
上述握手过程中有几点需要说明:
- tls 中加密方式包含非对称加密、对称加密两种。
- tls 中使用非对称加密的主要目的,只是为了安全“护送”对称密钥。真正数据是使用对称密钥加密,使用非对称密钥太耗时了。
- 我们并不能使用公钥直接“护送”对称密钥,因为客户端分不清公钥是“哪家”的。万一 DNS 被劫持了,邪恶服务器顶替正常服务器,客户端收到了邪恶服务器的公钥,和邪恶服务器撩起来,就麻烦了。为了防止这种情况,需要对公钥签名,标明这个公钥是“哪家”的。
- 所谓签名,就是将签名所需内容:公钥、域名、所有者等信息,发给 CA 机构(公认信任的机构),CA 机构会验证信息正确性,然后将信息做个hash,再将这个 hash 值和签名所需内容放在一起,最后 CA 机构用自己的私钥对放在一起的信息进行加密,这个过程就是签名,加密后的内容就是证书。现在再想一下上述的邪恶服务器还敢顶替正常服务器,用自己的证书和客户握手吗?肯定不敢了,它自己的证书可在 CA 机构备过案了呀。
- 如果不是 CA 机构签发的证书,是私人签发的,客户端会有警告并提示:是否继续前往。
证书介绍
格式
其实证书就两种格式:二进制、文本格式。
常见的证书后缀包括:.der、.cer、.pem、.crt、.csr、.pfx、.p12、.jks等。
der、cer,二进制格式,只保存证书,不保存私钥。pfx、p12,二进制格式,同时包含证书和私钥。pem、crt、csr 一般是文本格式。
Gmssl 生成证书指令
概述
指令及开发文档:gmssl 命令及开发文档。
可以使用 Gmssl 发布私人证书,gmssl指令繁多,我们只需理解相关步骤指令含义即可,相关步骤包含:生成私钥、生成证书签名请求文件、生成证书。
生成私钥
gmssl ecparam -genkey -name sm2p256v1 -noout -out root.key
- gmssl 官方说法
ecparam和genpkey命令,都可以用来生成私钥,但实际上genpkey不可用。 -name表示选择一条椭圆曲线来生成私钥,可以通过gmssl ecparam -list_curves查看内建了哪些椭圆曲线。- 我们使用
-name sm2p256v1就行,加密算法相关,不用深究。
生成证书签名请求文件
gmssl req -new -key root.key -out root.csr -subj "/C=CN/ST=BeiJing/L=BeiJing/O=公司名/CN=tom/emailAddress=邮箱"
- 生成 root.csr 证书签名请求文件,为什么生成root.csr,它的作用是什么:我们在签名的时候,需要提供公钥、域名、所有者等信息给 CA 机构,root.csr 就是这些信息合在一起的一个文本。所以可以知道csr文件里是含有公钥的。
-subj表示主题,使用该指令就不用按照提示手动填入相关信息。
生成证书
/usr/local/gmssl/bin/gmssl x509 -req -days 3650 -sm3 -in root.csr -extfile openssl.cnf -extensions v3_ca -signkey root.key -out root.crt
- 使用根(CA)私钥对
.crt文件加密(签名)。 - 这里的
-extfile指定的openssl.cnf配置文件,其实就是 openssl 安装路径下的配置文件拷贝出来,并添加上以下配置:
# 这个配置必加,否则 gmssl 会报错的。openssl 则无需。
[ v3enc_req ]
basicConstraints = CA:FALSE
keyUsage = keyAgreement, keyEncipherment, dataEncipherment
查看证书内容
/usr/local/gmssl/bin/gmssl x509 -in server.crt -text -noout
证书生成
生成脚本如下:
#!/bin/bash # 生成CA证书 /usr/local/gmssl/bin/gmssl ecparam -genkey -name sm2p256v1 -noout -out root.key /usr/local/gmssl/bin/gmssl req -new -key root.key -out root.csr -subj "/C=CN/ST=BeiJing/L=BeiJing/O=公司名/CN=tom/emailAddress=邮箱" /usr/local/gmssl/bin/gmssl x509 -req -days 3650 -sm3 -in root.csr -extfile openssl.cnf -extensions v3_ca -signkey root.key -out root.crt # Server签名证书 /usr/local/gmssl/bin/gmssl ecparam -genkey -name sm2p256v1 -noout -out server.key /usr/local/gmssl/bin/gmssl req -new -SM3 -key server.key -out server.csr -subj "/C=CN/ST=BeiJing/L=BeiJing/O=公司名/CN=tom/emailAddress=邮箱" /usr/local/gmssl/bin/gmssl x509 -req -SM3 -days 3650 -in server.csr -extfile openssl.cnf -extensions v3_req -CA root.crt -CAkey root.key -set_serial 1000000001 -out server.crt # Server加密证书 /usr/local/gmssl/bin/gmssl ecparam -genkey -name sm2p256v1 -noout -out server_en.key /usr/local/gmssl/bin/gmssl req -new -SM3 -key server_en.key -out server_en.csr -subj "/C=CN/ST=BeiJing/L=BeiJing/O=公司名/CN=tom/emailAddress=邮箱" /usr/local/gmssl/bin/gmssl x509 -req -SM3 -days 3650 -in server_en.csr -extfile openssl.cnf -extensions v3enc_req -CA root.crt -CAkey root.key -set_serial 1000002001 -out server_en.crt
这里除了创建根(CA)密钥对,逻辑上只需再创建一个证书来使用就行,可我们脚本为什么创建了两个呢?后面再说。
Nginx 证书配置
在nginx.conf里对应的“server 块”中,配置:
ssl_certificate "/usr/local/nginx/conf/tls/server.crt";
ssl_certificate_key "/usr/local/nginx/conf/tls/server.key";
ssl_certificate "/usr/local/nginx/conf/tls/server_en.crt";
ssl_certificate_key "/usr/local/nginx/conf/tls/server_en.key";
需要配置两个证书,也就是上面脚本创建两个的原因。
如果 Nginx 中只配置了单个证书,那么你抓包查看 tls 流程,就会发现:client hello后,服务端返回一个handshake failed错误。此时你会被这个哲学问题困扰很久,就和当初我一样,下面解释原因:
- 正常 tls 中使用公钥可以用来验证签名和加解密。但是国密里不行,它规范要求分为验证签名的公钥和加解密的公钥两种公钥,所以这里得配两个,同时国密浏览器也做了相应适配。
- 如果是 C++ 写的“国密客户端”可能需要调用 GmSSL 提供的 API 了。
完结
感谢阅读,完结!
相关文章:
探索GmSSL+Nginx实践及原理
前言 随着大国崛起步伐的迈进,敏感单位的数据安全问题越发受到重视,数据的加密安全传输尤为重要,对于安全问题,国家自研加密算法提供了有力的保障。 作为信创行业的国有企业,十分有必要在网络通信中使用国密算法加密…...
Mybatis框架学习
什么是mybatis? mybatis是一款用于持久层的、轻量级的半自动化ORM框架,封装了所有jdbc操作以及设置查询参数和获取结果集的操作,支持自定义sql、存储过程和高级映射 mybatis用来干什么? 用于处理java和数据库的交互 使用mybat…...
基于微信小程序的电影院订票系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言运行环境说明用户微信小程序端的主要功能有:管理员的主要功能有:具体实现截图详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考论文参考源码获取 前言 💗博主介绍&…...
LeetCode-热题100-笔记-day32
二分查找 今日刷到二分查找,以前做过的题忘的一干二净;庆幸自己用新的方法做了出来两道“中等”题;(我都能做出来我认为应该标“简单”)由于之前题的难度基本在抄答案,所以停更几天。今天没抄答案就更新一…...
STP生成树协议基本配置示例---STP逻辑树产生和修改
STP是用来避免数据链路层出现逻辑环路的协议,运行STP协议的设备通过交互信息发现环路,并通过阻塞特定端口,最终将网络结构修剪成无环路的树形结构。在网络出现故障的时候,STP能快速发现链路故障,并尽快找出另外一条路径…...
Java版企业电子招标采购系统源码—企业战略布局下的采购寻源
项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审…...
华纳云:SQLserver配置远程连接的方法是什么
在 SQL Server 中配置远程连接涉及一些步骤,包括启用远程连接、配置网络协议、设置防火墙规则和授权远程访问。以下是一些配置远程连接的主要步骤: 启用远程连接: 打开 SQL Server Management Studio(SSMS)并连接到你的…...
CryptoCTF easy
文章目录 2023suctionBlue Office 2022Baphomet 2023 suction 题目描述: from Crypto.Util.number import * from flag import flagdef keygen(nbit, r):while True:p, q [getPrime(nbit) for _ in __]e, n getPrime(16), p * qphi (p - 1) * (q - 1)if GCD(e…...
计算机视觉技术的革新:医疗领域的应用
近年来,计算机视觉技术在医疗领域引起了广泛的关注和应用。通过将计算机视觉与医疗技术相结合,我们可以实现更准确、高效的医疗诊断和治疗,为患者提供更好的医疗服务。 首先,计算机视觉在医疗图像分析中的应用是其中的一个重要方…...
python找出文件夹里文件名以特定字符结尾的文件并移动到另一个目录
python找出文件夹里文件名以特定字符结尾的文件并移动到另一个目录 代码 import os import shutil# 源文件夹路径 source_folder "./data/deep/test"# 目标文件夹路径 target_folder "./data/deep/A"# 确保目标文件夹存在,如果不存在则创建…...
面试官问:大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?怎么处理?
几个方面: 问题描述:什么现象?什么影响? 问题分析 解决方案 底层原理 1.问题描述 模拟高并发的场景,会出现批量的 TIME_WAIT 的 TCP 连接: 短时间后,所有的 TIME_WAIT 全都消失࿰…...
前端就业宝典---目录
工作时候扭螺丝,面试时候造火箭,现状就是如此。不管是背八股文,还是掌握了知识的精华,对答如流才是硬道理。本专栏就是要集具前端精华,规范、算法、架构、封装、原理等一并汇集,让前端的小伙伴有个思路。 大剑师的微信 gis-dajianshi, 欢迎一起交流,并非常期望您能够提…...
Uniboot 系列光纤跳线简介
飞速(FS)Uniboot 系列光纤跳线产品质量可靠,性能优良,可满足数据中心的各种需求。其中,包括LC、CS™、MDC 和 SN 在内的不同类型的连接器能够满足不同应用的特定需求。下面将进一步介绍飞速(FS)…...
【面试题】Promise只会概念远远不够,还需这17道题目巩固!
前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 表妹一键制作自己的五星红旗国庆头像,超好看 在学习Promise相关题目之前,我们先做一些知识的回顾:JavaScript 是一门单…...
互联网医院牌照|互联网医院牌照审批流程和材料
随着科技的不断进步和社会的发展,互联网医院已经成为了当前的热点。而互联网医院的准入门槛自然也就越来越高。如果您计划成立一个互联网医院,您需要了解申请互联网医院牌照所需要注意的方面以及申请的流程。 一、资质申请前的准备 1、立项阶段准备 在立…...
第五章:C语言的数组
文章目录 1、数组的理解2、各类数组的定义3、变长数组4、字符数组 1、数组的理解 一维数组:比如定义一个int a[3];,那么可以将其看成两部分,a【3】为①,int为②。意思就是有一个数组名字为a,里面包含3个(池࿰…...
Spring面试题3:说一说MVC框架的底层实现
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说MVC框架的底层实现 MVC(Model-View-Controller)是一种软件设计模式,常被用于构建用户界面和应用程序的架构。MVC框架的底层实现可以分为…...
云原生周刊:K8s 的 13 个最佳开源监控工具
开源项目推荐 Silver Surfer 该项目旨在检查 Kubernetes 对象的 API 版本兼容性,并为其提供迁移路径,以便为集群升级做好准备。 Actions Runner Controller Actions Runner Controller (ARC) 是一个 Kubernetes 操作器,可为 GitHub Actio…...
怎么克服一篇论文写作前的恐惧感?
作者 代陈锐 中国科学技术大学生命科学与医学部在读博士生,主要探究生理和病理过程中组蛋白翻译后修饰的调控机制。 1. 引言 在我们开始一篇文章的撰写时,往往不知如何下笔或是不停否认自己撰写的内容,最终的结果自然是撰写效率低而且陷入自我纠结。在这里我通过结合平时…...
Linux 安全 - Credentials
文章目录 一、简介1.1 Objects1.2 Object ownership1.3 The objective context1.4 Subjects1.5 The subjective context1.6 Actions1.7 Rules, access control lists and security calculations 二、Types of Credentials2.1 Traditional UNIX credentials2.2 Capabilities2.3 …...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...
【2D与3D SLAM中的扫描匹配算法全面解析】
引言 扫描匹配(Scan Matching)是同步定位与地图构建(SLAM)系统中的核心组件,它通过对齐连续的传感器观测数据来估计机器人的运动。本文将深入探讨2D和3D SLAM中的各种扫描匹配算法,包括数学原理、实现细节以及实际应用中的性能对比,特别关注…...
