ssl单向证书和双向证书校验测试及搭建流程
零、前提准备
首先了解下HTTP和HTTPS的区别:
HTTPS与HTTP有什么不同?
HTTP是过去很长一段时间我们经常用到的一种传输协议。HTTP协议传输的数据都是未加密的,这就意味着用户填写的密码、账号、交易记录等机密信息都是明文,随时可能被泄露、窃取、篡改,从而被黑客加以利用,因此使用HTTP协议传输隐私信息非常不安全。
HTTPS是一种基于SSL协议的网站加密传输协议,网站安装SSL证书后,使用HTTPS加密协议访问,可激活客户端浏览器到网站服务器之间的SSL加密通道(SSL协议),实现高强度双向加密传输,防止传输数据被泄露或篡改。简单讲,HTTPS=HTTP+SSL,即HTTPS是HTTP的安全版。
本次测试相关说明:
50.50.1.118作为服务端,系统是 linux,openssl版本是:OpenSSL 1.1.1f 31 Mar 2020。
50.50.1.116是客户端,系统是Windows10-64 bit。
1、CA机构之根证书的生成
# 生成CA私钥
openssl genrsa -out CA.key 2048
# 生成CA证书签名请求
openssl req -new -key CA.key -out CA.csr
# 生成CA的自签名证书, 即根证书
openssl x509 -req -in CA.csr -extensions v3_ca -signkey CA.key -out CA.crt
2、服务端准备
# 生成私钥key
openssl genrsa -des3 -out server.key
# 生成证书签名请求
openssl req -new -key server.key -out server.csr
# 向CA申请证书,生成带有CA签名的证书
openssl x509 -days 365 -req -in server.csr -extensions v3_req -CAkey ../CA/CA.key -CA ../CA/CA.crt -CAcreateserial -out server.crt
3、 客户端准备
openssl genrsa -des3 -out client.key
openssl req -new -key client.key -out client.csr
openssl x509 -days 365 -req -in client.csr -extensions v3_req -CAkey ../CA/CA.key -CA ../CA/CA.crt -CAcreateserial -out client.crt
# 客户端证书转为p12格式(p12格式才能导入浏览器);
# 后续双向认证时,客户端发起请求时,要携带自己的证书到服务器;
# 怎么携带?将p12格式的证书导入浏览器即可;
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
4、生成的证书

一、单向证书校验
更多关于单向认证/双向认证的理论性知识,请猛戳:SSL单向认证和双向认证分析。
关于nginx的配置,可以大概参考下阿里的这篇文章:
阿里-在Nginx或Tengine服务器安装SSL证书
验证步骤:
1、修改nginx配置文件,将服务端证书和服务私钥进行指定,并重启nginx;
2、客户端将根证书添加到受信任的颁发机构中(可有可无);
3、打开浏览器,访问 https://50.50.1.118,可以看到服务器响应的结果(nginx欢迎页面);
4、可以通过wireshark进行抓包分析。
修改nginx.conf配置文件

将根证书添加到受信任的机构中

直接双击CA.crt进行安装即可。


开始抓包


抓包分析
可见,整个握手过程当中,只有服务器将自己的证书响应给客户端;
不存在客户端将自己的证书响应给服务器的情况;
此即为单向认证。下面再给出一个示例图。

二、双向证书校验
对于一般的https网站来说,实际上https所使用的证书是属于单向验证,即客户端单向验证服务器的安全性,而服务器端是没有对客户端的身份进行验证的。如果自己部署了一些安全性较高的网站不希望被其他人随意访问,就可以尝试部署https的双向认证,对客户端也添加证书认证。
1、修改nginx配置文件,添加对客户端的证书校验,并重启nginx;

2、打开谷歌浏览器,导入客户端证书;

ps:也可以直接在Windows证书管理器中添加添加,如下所示:

3、抓包验证
最后重启浏览器(一定要重启, 如果打开多个同类型浏览器,则需全部关闭后再重启),输入 https://50.50.1.118进行访问, 会弹出证书选择框。。。


可以看到,服务端和客户端分别给对方响应了各自的证书,此即为双向认证。
4、另一种验证方法 (使用curl作为客户端调用验证)
上述我们通过浏览器中导入客户端的p12证书来完成双向验证,,
实际我们也可以直接利用curl命令来完成验证。。无需做上述中的p12证书的导入。。
我们的客户端windows,首先安装crul工具。
Windows下载curl
直接解压即可,解压后,将bin添加至系统环境变量中。。。
# --cert指定客户端公钥证书的路径
# --key指定客户端私钥文件的路径
# -k不校验证书的合法性,因为我们用的是自签名证书,所以需要加这个参数,否则无法建立连接
# 可以使用-v来观察具体的SSL握手过程curl -k --cert .\client.crt --key .\client.key https://50.50.1.118 -v


更多关于curl命令的使用,请参考以下文章:
(1)https://www.ruanyifeng.com/blog/2019/09/curl-reference.html
(2)https://blog.csdn.net/angle_chen123/article/details/120675472
三、参考文章
1、https://zhuanlan.zhihu.com/p/377622199
2、http://www.meilongkui.com/archives/1670
3、https://www.cnblogs.com/simono/p/16629480.html
4、https://blog.csdn.net/qq_37997682/article/details/125472654
相关文章:
ssl单向证书和双向证书校验测试及搭建流程
零、前提准备 首先了解下HTTP和HTTPS的区别: HTTPS与HTTP有什么不同? HTTP是过去很长一段时间我们经常用到的一种传输协议。HTTP协议传输的数据都是未加密的,这就意味着用户填写的密码、账号、交易记录等机密信息都是明文,随时…...
【2种方法,jmeter用一个正则提取器提取多个值!】
jmeter中,用json提取器,一次提取多个值,这个很多人都会。但是,用正则提取器一次提取多个,是否可以呢? 肯定,很多人都自信满满的说,可以!形如:token":&q…...
012-堆,结构体
012-堆,结构体 堆空间的申请和释放 堆空间特点? 栈空间的特点是,自动申请自动释放 堆空间由用户自己主动申请,主动释放 利用函数malloc进行堆空间的申请 利用函数free进行堆空间使用完毕后的释放 问题: 局部变量的存储空间在栈区; 全局变量的存储空…...
GDAL C++ API 学习之路 OGRGeometry 多边形类 OGRPolygon
OGRPolygon class OGRPolygon 是 OGR 几何图形库中的一个类,用于表示多边形的几何图形。它是一种封闭的多边形,由一个或多个外环(OGRLinearRing)和零个或多个内环(OGRLinearRing)组成。多边形是平…...
文件传输协议FTP与托管文件传输MFT有什么区别?
传输敏感数据是日常业务中不可或缺的一环。但是,在把敏感数据从A点搬到B点的过程中,保证该敏感数据的安全是组织的重要任务,因此最好选择一种能够确保文件安全的方案。 FTP与MFT有什么不同? FTP(文件传输协议…...
js实现按照句号将一段文本进行分段
/*** 将给定的文本按照300字并且按照句号分为多个p标签** param text 给定的文本* returns 返回分割后的多个p标签的数组*/ function splitTextByParagraph(text) {// 将文本按照句号分割成多个句子const sentences text.split(。);// 初始化一个空数组来存储生成的p标签const…...
环形链表的进一步探究
茕茕白兔,东走西顾,衣不如新,人不如故 往期回顾: 数据结构——双向链表 数据结构——单链表 数据结构——顺序表 文章目录 如何判断一个链表是否为环形链表 环形链表的判断的深入探究 例1:沸羊羊追美羊羊 例…...
flink任务性能优化
1、使用异步算子,异步执行操作 2、将下游数据需要的数据以参数的形式向下传递 3、当服务器资源有限的情况下,慎用RocksDBStateBackend RocksDBStateBackend performance will be poor because of the current Flink memory configuration! RocksDB wi…...
vue2 el-carousel轮播图和文字一起改变
vue项目的话 安装一下element依赖 npm i element-ui -S在main入口文件引入element包 我在app文件里边去写的 <template><div class"w"><el-carousel height"460px"><el-carousel-item v-for"item in items" :key"i…...
LangChain:打造自己的LLM应用 | 京东云技术团队
1、LangChain是什么 LangChain是一个框架,用于开发由LLM驱动的应用程序。可以简单认为是LLM领域的Spring,以及开源版的ChatGPT插件系统。核心的2个功能为: 1)可以将 LLM 模型与外部数据源进行连接。 2)允许与 LLM 模…...
字节跳动测试岗,3面都过了,HR告诉我这个原因被刷了...
说在前面 面试时最好不要虚报工资。本来字节跳动是很想去的,几轮面试也通过了,最后没offer,自己只想到下面几个原因: 虚报工资,比实际高30%; 有更好的人选,这个可能性不大,我看还在…...
Android 14重要更新预览
Android 14重要更新预览 国际化 Android 14 在 Android 13 的基础上进一步扩展了按应用设定语言功能,提供了一些额外的功能: 自动生成应用的 localeConfig:从 Android Studio Giraffe Canary 7 和 AGP 8.1.0-alpha07 开始,您可以…...
快速上手字符串函数
文章目录 前言一、求字符串的长度strlen函数strlen函数学习使用strlen函数模拟实现strlen函数模拟实现方法1:计数器法strlen函数模拟实现方法2:指针减指针法strlen函数模拟实现方法3:递归方法 二、字符串的拷贝,拼接和比较strcpy函…...
linux(centos) docker 安装 nginx
1、拉取nginx最新版本镜像 docker pull nginx:latest 查看镜像 docker images 或者 docker images -a 2.启动nginx容器 docker run -d -p 80:80 --name nginx nginx 使用docker run命令,启动nginx容器。 --name,设置容器名。为方便记忆ÿ…...
SpringBoot 整合 Minio
官网: MinIO 是一个基于 Go 实现的高性能、兼容 S3 协议的对象存储。它采用 GNU AGPL v3 开源协议,项目地址是 https://github.com/minio/minio 。 它适合存储海量的非结构化的数据,例如说图片、音频、视频等常见文件,备份数据、…...
《吐血整理》高级系列教程-吃透Fiddler抓包教程(24)-Fiddler如何优雅地在正式和测试环境之间来回切换-中篇
1.简介 在开发或者测试的过程中,由于项目环境比较多,往往需要来来回回地反复切换,那么如何优雅地切换呢?宏哥今天介绍几种方法供小伙伴或者童鞋们进行参考。 2.实际工作场景 2.1问题场景 (1)已发布线上…...
探索 GPTCache|GPT-4 将开启多模态 AI 时代,GPTCache + Milvus 带来省钱秘籍
世界正处于数字化的浪潮中,为了更好理解和分析大量数据,人们对于人工智能(AI)解决方案的需求呈爆炸式增长。 此前,OpenAI 推出基于 GPT-3.5 模型的智能对话机器人 ChatGPT,在自然语言处理(NLP&a…...
纯css实现登录表单动效
效果图: 代码展示 // 我这边用的是elementUI表单校验,更改的样式。 <el-form:model"form":rules"rules"ref"fromList":hide-required-asterisk"true"><el-form-item prop"account"><…...
【css】外边距margin
外边距中有一个属性值比较有意思:inherit 值,继承父类的属性。 <!DOCTYPE html> <html> <head> <style> div {border: 1px solid red;margin-left: 100px; }p.ex1 {margin-left: inherit; } </style> </head> <…...
Cpp8 — 二叉搜索树
二叉搜索树(搜索二叉树、二叉排序树) 二叉搜索树又称二叉排序树,它要么是一棵空树,要么是具有以下性质的二叉树: 1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 2.若它的右子树不为空&…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
