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

探索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

错误处理提示:

  1. 出现 .so 文件找不到的报错,这表示动态链接库找不到,这种情况要么某库未安装,去yum安装一下;要么是需要库已经装了,但是路径不在当前系统的LIB路径里,需要 export LD_LIBRARY_PATH=${库的路径}:$LD_LIBRARY_PATH
  2. 使用 /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 是传输层安全协议,其“简单化”的握手流程如下:

  1. Client 向 Server 请求建立连接(client hello)。
  2. Server 将自己的证书发送给 Client(server hello)。
  3. Client 验证证书,然后使用证书中的公钥加密后续通信的对称密钥,将加密内容发送给 Server。
  4. Server 收到后解密获得对称密钥,且将用该对称密钥上层数据进行加解密。
  5. 自此 TLS 握手完成,接下来使用对称密钥进行通信。
    真实的 tls 握手流程会比上述复杂,主要是为了防止降级攻击、重放攻击等攻击手段。

上述握手过程中有几点需要说明:

  1. tls 中加密方式包含非对称加密、对称加密两种。
  2. tls 中使用非对称加密的主要目的,只是为了安全“护送”对称密钥。真正数据是使用对称密钥加密,使用非对称密钥太耗时了。
  3. 我们并不能使用公钥直接“护送”对称密钥,因为客户端分不清公钥是“哪家”的。万一 DNS 被劫持了,邪恶服务器顶替正常服务器,客户端收到了邪恶服务器的公钥,和邪恶服务器撩起来,就麻烦了。为了防止这种情况,需要对公钥签名,标明这个公钥是“哪家”的。
  4. 所谓签名,就是将签名所需内容:公钥、域名、所有者等信息,发给 CA 机构(公认信任的机构),CA 机构会验证信息正确性,然后将信息做个hash,再将这个 hash 值和签名所需内容放在一起,最后 CA 机构用自己的私钥对放在一起的信息进行加密,这个过程就是签名,加密后的内容就是证书。现在再想一下上述的邪恶服务器还敢顶替正常服务器,用自己的证书和客户握手吗?肯定不敢了,它自己的证书可在 CA 机构备过案了呀。
  5. 如果不是 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 官方说法ecparamgenpkey命令,都可以用来生成私钥,但实际上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 全都消失&#xff0…...

前端就业宝典---目录

工作时候扭螺丝,面试时候造火箭,现状就是如此。不管是背八股文,还是掌握了知识的精华,对答如流才是硬道理。本专栏就是要集具前端精华,规范、算法、架构、封装、原理等一并汇集,让前端的小伙伴有个思路。 大剑师的微信 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个(池&#xff0…...

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

华为云AI开发平台ModelArts

华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

基础测试工具使用经验

背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

深度学习习题2

1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC&#xf…...

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的​​亮度(或…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录,这个目录下存放着许多可执行文件。与其他系统的可执行文件类似,这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中,用…...