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

成长在于积累——https 认证失败的学习与思考

1. 引言

        本周二长城项目在收尾过程中,出现了一个车端无法进行注册的问题:curl提示证书认证失败(其实已经能确认问题方向了,运维人员去确认证书问题即可)。虽然最终的原因是由于长城运维人员导致的。但是这个过程让我颇受“感动“。

  1. 问题出现的当天,运维人员没有思路,导致现场测试,开发人员一起调试到晚上10点。
  2. 当我们咨询长城人员是否对服务器进行修改时,由于我们并不能明确说明问题点。导致客户一直不会主动去响应。(属于双方的问题)
  3. 问题定位的不明确。导致项目经理问题推进不顺利以及消耗我们内部许多资源。(属于我们技术支持不到位)

        经过此事,我觉得打铁还需自身硬。虽然问题的原因是因为客户做了修改。但是我们却一直不能定位到问题。这就属于我们的能力问题了。

        本文,主要是想分享一下该问题的分析思路,以及证书认证相关的知识。希望能对同事们有所帮助。

2. 问题复现过程

问题日志截图如下:

图一:车端注册,平台反馈失败

从图中,我们可以得出,curl 错误码51(认证失败)。

应对措施:请运维人员进行证书相关的排查

        运维人员进行了操作之后,得出结论:并没有对证书进行修改,并且他自己通过curl 指令,在服务器中是可以访问成功的。如图:

图二:运维人员在服务器上,进行验证

        之后就没有下文,问题就卡住了(当时我的内心是崩溃的)。我用同样的根证书,客户端证书,客户端密钥,都是无法访问成功的(拒绝连接)。后来我猜测应该是平台当时建立了路由规则,可惜没办法验证了

图三:尝试连接OTA 平台服务器,却被拒绝访问

        问题挂在这里,过了几天,客户终于重视了这个问题,派了对方的运维人员进行查看。花了半个小时,问题就解决掉了。

图四:客户问题定位

        虽然定位的不一定准确,但是可以确定的是:服务器的根证书有问题

        经过此事,我花了点时间,查阅网上资料,以及请问通知,总结了https 认证过程中的一些知识点。总结之后,感觉之前还是自己知识面窄了,导致浪费了不少的资源。

3. 知识点总结

3.1  名词介绍

对于初学者,建议先了解一下名词。

名词

解释

证书

SSL协议中的证书,其主要功能有两点。

1.    身份验证

2.    数据加密传输

因此证书中一般包含以下信息:公钥,持有者信息,证书认证机构的CA信息,证书有效期等。

单向认证

单项认证是我们平时用的比较多的访问方式。比如我们访问百度网站,采用的就是单项认证。浏览器只需要认证服务端的合法性即可。

双向认证

顾名思义,客户端不仅要验证服务器的合法性。服务器也要验证客户端的合法性。

证书链

一个证书列表,若对端证书授权于列表中其一,则认为对端证书可信

根证书

根证书其实就是CA认证中心的一种体现。若本地信任该证书,即表明信任该CA认证中心相关的下属证书。

自签证书

用自己生成的根证书,签发证书。但是这种证书对于一般的平台是不可信的。

商签证书

与自签证书相反。使用的是商业根证书,签发证书。由于商业根证书一般是被大众所信任的。根据证书链的原理,签发的证书也就被信任。

3.2 单向认证和双向认证

        我们在不同的项目中,与平台之间的交互形式是不一样的。有单向认证和双向认证。

3.2.1 单向认证

        单向认证的过程:客户端从服务端下载服务器端公钥证书,依据自己本地证书链,进行验证。若验证成功,则建立安全通信通道。

服务端需要保存公钥证书私钥两个文件。客户端只需要保存证书链即可。

图五:单向认证流程

3.2.2 双向认证

        双向认证的过程:客户端除了需要将服务端的公钥证书下载,与本地证书链进行验证外。还需要将客户端的公钥证书上传到服务端,服务端用自己的根证书进行验证,等双方都认证通过了,才开始进行数据传输。

        服务端需要保存根证书(用于校验客户端证书的合法性),服务器的公钥证书,服务器的密钥文件。客户端需要保存客户端证书文件,客户端密钥文件客户端证书链

图六:双向认证流程

3.2.3 牛刀小试

当了解认证的流程后,我们可以自己做一个自签证书流程,以加深印象。从上面的内容中,我们知道需要用到六个证书。

  • 服务器端公钥证书:server.crt
  • 服务器端私钥文件:server.key
  • 根证书:root.crt
  • 客户端公钥证书:client.crt
  • 客户端私钥文件:client.key
  • 客户端集成证书链:client_CA.crt

图七:证书关系图

3.2.3.1 生成自签名根证书
  1. 创建根证书私钥。openssl genrsa -out root.key 1024
  2. 创建根证书请求文件。openssl req -new -out root.csr  -key root.key 注意:在创建证书请求文件的时候需要注意以下三点,下面生成服务器请求文件和客户端请求文件均要注意这三点:根证书的Common Name填写root就可以,所有客户端和服务器端的证书这个字段需要填写域名,一定要注意的是,根证书的这个字段和客户端证书、服务器端证书不能一样。其他所有字段的填写,根证书、服务器端证书、客户端证书需保持一致。最后的密码可以直接回车跳过。
  3. 创建根证书。openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650

得到了有效期为10年的根证书root.crt.我们可以用这个根证书去颁发服务器证书和客户端证书。

3.2.3.2      生成自签名服务端证书
  1. 生成服务器端证书私钥。openssl genrsa -out server.key 1024
  2. 生成服务器证书请求文件。openssl req -new -out server.csr -key server.key证书请求文件中携带着公钥以及用户信息。但是证书请求文件是未加密的,任何人获取到之后,都是可以解析其中内容的。
  3. 生成服务器端公钥证书。openssl x509 -req -in server.csr -out server.crt -signkey server.key  -CA root.crt -CAkey root.key  -CAcreateserial -days 3650使用根证书私钥对证书请求文件内容进行加密,并在证书中添加其它参数。比如:说明该证书的CA机构(root.crt)。此时root.crt 文件是可以被解析的。但是获取到的是被加密之后的服务器公钥+服务器信息。以及签发的CA机构(root)。
3.2.3.3      生成自签名客户端证书
  1. 生成客户端的证书密钥。openssl genrsa -out client.key 1024
  2. 生成客户端证书请求文件。openssl req -new -out client.crs -key client.key
  3. 生成客户端证书。openssl x509 -req -in client.crs -out client.crt -signkey client.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650

3.3   握手过程(单向为例)

通过上面的单向认证以及双向认证的图解,我们已经有了初步的理解。现在加深一下理解。

  1. 客户端向服务器发起握手请求。该请求中包含了以下内容:
    1. 客户端 SSL 协议的版本号,
    2. 加密算法的种类,
    3.  以及其他服务器和客户端之间通讯所需要的各种信息。
  2.  服务端进行响应,其中包含了:
    1. SSL 协议的版本号,
    2. 加密算法的种类,
    3. 以及其他相关信息,
    4.  同时服务器还将向客户端传送自己的证书。
  3. 客户端接收到服务端的消息及证书之后,数字证书就要进行验证了。流程大致如下:
    1. 首先将证书进行解密,获取证书相关信息。
    2. 判断证书是否过期;
    3. 发行服务器的证书CA是否可靠;(主要查看该CA是否在客户端的信任列表中)
    4. 使用发行者的公钥机密服务器的数字签名。
    5. 判断证书上的域名是否和服务器的实际域名相匹配。
    6. 若以上都通过,则证书合法。并获取证书中的公钥。
  4. 客户端随机产生一个用于后面通讯的“对称密钥”R,然后用服务器的公钥对其加密,再发送给服务器。
  5. 客户端向服务器端发出信息,指明后面的数据通讯将使用的步骤 4 中的主密码为对称密钥,同时通知服务器客户端的握手过程结束。
  6. 服务器向客户端发出信息,指明后面的数据通讯将使用的步骤 4 中的主密码为对称密钥,同时通知客户端服务器端的握手过程结束。
  7. SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验。

4. 思考

若遇上本次问题时,我已掌握上述知识点,我会有什么不同呢?分析:

  1. 由图一可知:curl 返回51 错误码。表示客户对服务器的证书没有认证通过。
  2. 其实已经将这个排查点通知客户:客户端验证服务器端证书失败,请问你们是修改服务器证书了吗?(最初可以直接对客户抛出这样的问题,但是由于我们自身不自信,若客户不理睬,我们也不会去催促他们)。到此,可以将问题抛给客户了。若更加专业点,可以进行步骤三。
  3. 获取服务器证书内容,将crt 进行解析:openssl x509 -in clientcert.crt -noout -text分析证书中的内容,找出认证失败的原因。这样客户就没有理由不理睬了。

后面也遇到了一个证书问题:下载阶段,车端无法下载固件包,但是通过浏览器进行下载,就可以将固件包下载

图8. 车端无法下载固件包

了解了上述的知识点后,我们就可以这样分析:

浏览器访问是单向认证,并且可以正常下载。(没有弹出警告),但是我们车端和云端之间采用的是自签证书。理应服务器的CA不在电脑的信任列表中的。因此,我们可以怀疑客户采用的证书是商用证书。结果也是如此。

图9. 客户的回答:CDN证书错误

总结

经过此次问题,我由两点感触:

  1. 知识面的提高,对于我们交付组成员而言是比较重要的。
  2. 对于前线兄弟的支持,目前做的不到位。当问题不清晰,责任不明确时,技术人员不会主动去协助,导致项目经理和测试人员很被动。因此项目中的技术负责人,还是很有必要的。

相关文章:

成长在于积累——https 认证失败的学习与思考

1. 引言 本周二长城项目在收尾过程中,出现了一个车端无法进行注册的问题:curl提示证书认证失败(其实已经能确认问题方向了,运维人员去确认证书问题即可)。虽然最终的原因是由于长城运维人员导致的。但是这个过程让我颇…...

C语言——数字金字塔

实现函数输出n行数字金字塔 #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>void pyramid(int n) {int i,j,k;for (i1; i<n; i){//输出左边空格&#xff0c;空格数为n-i for (j1; j<n-i; j){printf(" "); } //每一行左边空格输完后输出数字&#…...

关于 typedef 的用法

typedef 是 C 和 C 语言中的关键字&#xff0c;用于创建类型的别名。它的主要作用是给一个已有的类型定义一个新的名称&#xff0c;以提高代码的可读性和可维护性。下面是 typedef 的几种常见用法&#xff1a; 用于给基本类型定义别名&#xff1a; typedef int myint;上述代码…...

Webshell流量分析

Webshell流量分析 常见的一句话木马: asp一句话 <%eval request("pass")%> aspx一句话 <%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%> php一句话 <?php @eval($_POST["pass&…...

高级IO—poll,epoll,reactor

高级IO—poll,epoll,reactor 文章目录 高级IO—poll,epoll,reactorpoll函数poll函数接口poll服务器 epollepoll的系统调用epoll_createepoll_ctlepoll_wait epoll的工作原理epoll的工作方式水平触发边缘触发 epoll服务器 reactor poll函数 poll函数是一个用于多路复用的系统调…...

一文详解Python中常用数据类型

文章目录 Python 中常用的数据类型包括&#xff1a;Python 中布尔类型(bool)Python 中的数字类型概述Pyhon中的字符串概述Python 中的List概述Python 中的元组类型(tuple)Python中的字典&#xff08;Dictionary&#xff09;Python中的集合&#xff08;Set&#xff09;Python中的…...

【MATLAB源码-第85期】基于farrow结构的滤波器仿真,截止频率等参数可调。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 Farrow结构是一种用于实现可变数字滤波器的方法&#xff0c;尤其适用于数字信号处理中的采样率转换和时变滤波。它通过多项式近似来实现对滤波器系数的平滑变化&#xff0c;使得滤波器具有可变的群延时或其他参数。 Farrow结…...

ChatGPT Plus/GPT4高级数据分析和插件功能详解

ChatGPT 在论文写作与编程方面也具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题&#xff0c;ChatGPT都能为您提供实用且高质量的建议和指导&#xff0c;提高编程效率和准确性。此外&#xff0c;ChatGPT是一位出色的合作伙伴&#xff0c;可以为您提供论文写作的…...

【Android Jetpack】Room数据库

文章目录 引入EntitiesPrimary Key主键索引和唯一性对象之间的关系外键获取关联的Entity对象嵌套对象Data Access Objects&#xff08;DAOs&#xff09;使用Query注解的方法简单的查询带参数查询返回列的子集可被观察的查询 数据库迁移用法 引入 原始的SQLite有以下两个缺点: …...

自定义中间件

1.使用 app.use0来定义全局生效的中间件 // 导入 express 模块 const express require(express) // 创建 express的服务器实例 const app express() app.use(function(req, res, next) {// 中间件的业务逻辑 }) 2.监听 req 的 data 事件 在中间件中&#xff0c;需要监听 re…...

优化机器学习:解析数据归一化的重要性与应用

在机器学习中&#xff0c;数据归一化是一种数据预处理的技术&#xff0c;旨在将数据转换为相似的范围或标准化的分布。这样做的主要目的是消除不同特征之间的量纲差异或数值范围差异&#xff0c;以确保模型在训练时更稳定、更有效地学习特征之间的关系。 通常&#xff0c;机器…...

五分钟,Docker安装flink,并使用flinksql消费kafka数据

1、拉取flink镜像&#xff0c;创建网络 docker pull flink docker network create flink-network2、创建 jobmanager # 创建 JobManager docker run \-itd \--namejobmanager \--publish 8081:8081 \--network flink-network \--env FLINK_PROPERTIES"jobmanager.rpc.ad…...

【小聆送书第一期】让架构师的成神之路温暖你这个不景气的冬天

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言 书籍一览 ⛳️书籍一⛳️书籍二⛳️书籍三⛳️书籍四⛳️书籍五⛳️书籍六⛳️书…...

网页爬虫反扒措施有哪些?

爬虫之常见的反扒 cookies 一般用requests直接请求网址的时候有时候可能会遇到反扒措施&#xff0c;这时候可以考虑一下加上user-agent伪装成浏览器&#xff1b;也可能有登录限制&#xff0c;这时候cookies就有用处了 浏览器中的cookie是保存我们的账号数据和访问记录&#…...

C#实现批量生成二维码

相信大家都使用过草料二维码生成器&#xff0c;单独生成二维码可以&#xff0c;但是批量生成二维码就需要收费了。既然要收费&#xff0c;那就自己写一个。 接口采用导入Excel文件生成二维码&#xff0c;首先需要读取Excel的数据&#xff0c;方法如下所示&#xff1a; /// <…...

3种在ArcGIS Pro中制作山体阴影的方法

山体阴影可以更直观的展现地貌特点&#xff0c;表达真实的地形&#xff0c;这里为大家介绍一下在ArcGIS Pro中制作山体阴影的方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的DEM数据&#xff0c;除了DEM数据&#xff0c;常见的GIS数据…...

【ChatGLM2-6B】Docker下部署及微调

【ChatGLM2-6B】小白入门及Docker下部署 一、简介1、ChatGLM2是什么2、组成部分3、相关地址 二、基于Docker安装部署1、前提2、CentOS7安装NVIDIA显卡驱动1&#xff09;查看服务器版本及显卡信息2&#xff09;相关依赖安装3&#xff09;显卡驱动安装 2、 CentOS7安装NVIDIA-Doc…...

输入两个整数,输出它们的乘积。 ← Python 及 C++ 代码比较

【题目描述】 输入两个整数&#xff0c;输出它们的乘积。【Python代码】 x,ymap(int,input().split()) print(x*y) 【C代码】 #include<bits/stdc.h> using namespace std;int x,y; int main() {cin>>x>>y;cout<<x*y<<endl;return 0; }/* in:…...

C语言——从键盘输人一个表示年份的整数,判断该年份是否为闰年,并显示判断结果。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int year 0;printf("请输入年份&#xff1a;");scanf("%d",&year);if((year%4 0) && (year%100!0) || (year%400 0)){printf("%d是闰年\n",year);}else{p…...

出于隐私和安全的考虑,有时需要从谷歌删除你的个人数据,有两种方法

如果你是公众人物、企业或拥有个人品牌的人&#xff0c;那么拥有在线形象很重要。然而&#xff0c;你可能会发现&#xff0c;通过谷歌搜索&#xff0c;陌生人可以获得你的个人信息&#xff0c;如联系方式、地址和财务信息&#xff0c;这会让你感到不安。 幸运的是&#xff0c;…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

flow_controllers

关键点&#xff1a; 流控制器类型&#xff1a; 同步&#xff08;Sync&#xff09;&#xff1a;发布操作会阻塞&#xff0c;直到数据被确认发送。异步&#xff08;Async&#xff09;&#xff1a;发布操作非阻塞&#xff0c;数据发送由后台线程处理。纯同步&#xff08;PureSync…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...