-
这可能是因为该站点使用过期的或不安全的 tls 安全设置_HTTPS详解(二):SSL / TLS 工作原理和详细握手...
2020-11-18 21:41:00作者:IamHYN前言在上篇文章HTTPS详解一中,我已经为大家介绍了 HTTPS 的详细原理和通信流程,但总感觉少了点什么,应该是少了对安全层的针对性介绍,那么这篇文章就算是对HTTPS 详解一的补充吧。还记得这张图吧。...作者:IamHYN
前言
在上篇文章HTTPS详解一中,我已经为大家介绍了 HTTPS 的详细原理和通信流程,但总感觉少了点什么,应该是少了对安全层的针对性介绍,那么这篇文章就算是对HTTPS 详解一的补充吧。还记得这张图吧。
HTTPS 和 HTTP的区别
显然,HTTPS 相比 HTTP最大的不同就是多了一层 SSL (Secure Sockets Layer 安全套接层)或 TLS (Transport Layer Security 安全传输层协议)。有了这个安全层,就确保了互联网上通信双方的通信安全,那么这个安全层是怎么工作的,SSL / TLS 握手过程又是怎样的呢?本文将对这些问题一一解答。
1、SSL / TLS 以及 SSL / TLS 握手的概念
SSL 和 TLS 协议可以为通信双方提供识别和认证通道,从而保证通信的机密性和数据完整性。TLS 协议是从Netscape SSL 3.0协议演变而来的,不过这两种协议并不兼容,SSL 已经逐渐被 TLS 取代,所以下文就以 TLS 指代安全层。 TLS 握手是启动 HTTPS 通信的过程,类似于 TCP 建立连接时的三次握手。 在 TLS 握手的过程中,通信双方交换消息以相互验证,相互确认,并确立它们所要使用的加密算法以及会话密钥 (用于对称加密的密钥)。可以说,TLS 握手是 HTTPS 通信的基础部分。
2、TLS 握手过程中发生了什么
我们已经知道 TLS 握手的目的是建立安全连接,那么通信双方在这个过程中究竟干了什么呢?下面就是答案:
- 商定双方通信所使用的的 TLS 版本 (例如 TLS1.0, 1.2, 1.3等等);
- 确定双方所要使用的密码组合;
- 客户端通过服务器的公钥和数字证书 (上篇文章已有介绍)上的数字签名验证服务端的身份;
- 生成会话密钥,该密钥将用于握手结束后的对称加密。
3、TLS 握手详细过程
下面来看 TLS 握手的详细过程 (注:此图与HTTPS详解一中的 HTTPS 原理图的流程大致相同,不同的是此图把重点放在了TLS握手的相关概念上):
SSL / TLS 握手详细过程
- "client hello"消息:客户端通过发送"client hello"消息向服务器发起握手请求,该消息包含了客户端所支持的 TLS 版本和密码组合以供服务器进行选择,还有一个"client random"随机字符串。
- "server hello"消息:服务器发送"server hello"消息对客户端进行回应,该消息包含了数字证书,服务器选择的密码组合和"server random"随机字符串。
- 验证:客户端对服务器发来的证书进行验证,确保对方的合法身份,验证过程可以细化为以下几个步骤:检查数字签名验证证书链 (这个概念下面会进行说明)检查证书的有效期检查证书的撤回状态 (撤回代表证书已失效)
- "premaster secret"字符串:客户端向服务器发送另一个随机字符串"premaster secret (预主密钥)",这个字符串是经过服务器的公钥加密过的,只有对应的私钥才能解密。
- 使用私钥:服务器使用私钥解密"premaster secret"。
- 生成共享密钥:客户端和服务器均使用 client random,server random 和 premaster secret,并通过相同的算法生成相同的共享密钥 KEY。
- 客户端就绪:客户端发送经过共享密钥 KEY加密过的"finished"信号。
- 服务器就绪:服务器发送经过共享密钥 KEY加密过的"finished"信号。
- 达成安全通信:握手完成,双方使用对称加密进行安全通信。
4、TLS 握手过程中的一些重要概念
- 数字证书 (digital certificate):在非对称加密通信过程中,服务器需要将公钥发送给客户端,在这一过程中,公钥很可能会被第三方拦截并替换,然后这个第三方就可以冒充服务器与客户端进行通信,这就是传说中的“中间人攻击”(man in the middle attack)。解决此问题的方法是通过受信任的第三方交换公钥,具体做法就是服务器不直接向客户端发送公钥,而是要求受信任的第三方,也就是证书认证机构 (Certificate Authority, 简称 CA)将公钥合并到数字证书中,然后服务器会把公钥连同证书一起发送给客户端,私钥则由服务器自己保存以确保安全。数字证书一般包含以下内容:证书所有者的公钥证书所有者的专有名称证书颁发机构的专有名称证书的有效起始日期证书的过期日期证书数据格式的版本号序列号,这是证书颁发机构为该证书分配的唯一标识符... ...
- 数字签名 (digital signature):这个概念很好理解,其实跟人的手写签名类似,是为了确保数据发送者的合法身份,也可以确保数据内容未遭到篡改,保证数据完整性。与手写签名不同的是,数字签名会随着文本数据的变化而变化。具体到数字证书的应用场景,数字签名的生成和验证流程如下:服务器对证书内容进行信息摘要计算 (常用算法有 SHA-256等),得到摘要信息,再用私钥把摘要信息加密,就得到了数字签名服务器把数字证书连同数字签名一起发送给客户端客户端用公钥解密数字签名,得到摘要信息客户端用相同的信息摘要算法重新计算证书摘要信息,然后对这两个摘要信息进行比对,如果相同,则说明证书未被篡改,否则证书验证失败
- 证书链 (certificate chain):证书链,也称为证书路径,是用于认证实体合法身份的证书列表,具体到 HTTPS 通信中,就是为了验证服务器的合法身份。之所以使用证书链,是为了保证根证书 (root CA certificate)的安全,中间层可以看做根证书的代理,起到了缓冲的作用,如下图所示,这里还以 B 站证书为例:
证书链
证书链从根证书开始,并且证书链中的每一级证书所标识的实体都要为其下一级证书签名,而根证书自身则由证书颁发机构签名。客户端在验证证书链时,必须对链中所有证书的数字签名进行验证,直到达到根证书为止。
4.密码规范和密码组合 (CipherSpecs 和 CipherSuites):通信双方在安全连接中所使用的算法必须符合密码安全协议的规定,CipherSpecs 和 CipherSuites 正好定义了合法的密码算法组合。CipherSpecs 用于认证加密算法和信息摘要算法的组合,通信双方必须同意这个密码规范才能进行通信。而 CipherSuites 则定义了 SSL / TLS 安全连接中所使用的加密算法的组合,该组合包含三种不同的算法:
- 握手期间所使用的的密钥交换和认证算法 (最常用的是 RSA 算法)
- 加密算法 (用于握手完成后的对称加密,常用的有 AES、3DES等)
- 信息摘要算法 (常用的有 SHA-256、SHA-1 和 MD5 等)
4、总结
本文对 SSL / TLS 握手过程进行了详细的解析,也对握手过程中的几个重要概念进行了补充说明。想继续深入了解的小伙伴可以去参考一下 CloudFlare 和 IBM 的官网,这两个网站也是本文内容的主要来源。多逛逛英文网站,不仅可以涨姿势,获取权威信息,还能顺带提升一波英语水平,一举两得,岂不美哉,希望小伙伴们也能尽快养成这样的好习惯。HTTPS 详解部分到此结束,咱们下篇文章再见。
-
这可能是因为该站点使用过期的或不安全的 tls 安全设置_网络安全必须要知道的17个技术知识点...
2020-12-02 19:35:41回答这个问题需要对网络安全有深入的了解,并且在该领域工作的任何人都应该能够做出强有力的回应。您应该期待一个后续问题,询问这三个问题中的哪个要重点关注。一种简单的表达方式:威胁来自针对组织中的漏洞(或...- 您的家庭网络上有什么?您的家庭网络通常是一个测试环境。您如何使用它来表明您将如何使用他人的网络。
- 威胁,漏洞和风险之间有什么区别?回答这个问题需要对网络安全有深入的了解,并且在该领域工作的任何人都应该能够做出强有力的回应。您应该期待一个后续问题,询问这三个问题中的哪个要重点关注。一种简单的表达方式:威胁来自针对组织中的漏洞(或弱点)的某人,由于没有正确识别为风险,因此该漏洞没有得到缓解或解决。
- 如何保护服务器安全?您可能需要将此答案分解为多个步骤,尤其是当它涉及特定类型的服务器时。您的答案将使您了解决策能力和思考过程。就像有多种保护服务器安全的方法一样,有多种方法可以回答此问题。您可能会引用“无人信任”的概念或最小特权原则。让您的专业知识来指导您对这个问题和后续问题的回答。
- 为什么DNS监视很重要?有人认为这是没有必要的,反之则表明域名服务存在弱点。其他人则说,DNS监视是谨慎的,因为DNS查询是来自网络的数据渗透向量,允许任何主机通过端口53与Internet通信。
- Ping通过哪个端口工作?当心这个。 Ping是第3层协议,例如IP;端口是第4层协议TCP和UDP的元素。
- 编码,加密和哈希之间有什么区别?这个问题应该引起有关加密的简短讨论,从而使您有机会解释加密知识。
- 什么是SSL?SSL是用于在服务器和客户端(通常是Web服务器和Web浏览器)之间创建加密链接的标准安全技术。
- HTTPS,SSL和TLS有什么区别?HTTPS是超文本传输协议,可确保网络上的通信安全。 TLS是传输层安全性,并且是SSL的后继协议。您必须证明自己知道这三种方法之间的区别,以及如何使用网络相关协议来了解所涉及的固有风险。
- 您将寻找哪种异常来识别受感染的系统?有多种方法可以解决此问题,但同样,您需要展示自己的专业知识和创造力。一个可能的答案是使用其IPS / IDS,防火墙和其他安全技术来绘制基本的网络体系结构,以描述流量类型和其他危害迹象。
- 如果在传输过程中必须同时压缩和加密数据,那么首先要做什么?先压缩再加密,因为先加密可能很难显示压缩效果。
- 您将如何加强用户身份验证?无论您以何种方式回答,请提及两因素身份验证或不可否认性以及实现方式。
- 如何防御跨站点脚本(XSS)攻击?即使很难回答,每个网络安全专家都应该知道这一点。准备好周到,简洁的计划来防御此JavaScript漏洞。
- 云和内部网络安全之间的区别是什么?表明您了解两者固有的安全风险,并且可能更适合公司。
- RDP代表什么?远程桌面协议,其端口号为3389。
- 对称加密和非对称加密有什么区别?对称加密使用相同的密钥进行加密和解密,而非对称加密使用不同的密钥进行加密和解密。通常使用非对称加密来保护初始的密钥共享对话,但是随后使用对称加密来保护实际对话。使用对称加密的通信通常更快,这是因为加密/解密过程中涉及的数学稍微简单一些,并且会话设置不涉及PKI证书检查。”
- UDP和TCP有什么区别?两者都是用于通过Internet发送信息包的协议,并且都建立在Internet协议的基础上。 TCP代表传输控制协议,更常用。它对发送的数据包进行编号,以确保收件人能够接收到它们。 UDP代表用户数据报协议。尽管它的运行方式与TCP类似,但它并未使用TCP的错误检查功能,这可以加快处理过程,但会降低可靠性。
- 什么是跟踪路由?跟踪路由或tracert可以帮助您查看发生通信中断的位置。它显示了什么路由器
-
解决"IP地址非你在商户平台设置的可用IP地址"和”未能创建 SSL/TLS 安全通道“ 问题
2020-02-07 07:25:57C# 开发微信公众号现金红包发送,解决"IP地址非你在商户平台设置的可用IP地址"和”未能创建 SSL/TLS 安全通道“ 问题 近期在做涉及一个微信公众号微信发送红包的项目,参考微信支付文档,没有什么特别的。需要注意的...C# 开发微信公众号现金红包发送,解决"IP地址非你在商户平台设置的可用IP地址"和”未能创建 SSL/TLS 安全通道“ 问题
近期在做涉及一个微信公众号微信发送红包的项目,参考微信支付文档,没有什么特别的。需要注意的是:
1、微信发送红包需要证书验证,下载API证书放至程序指定目录;
2、绑定IP,需要在 ”现金红包-产品设置-调用IP地址“ 里面设置,一定要IP地址,且程序发送所在服务器提交页面不能带有端口号,否则提示: IP地址非你在商户平台设置的可用IP地址(目前我测试是这么个情况)。这里如果是存放在虚拟主机,也不要用域名解析后的地址,可能也会提示“IP地址非你在商户平台设置的可用IP地址”这个错误。建议是:建立一个网页传到虚拟主机,获取主机的服务器IP地址即可。string AddressIP = string.Empty; foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList) { if (_IPAddress.AddressFamily.ToString() == "InterNetwork") { AddressIP = _IPAddress.ToString(); } } Response.Write(AddressIP);
3、读取证书 这里如果使用的是framework4.0以下, 那么可能不会有tls11和tls12 需要强制转换一下即可 。另外一定要用
X509Certificate2 cer = new X509Certificate2(cert, certPassword, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
方式读取,否则会提示 ”未能创建 SSL/TLS 安全通道“
string cert = certPath; ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); ServicePointManager.Expect100Continue = true; ServicePointManager.SecurityProtocol = ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | (SecurityProtocolType)0x300 //Tls11 | (SecurityProtocolType)0xC00; //Tls12 //X509Certificate2 cer = new X509Certificate2(cert, certPassword); //测试线下 //这里很重要 如果提示 未建立SSL和TLS通道 证书必须用这个 X509Certificate2 cer = new X509Certificate2(cert, certPassword, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
-
计算机网络 - mbed TLS
2019-03-19 16:03:59计算机网络 - mbed TLS...概述SSL/TLS 客户端和服务器加密库对称加密算法散列算法公钥随机数发生X.509 证书处理测试堆栈解释(Stack explanation)SSL/TLS 说明示例客户端添加安全通信设置SSL 连接SSL/TLS 配置读写数...计算机网络 - mbed TLS
计算机网络 - mbed TLS
背景
SSL/TLS 是什么?
传输层安全性协议(英语:Transport Layer Security,缩写作TLS),及其前身安全套接层(Secure Sockets Layer,缩写作SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。
- 安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。
- 该协议由两层组成: TLS 记录协议(TLS Record) 和 TLS 握手协议(TLS Handshake)。
TLS协议主要解决如下三个网络安全问题:
- 保密(message privacy),保密通过加密encryption实现,所有信息都加密传输,第三方无法嗅探;
- 完整性(message integrity),通过MAC校验机制,一旦被篡改,通信双方会立刻发现;
- 认证(mutual authentication),双方认证,双方都可以配备证书,防止身份被冒充;
TLS 协议是可选的,必须配置客户端和服务器才能使用。主要有两种方式实现这一目标:一个是使用统一的 TLS 协议通信端口(例如:用于 HTTPS 的端口 443);另一个是客户端请求服务器连接到 TLS 时使用特定的协议机制(例如:邮件、新闻协议和 STARTTLS)。一旦客户端和服务器都同意使用 TLS 协议,他们通过使用一个握手过程协商出一个有状态的连接以传输数据。通过握手,客户端和服务器协商各种参数用于创建安全连接:
- 当客户端连接到支持 TLS 协议的服务器要求创建安全连接并列出了受支持的密码组合(加密密码算法和加密哈希函数),握手开始。
- 服务器从该列表中决定加密和散列函数,并通知客户端。
- 服务器发回其数字证书,此证书通常包含服务器的名称、受信任的证书颁发机构(CA)和服务器的公钥。
- 客户端确认其颁发的证书的有效性。
- 为了生成会话密钥用于安全连接,客户端使用服务器的公钥加密随机生成的密钥,并将其发送到服务器,只有服务器才能使用自己的私钥解密。
- 利用随机数,双方生成用于加密和解密的对称密钥。这就是 TLS 协议的握手,握手完毕后的连接是安全的,直到连接(被)关闭。如果上述任何一个步骤失败,TLS 握手过程就会失败,并且断开所有的连接。
为什么用 mbed TLS?
在SSL/TLS出现之前,很多应用层协议(http、ftp、smtp等)都存在着网络安全问题,例如大家所熟知的 http 协议,在传输过程中使用的是明文信息,传输报文一旦被截获便会泄露传输内容;传输过程中报文如果被篡改,无法轻易发现;无法保证消息交换的对端身份的可靠性。为了解决此类问题,人们在应用层和传输层之间加入了 SSL/TLS 协议。
其他 SSL 库可能很难使用,OpenSSL一直以来各种被诟病,mbed TLS/SSL 库是为了你的方便而设计的,是替代 OpenSSL 的一个很好的选择。
为了执行 SSL 或 TLS 协议,SSL 库需要提供一些附加功能。
- SSL 库需要执行对称加密操作,例如 AES,来加密连接上的数据。
- SSL 库使用非对称加密操作,如 RSA,来识别和验证链接的各方。
- SSL 库使用报文摘要操作,例如 SHA-256 哈希算法来保护通过线路发送的信息完整性。
- 另外,SSL 库需要能够解析 理解和使用 X.509 证书。
- 最后,SSL 库必须执行网络操作来发送和接收协议包。
所有这些对大多数用户来说都是不可见的,并且被封装在一个 SSL 库,如 mbed TLS中,开发人员可以使用它来在其应用程序中实现 SSL 或 TLS。
概述
ARM® mbed™ 使开发人员可以非常轻松地在其(嵌入式)产品中加入加密和 SSL/TLS 功能,并通过最大限度地减少代码占用空间来推动这一功能。它提供了具有直观的 API 和可读源代码的 SSL 库,并包含精心设计的测试套件。该工具即开即用,您可以在大部分系统上直接构建它,也可以手动选择和配置各项功能。
mbed TLS 库的设计是为了方便地与现有(嵌入式)应用集成,并提供安全通信,加密和密钥管理功能。 本教程将帮助您了解要执行此操作时要执行的步骤。
mbed TLS 库被设计为尽可能降低耦合,允许您只集成所需的部件,而不会产生其余部分的开销。 这也导致 mbed TLS 库的内存占用非常低并且构建足迹。通过消除系统中不需要的功能部分,您可以将构建尺寸从低至 45 kB 降低到更典型的 300 kB,从而实现更全面的设置。
mbed TLS 采用易于移植的 C 语言设计,以嵌入式环境为主要目标,可在ARM,AVR等嵌入式平台上运行,适用于PC,iPad,iPhone甚至XBox。 请告诉我们您在其他平台上的体验!
mbed TLS 库提供了一组可单独使用和编译的加密组件,您还可以使用单个配置头文件加入或排除这些组件。mbed TLS 还提供了构建于加密组件上的中央 SSL/TLS 模块,以及为 SSL 和 TLS 提供完整协议实施的抽象层和支持组件。
从功能角度来看,该库分为三个主要部分:
- SSL/TLS 协议实施。
- 一个加密库。
- 一个 X.509 证书处理库。
SSL/TLS 客户端和服务器
mbed TLS 为当前所有的 SSL 和 TLS 标准提供客户端和服务器端支持,这些标准包括:SSL 3 版以及 TLS 1.0 版、1.1 版和 1.2 版。当然还支持大多数标准化协议扩展,如服务器名称指示 (SNI)、会话票证和安全重审。
mbed TLS 实现支持主要的密钥交换方式和 100 多种不同的标准化密码组。
加密库
mbed TLS 的加密部分拥有针对公钥加密、散列算法(消息摘要)和对称加密算法的抽象层。另外,它还包含多个基于标准的随机数发生器和一个熵池。
所有的加密算法都作为松散耦合的模块执行。您可以直接根据需要选取相应的头文件和源代码文件并将其放入项目中。
对称加密算法
密码抽象层提供了对称加密和解密功能,以实现保密性。它针对不同算法支持不同的块加密模式,从电子密码本 (ECB)、密码块链接 (CBC) 到计数器模式 (CTR)、密码反馈模式 (CFB) 和伽罗瓦计数器模式 (GCM)。
mbed TLS 不仅提供 AES、Blowfish 和 Camellia 等最常用的算法,还提供 DES 和 RC4 等老旧或已弃用的算法。
散列算法
mbed TLS 针对散列算法和消息摘要提供了消息摘要抽象层,可提供单向散列和散列消息认证码 (HMAC)。
mbed TLS 不仅为 SHA-256、SHA-512 和 RIPEMD-160 等最常用的算法提供支持,还支持 MD2、MD4、MD5 和 SHA-1 等老旧或已弃用的算法。
公钥
非对称算法可以搭配传统的 RSA 或椭圆曲线,您可以在此基础上使用公钥抽象层,以确保机密性、完整性、身份验证和不可抵赖性。
密钥交换支持可用于:
- Diffie-Hellman-Merkle 密钥交换协议。
- 椭圆曲线 Diffie-Hellman-Merkle (ECDH) 密钥交换协议。
- 椭圆曲线数字签名算法 (ECDSA)。
随机数发生
针对随机数发生,mbed TLS 提供了熵池和适用于 CTR-DRBG 与 HMAC-DRBG 的特定实现(NIST 标准化随机数发生器)。熵池系统可从标准源和应用程序提供的源收集熵。
X.509 证书处理
SSL/TLS 身份验证和一些其他协议需要支持 X.509 证书处理。X.509 证书可以将身份传达给其他方,但在使用前必须由其他方进行有效性检查。
mbed TLS 包括以下支持:
- X.509 证书 (CRT) 解析。
- X.509 证书吊销列表 (CRL) 解析。
- X.509 (RSA/ECDSA) 私钥解析。
- X.509 证书验证:检查证书的签名链是否由受信任的证书颁发机构签发,以及该证书(或其签名链中的其中一个中间 CA 证书)是否位于其签发 CA 的证书吊销列表中。
另外,还可以执行某些证书颁发机构操作以从头创建证书,如:
- X.509 证书 (CRT) 编写。
- X.509 (RSA/ECDSA) 私钥编写。
- X.509 证书请求 (CSR) 解析。
- X.509 证书请求 (CSR) 编写。
测试
mbed TLS 采用持续集成系统以确保我们尽可能维持最高的代码质量。我们的系统借助一套不断增长的操作系统和芯片组来检查所有提交的代码,检查范围包括:
- 回归测试。
- 测试向量。
- 多个静态分析器。
- 互操作性测试。
- 行为测试。
- 通过模糊测试进行的安全性测试。
- 针对已知值的函数和单元测试。
- 代码覆盖率测试。
- 验证测试。
mbed TLS
堆栈解释(Stack explanation)
本教程的目的是向您展示如何使用 mbed TLS 保护(加密)客户端和服务器之间的通信。 首先展示所涉及的主要组件。
从下往上:-
硬件(Hardware)
硬件平台提供物理处理器,存储器,内存和网络接口 -
操作系统(Operating System)
操作系统提供以太网驱动程序和标准服务.这取决于操作系统,包括调度,线程安全,和一个完整的网络堆栈. -
网络堆栈(Network Stack)
取决于操作系统,网络堆栈要么完全集成,要么是一个单独的模块,从网络接口提供抽象层.最常用的是 lwIP TCP/IP stack 和 uIP TCP/IP stack. -
mbed TLS SSL/TLS Library
建立在网络接口之上, mbed tls 为安全通信提供了一个抽象层. -
客户端应用(Client Application)
客户端应用程序使用mbed tls 本身抽象安全通信.
将mbed tls 集成到应用程序的确切步骤非常依赖与上面特定组件。在基本教程中,我们将假设一个集成了BSD-like TCP/IP 堆栈的操作系统。
SSL/TLS 说明
mbed tls 的 ssl/tls 部分提供了使用 ssl/tls 通过安全通信通道建立和通信方法.
- 其基本规定是:
- 初始化一个SSL/TLS context
- 执行一个SSL/TLS握手(handshake)
- 发送/接收数据
- 通知对方一个连接正在关闭
- 一个通道很多方面都是通过参数和回调函数来设置的.
- 端点角色(endpoint role),客户端和服务器
- 身份验证模式: 是否应该进行证书验证
- 主机到主机通信通道: 发送和接收功能
- 随机数生成器(RNG)功能
- 用于加密/解密的密码
- 证书验证功能
- 会话控制: 会话获取和设置功能
- 证书处理和密钥交换的X.509参数
mbed TLS可用于通过提供设置一个框架用来创建SSL/TLS服务器和客户端,并且通过SSL/TLS的通信信道进行通信。 SSL/TLS部分直接依赖于库的证书解析,对称和非对称加密以及散列模块。
示例客户端
因此,假设我们有一个简单的网络客户端,它尝试打开与 HTTP 服务器的连接并读取默认页面。 该应用程序可能看起来像这样:
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <stdio.h> #include <netdb.h> #define SERVER_PORT 80 #define SERVER_NAME "localhost" #define GET_REQUEST "GET / HTTP/1.0\r\n\r\n" int main( void ) { int ret, len, server_fd; unsigned char buf[1024]; struct sockaddr_in server_addr; struct hostent *server_host; /* * Start the connection */ printf( "\n . Connecting to tcp/%s/%4d...", SERVER_NAME, SERVER_PORT ); fflush( stdout ); if( ( server_host = gethostbyname( SERVER_NAME ) ) == NULL ) { printf( " failed\n ! gethostbyname failed\n\n"); goto exit; } if( ( server_fd = socket( AF_INET, SOCK_STREAM, IPPROTO_IP) ) < 0 ) { printf( " failed\n ! socket returned %d\n\n", server_fd ); goto exit; } memcpy( (void *) &server_addr.sin_addr, (void *) server_host->h_addr, server_host->h_length ); server_addr.sin_family = AF_INET; server_addr.sin_port = htons( SERVER_PORT ); if( ( ret = connect( server_fd, (struct sockaddr *) &server_addr, sizeof( server_addr ) ) ) < 0 ) { printf( " failed\n ! connect returned %d\n\n", ret ); goto exit; } printf( " ok\n" ); /* * Write the GET request */ printf( " > Write to server:" ); fflush( stdout ); len = sprintf( (char *) buf, GET_REQUEST ); while( ( ret = write( server_fd, buf, len ) ) <= 0 ) { if( ret != 0 ) { printf( " failed\n ! write returned %d\n\n", ret ); goto exit; } } len = ret; printf( " %d bytes written\n\n%s", len, (char *) buf ); /* * Read the HTTP response */ printf( " < Read from server:" ); fflush( stdout ); do { len = sizeof( buf ) - 1; memset( buf, 0, sizeof( buf ) ); ret = read( server_fd, buf, len ); if( ret <= 0 ) { printf( "failed\n ! ssl_read returned %d\n\n", ret ); break; } len = ret; printf( " %d bytes read\n\n%s", len, (char *) buf ); } while( 1 ); exit: close( server_fd ); #ifdef WIN32 printf( " + Press Enter to exit this program.\n" ); fflush( stdout ); getchar(); #endif return( ret ); }
一个简单的客户端应用程序:
- 在端口80上打开到服务器的连接
- 为主页面写一个标准的HTTP GET请求
- 读取结果,直到不再发送任何内容
添加安全通信
将 SSL/TLS 添加到应用程序需要进行许多修改。主要修改是 SSL 上下文和结构的设置,配置和拆除。 较小的更改是用于连接服务器,读取和写入数据的网络功能。
设置
由于设置 mbed TLS 需要一个好的随机数生成器及其自己的 SSL 上下文和SSL会话存储。对于随机数生成,mbed TLS 包含 CTR_DRBG 随机数生成器,也在此处使用。
- mbed TLS 所需的头文件:
#include "mbedtls/net.h" #include "mbedtls/ssl.h" #include "mbedtls/entropy.h" #include "mbedtls/ctr_drbg.h" #include "mbedtls/debug.h"
- mbed TLS结构的创建和初始化如下所示:
mbedtls_net_context server_fd; mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context ctr_drbg; mbedtls_ssl_context ssl; mbedtls_ssl_config conf; mbedtls_net_init( &server_fd ); mbedtls_ssl_init( &ssl ); mbedtls_ssl_config_init( &conf ); mbedtls_x509_crt_init( &cacert ); mbedtls_ctr_drbg_init( &ctr_drbg ); mbedtls_entropy_init( &entropy ); if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *) pers, strlen( pers ) ) ) != 0 ) { printf( " failed\n ! mbedtls_ctr_drbg_seed returned %d\n", ret ); goto exit; }
SSL 连接
通常在 TCP/IP 客户端应用程序中,应用程序通过调用
socket()
和connect()
进行连接。 代码如下if( ( server_host = gethostbyname( SERVER_NAME ) ) == NULL ) goto exit; if( ( server_fd = socket( AF_INET, SOCK_STREAM, IPPROTO_IP) ) < 0 ) goto exit; memcpy( (void *) &server_addr.sin_addr, (void *) server_host->h_addr, server_host->h_length ); server_addr.sin_family = AF_INET; server_addr.sin_port = htons( SERVER_PORT ); if( ( ret = connect( server_fd, (struct sockaddr *) &server_addr, sizeof( server_addr ) ) ) < 0 ) goto exit;
mbed TLS 在其网络层(net.c)中抽象出来。 因此,上面代码得到简化。通过 mbed TLS 进行连接的代码如下:
if( ( ret = mbedtls_net_connect( &server_fd, SERVER_NAME, SERVER_PORT, MBEDTLS_NET_PROTO_TCP ) ) != 0 ) { printf( " failed\n ! mbedtls_net_connect returned %d\n\n", ret ); goto exit; }
SSL/TLS 配置
现在,低级套接字连接已经启动并运行,我们应该配置 SSL/TLS 层。
首先通过设置端点和传输类型,并为安全参数加载合理的默认值来准备SSL配置。端点决定 SSL/TLS 层将作为服务器(MBEDTLS_SSL_IS_SERVER)还是客户端 (MBEDTLS_SSL_IS_CLIENT)。传输类型决定我们是使用 (MBEDTLS_SSL_TRANSPORT_STREAM)还是(MBEDTLS_SSL_TRANSPORT_DATAGRAM).
if( ( ret = mbedtls_ssl_config_defaults( &conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT ) ) != 0 ) { mbedtls_printf( " failed\n ! mbedtls_ssl_config_defaults returned %d\n\n", ret ); goto exit; }
认证方式决定检查所颁发的证书的严格程度。对于本教程,我们不检查任何内容。 **警告:**这不是您在完整应用程序中所需的内容。
mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_NONE );
mbed TLS 库需要知道使用哪个随机引擎以及将哪个调试功能作为会回调。
mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg ); mbedtls_ssl_conf_dbg( &conf, my_debug, stdout );
为了使调试功能正常,我们需要在 main() 函数添加一个名为 my_debug 的调试回调函数。
static void my_debug( void *ctx, int level, const char *file, int line, const char *str ) { ((void) level); fprintf( (FILE *) ctx, "%s:%04d: %s", file, line, str ); fflush( (FILE *) ctx ); }
现在配置已准备就绪,我们可以设置 SSL 上下文来使用它。
if( ( ret = mbedtls_ssl_set_hostname( &ssl, "mbed TLS Server 1" ) ) != 0 ) { mbedtls_printf( " failed\n ! mbedtls_ssl_set_hostname returned %d\n\n", ret ); goto exit; }
最后,SSL 上下文需要知道它用于发送网络数据的输入和输出函数。
mbedtls_ssl_set_bio( &ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL );
读写数据
配置好 SSL/TLS 层之后,我们应该实际写入并读取它。
写入到网络层:
while( ( ret = write( server_fd, buf, len ) ) <= 0 )
变成:
while( ( ret = mbedtls_ssl_write( &ssl, buf, len ) ) <= 0 )
从网络层读取:
ret = read( server_fd, buf, len );
变成:
ret = mbedtls_ssl_read( &ssl, buf, len );
**注意:**如果
mbedtls_ssl_read()
和mbedtls_ssl_write()
返回一个错误,连接必须被关闭.拆除(Teardown)
在应用程序的出口处,我们应该彻底的关闭 SSL/TLS 连接,并且还应该销毁任何与 SSL/TLS 相关的信息,最后,我们释放分配的资源。
所以
close( server_fd );
变成:
mbedtls_net_free( &server_fd ); mbedtls_ssl_free( &ssl ); mbedtls_ssl_config_free( &conf ); mbedtls_ctr_drbg_free( &ctr_drbg ); mbedtls_entropy_free( &entropy );
服务器认证
真正的应用程序应该正确地验证服务器。为此,您需要一组受信任的 CA。如何获取或选择取决于您的用例:要连接到 Web 服务器,您可以使用受信任的浏览器供应商提供的列表; 如果您的客户端是仅连接到您控制的一组服务器的设备,您可能希望成为自己的 CA等。
代码方面,您需要执行以下操作才能验证服务器证书:
mbedtls_x509_crt cacert; const char *cafile = "/path/to/trusted-ca-list.pem"; mbedtls_x509_crt_init( &cacert ); if( ( ret = mbedtls_x509_crt_parse_file( &cacert, cafile ) ) != 0 ) { mbedtls_printf( " failed\n ! mbedtls_x509_crt_parse returned -0x%x\n\n", -ret ); goto exit; } mbedtls_ssl_conf_ca_chain( &conf, &cacert, NULL ); // remove the following line // mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_NONE );
结论
将 SERVER_PORT 更改为 443 后,编译此应用程序并将其链接到 mbed TLS 库,我们现在有一个可以通过基本的 HTTPS 与 Web 服务器通信的应用程序。最终代码在库的源代码中以 ssl_client1.c 或在 github 上以 ssl_client1.c 的形式提供。
参考链接
-
https如何设置TLS协议版本 javax.net.ssl.SSLException: Received fatal alert: protocol_version)
2019-04-28 17:21:411.什么是TLS SSL 是“Secure Sockets Layer”的缩写,中文叫做“安全套接层”。它是在上世纪90年代中期,由网景公司设计的。(顺便插一句,网景公司不光发明了 SSL,还发明了很多 Web 的基础设施——比如“CSS 样式... -
生成证书:在不到一分钟的时间内生成自签名SSLTLS证书。 使用ECDSA证书(比RSA更安全)。 支持Windows,...
2021-02-17 07:48:19这是什么? 这是一个Windows / Linux / Mac应用程序,可生成包括根CA证书在内的自签名SSL / TLS证书。 文件创建 选项#1-1证书: 选项#2-2个证书: 为什么要使用生成证书? 使用该程序只需1分钟,而输入和调整... -
密码套件:密码,算法和协商安全设置(二)
2020-11-19 15:41:42上篇博客我们分析了什么是密码套件以及它的背景,从算法和密钥、再到数学原理等方面进行详细地探讨,小编我都感觉非常精彩。那么这一期必须精彩继续,让我们接着深入地研究TLS 1.2密码套件的四个不同组件。但是首先... -
密码套件:密码,算法和协商安全设置(一)
2020-11-17 15:48:32那么,什么是密码套件? 密码是一种算法,密码算法是密码协议的基础,用于加密和解密的数学函数。更具体地说,密码算法是执行密码功能的一组步骤-可以是加密,解密或数字签名。 随着科技的迅猛发展,密码变得更加... -
关闭ssl重协商功能_密码套件:密码,算法和协商安全设置(一)
2020-12-08 12:49:31什么是电子签章?如果我们在与SSL / TLS和HTTPS加密的交互时间足够长,那么我们将会遇到“密码套件”这一个词组。听起来像一个某种服务套餐,但确实密码套件在我们通过Internet建立的每个HTTPS连接中都起着至关重要... -
Fiddler抓取https设置及其原理
2018-02-02 15:51:00Fiddler抓取https设置...数字签名是什么? 1 HTTPS握手过程 HTTPS 并非是应用层的一种新协议。只是 HTTP 通信接口部分用 SSL (安全套接字层)和TLS (安全传输层协议)代替而已。即添加了加密及认证机制的 HTT... -
Cluster Setup - Secure Ingress--安全入口
2021-03-12 21:44:17前言 ingress objects with security ... 什么是入口 setup an ingress with services 使用服务设置入口 secure an ingress with tls 使用tls保护入口 参见官方文档 https://kubernetes.io/docs/concepts/services-ne -
UNIX系统安全工具
2011-10-21 18:52:152.3.1 为什么要有安全策略 18 2.3.2 好的安全策略具有的特征 18 2.4 一个UNIX安全模型 18 2.5 用户培训 20 2.5.1 公布策略 20 2.5.2 了解社会工程 20 2.6 道德观念 21 第3章 帐号安全基础 24 3.1 为什么要求帐号安全... -
Excel打开超链接 提示无法下载您要求的信息的解决办法
2019-03-15 10:29:50试了网上的方法,什么修改注册表,设置word值为1的,都不行。 然后想到可能是IE的问题,因为IE...这可能是因为该站点使用过期的或不安全的 TLS 安全设置。如果这种情况持续发生,请与网站的所有者联系。 TLS 安全... -
qpython终端怎么使用_ATX-uiautomator2 使用 QPython 在 Android 手机内执行自动化 -及wsl安装使用【未成功...
2020-12-05 01:53:16吐槽一下,明明github已经是微软的了,为什么用微软的edge去访问就显示“无法安全地连接到此页面 这可能是因为该站点使用过期的或不安全的 TLS 安全设置。如果这种情况持续发生,请与网站的所有者联系。” 相关设置... -
andeoid4.x强制使用TLSv1.2
2016-09-22 11:53:27最近做安全性比较高的项目,上级最近出台新规要求必须Https+TLSv1.2, 由于android20才开始默认使用TLS1.2,4..0-5.0一下默认的都是TLS1.0, ...首先明确一点要限制TLS版本需要设置的是什么,是SSLSocket; 第二 -
docker-socket-proxy:通过您的Docker套接字代理以限制其接受的请求-源码
2021-02-01 17:18:45该映像不包括TLS支持,仅是主机Docker Unix套接字的普通HTTP代理(即使您为主机配置了TLS保护,该TLS也不受TLS保护)。 这是设计使然,因为您应该限制通过Docker的内置防火墙对其的访问。 您正在使用的API版本,... -
hershell:多平台反向shell生成器-源码
2021-02-05 15:50:16它使用TLS来保护通信安全,并提供证书公钥指纹固定功能,以防止流量拦截。 支持的操作系统是: 视窗 Linux 苹果系统 FreeBSD及其衍生版本 为什么呢 尽管抄表器有效载荷很棒,但有时会被AV产品发现。 该项目的... -
windows 7打开某个网址,提示无法显示该网页,其他浏览器又能正常打开
2020-10-16 10:26:031、首先点开更多信息看下具体是什么问题,对应会给出解决方法,前面有尝试重置Internet Explorer设置,清空cookie历史记录,cmd--ipconfig/flushdns 清空dns缓存无果,小编遇到是因为IE浏览器某个协议没开启,打开... -
v0.7 bug report
2020-12-01 17:38:13自订了比较安全的TLS v1.2 / v1.3 ciphers <p>"cipher":"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", ... -
免费的 FileZilla 中文版
2019-05-13 14:20:34无需猜测文件名是什么!只需指定一组文件扩展名,即可轻松设置 Office 文档以进行更新,或执行所有 PHP 或 HTML 文件的预定更新。 使用文件名掩码进行批处理允许您灵活地调整要传输的文件列表。与内置调度程序相... -
微软技术丛书: Windows核心编程 第5版 [美] Jeffrey Richter 等 著 - 周靖 等 译(2008.9出版, PDF格式, 附...
2019-07-22 11:40:4618.2 为什么要创建额外的堆 18.2.1 对组件进行保护 18.2.2 更有效的内存管理 18.2.3 使内存访问局部化 18.2.4 避免线程同步的开销 18.2.5 快速释放 18.3 如何创建额外的堆 18.3.1 从堆中分配内存块 18.3.2 调整内存... -
-
尹成Python27天入门到项目实战
2020-12-05 17:04:22综合实战播放音乐设置背景鬼程序协程简介协程传递数据wmv协程编号协程生产者消费者模式office自动化操作wordoffice办公自动化操作exceloffice办公自动化操作outlookoffice办公自动化access开发环境配置访问mdb格式...