https 原理与实践

这篇具有很好参考价值的文章主要介绍了https 原理与实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

https 原理与实践

经典三问,是什么,为什么,怎么做?

是什么

是一种http的安全协议,在tcp ip网络模型里,http应用层是在tcp 传输层之上的,https协议规定了在tcp传输层之上还有一层tls/ssl层,这一层对http应用层发出去和接收的报文做加密和解密。 https 原理与实践

为什么

出现https原因,在我看来有两点

1,因为http是明文传输,极不安全,需要对报文进行加密。

2,我们无法确认浏览的网站的身份信息,如果是钓鱼网站,诱使我们输入银行账号密码之类的就麻烦了。

怎么做

简而言之,「https规定了 加密算法对报文进行加密,解决明文传输的问题。采用数字证书的方式解决对服务端的身份认证问题」

加密报文方式

对称加密和非对称加密

对称加密是加密和解密都采用同一个密钥。 非对称加密 将密钥分为公钥和私钥, 公钥进行加密的报文,用私钥可以解密。私钥加密的报文,用公钥可以解密(这种加密方式也是数字证书采用的原理)

一般对称加密会比非对称加密性能高几个数量级。但是就安全性而言,非对称加密安全性会更高,那么https采用的是什么加密方式呢?

两者结合的加密方式

由于对称加密性能更好,所以https在真正加密报文时还是采用的对称加密方式,但是对称加密的密钥是通过非对称加密协商后传给对方的。这样的加密方式就能保证在性能更好的前提下也有不错的安全性。

数字证书原理以及应用

数字证书是什么

数字证书 是一个可信组织验证和签发的识别信息。有点类似于现实生活中的身份证,公安机关给我们颁发身份证为的就是证明个人身份,而在网络世界里,这个组织就是ca组织。

来看看向ca组织提交注册信息以及验证数字证书的过程。

https 原理与实践

go语言精进之路截图

server.key是网站拥有的自己的私钥,ca.key是ca的私钥,server.crt是网站的数字证书。

1,首先网站服务将自身的一些基本信息通过自身的私钥进行加密,然后将自身的公钥和基本信息密文通过证书签名请求的格式传递给ca。 2,ca得到请求后,利用网站服务的公钥,对其基本信息进行解密。然后再按x509数字证书规范生成公钥证书。

这里涉及到ca对证书信息的加密方式,前面提到用私钥加密的数据,可用公钥解密,当将证书信息通过私钥加密后,客户端就能通过ca的公钥去解密证书,能成功解密,说明证书的确是ca颁发的。

但实际加密却不是这样,因为非对称加密算法 加密的信息越多性能越差,所以是将证书信息通过摘要算法生成固定长度的字符后,再采用ca私钥对其摘要进行加密。 摘要算法(常见的如MD5,sha)确保了数据的完整性,因为多次相同内容的数据用相同摘要算法计算的结果一致,所以能基本保证数据未被篡改。

3,x509数字证书里面包含 以下信息: 服务端公钥(server.pub); 证书相关属性信息,如域名、有效期等; 证书颁发机构的签名信息 4,然后就是客户端的解密过程,拿到证书以后,通过ca公钥对证书以及公钥信息的摘要密文进行解密,得到消息摘要,然后用摘要算法对证书信息以及公钥信息进行摘要计算,将客户端得到的摘要和密文解密后的摘要进行对比,如果相同,说明内容未被篡改,证书有效。

数字证书的加密算法总结

通过私钥加密,公钥解密的方式提供证书的颁发证明,能成功解密说明证书的确是ca颁发的。 通过摘要算法,确保了证书的完整性,未被篡改的证明。

https握手过程简析

建立在https要解决什么问题的基础上,理解https的握手过程,看看它究竟做了什么设计,让握手过程更高效,更安全。

https是为了解决明文传输的不安全性,以及对端身份认证的问题。 https 原理与实践

1,客户端发送client hello信息将自身支持的tls版本,密码套件的信息传给服务端。

2,服务端接收后会发送server hello信息 选择tls版本和加密算法发给客户端。

3,然后服务端发送server certificate 信息将自身的证书下发给客户端。

4,然后服务端接着又发送密钥协商请求 server key exchange, 在密钥协商环节,通常会使用到Diffie-Hellman(DH)密钥交换算法,这是一种密钥协商的协议,支持通信双方在不安全的通道上生成对称加密算法所需的共享密钥。注意这种交换算法使用的目的是既让通信双方都拥有一样的密钥,但是呢,密钥又不是通过数据传输到对面的,是协商产生的。

5 接着客户端收到证书后,先检验证书的有效性, 然后客户端生成接下来加密通信的密钥,同时将生成密钥的一些参数 用服务端的公钥加密后 发送给 服务端,这个阶段称为client key exchange阶段,服务端收到后按这些参数后用自身的私钥解密 然后也生成相同密钥。

6,最后客户端和服务端分别会将连接至今的所有报文进行加密发送给对方,以验证tls握手成功。

golang声明https服务器

懂了交互逻辑以后,就知道了,声明一个https服务的时候,得有一个ca颁发的证书,证书里面包含服务端自身的公钥信息和一些基本信息,然后还得指明明服务器的私钥,用于tls握手过程中对密钥协商参数的加解密。

package main

import (
    // "fmt"
    // "io"
    "net/http"
    "log"
)

func HelloServer(w http.ResponseWriter, req *http.Request) {
    w.Header().Set("Content-Type", "text/plain")
    w.Write([]byte("This is an example server.\n"))
    // fmt.Fprintf(w, "This is an example server.\n")
    // io.WriteString(w, "This is an example server.\n")
}

func main() {
    http.HandleFunc("/hello", HelloServer)
    err := http.ListenAndServeTLS(":443", "server.crt", "server.key", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

基于上述https原理,下面我将会用openssl 工具以及golang程序来演示下https加解密过程。

生成服务器私钥

openssl genrsa -out server.key 2048

生成x509证书

openssl req -new -x509  -key server.key -out server.crt -days 3650

server.crt 就是我们的自签名证书了,然后启动go https服务

启动go https服务

package main

import (
 "log"
 // "fmt"
 // "io"
 "net/http"
)

func HelloServer(w http.ResponseWriter, req *http.Request) {
 w.Header().Set("Content-Type", "text/plain")
 w.Write([]byte("This is an example server.\n"))
 // fmt.Fprintf(w, "This is an example server.\n")
 // io.WriteString(w, "This is an example server.\n")
}

func main() {
 http.HandleFunc("/hello", HelloServer)
 err := http.ListenAndServeTLS(":443", "server.crt", "server.key", nil)
 if err != nil {
  log.Fatal("ListenAndServe: ", err)
 }
}

先测试下访问

(base) ➜  ~ curl https://proxy.example.com:443/hello
curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.se/docs/sslcerts.html

curl 提示是自签名证书,因为我们使用的openssl 按x509标准生成的证书,不是ca颁发的,所以curl有这个错误。

让系统信任该证书

不同操作系统添加信任的方式不同,我使用的是mac os,在钥匙串应用里将证书添加进来并设置为信任。 https 原理与实践 注意这里我设置了证书的域名是proxy.example.com ,所以我还需要设置下这个域名对应的ip

设置域名

vim /etc/hosts

255.255.255.255 broadcasthost
127.0.0.1       localhost
::1             localhost

## 添加上这行
127.0.0.1 proxy.example.com

再次访问

(base) ➜  ~ curl https://proxy.example.com:443/hello
This is an example server.

发现当前访问已经成功了。

完美收工。。。

参考文献: go 语言精进之路文章来源地址https://www.toymoban.com/news/detail-459833.html

到了这里,关于https 原理与实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 灵魂三问之稳定性摸排

    前言 在之前写了篇文章《上线十年,81万行Java代码的老系统如何重构》,在文章后有同学留言问“ 这么复杂的改动,质量是如何应对的 ”,是一个特别好的问题,当时只是从现有的一些监控、测试、卡口手段上进行了回答。但在回答过程当中就在思考一个问题,交接过来的

    2024年02月08日
    浏览(48)
  • 故障复盘的黄金三问与判定三原则

    一条很重要的经验和观点,甚至是颠覆你对故障根因认知的观点: 故障根因不止一个 ,与其争论根因是什么,不如一起看看引起故障的原因都有哪些,是不是都有改进的空间。 所有导致故障和衍生故障发生、业务恢复过程中耗时较长、以及做出错误决策的原因和环节都提炼

    2023年04月27日
    浏览(26)
  • Go1.19 排序算法设计实践 经典排序算法对比

    抖音直播排行榜功能 案例 规则:某个时间段内,直播间礼物数TOP10房间获得奖励,需要在每个房间展示排行榜解决方案 •礼物数量存储在Redis-zset中,使用skiplist使得元素整体有序 •使用Redis集群,避免单机压力过大,使用主从算法、分片算法 •保证集群原信息的稳定,使用

    2024年02月11日
    浏览(34)
  • Https、Wss加密实践

    Websocket是基于Http的一种长连接方案,一些简单的IM产品会基于Websocket实现 但是如果聊天的内容比较敏感,比如在Websocket通道中聊天内容如果涉及到卡密、金钱等信息,那一定要对Websocket的传输进行保护。 https或者wss是最基本的防嗅探和传输加密方式,这里演示下如何配置ws

    2024年02月10日
    浏览(29)
  • Nginx HTTPS实践

    2024年02月11日
    浏览(25)
  • 测试工程师:“ 这锅我不背 ” ,面对灵魂三问,如何回怼?

    在一个周末的早餐我被同事小周叫出去跑步,本想睡个懒觉,但是看他情绪不太稳定的样子,无奈艰难爬起陪他去跑步。 只见她气冲冲的对着河边大喊:真是冤枉啊!!! 原来是在工作中被莫名其妙背锅,见她又气氛又不能“伸冤”的样子,真是无比心疼。 产品出了问题,谁

    2023年04月18日
    浏览(35)
  • 经典软件工程复兴?大模型驱动的软件工程实践标准化

    简单来说,本文探讨了大模型驱动的软件工程实践标准化,以及如何将需求和设计规范化为 DSL 格式。通过这种方式,可以让 AI 更自动化、高效地编写代码。 随着大语言模型在软件开发中的应用越来越广泛,传统的软件工程实践开始被重新关注和提及。在诸如于编写清晰的文

    2024年02月12日
    浏览(38)
  • 微机原理 || 8253 芯片 (详细讲解 + 经典例题)

    一点点看!一定可以看懂!考试没有问题的!加油💪 前面知识写的详细,看不懂可以先看 典例 ,回头来梳理就明白了【典例就是常考的题】 目录 Part 1: 芯片知识总结  (一)8253 芯片特点 (二) 8253芯片引脚功能      知道才好编程 (三) 8253编程 (1)8253 初始化 ① 工

    2024年02月01日
    浏览(51)
  • Java中实现HTTPS连接的最佳实践

    引言 大家好!我是小黑。今天咱们来聊聊一个既热门又实用的话题:在Java中如何实现HTTPS连接。现在的网络世界,安全性是大家都非常关注的问题,特别是对于咱们这些程序员来说,更是如此。想想看,如果你的网站或应用数据泄露了,那得有多严重!所以,理解并实现HT

    2024年02月02日
    浏览(33)
  • go入门实践五-实现一个https服务

    在公网中,我想加密传输的数据。(1)很自然,我想到了把数据放到http的请求中,然后通过tls确保数据安全。(2)更进一步,只要数据可以解析,则无需http协议,直接通过tls协议加密传输即可。本文分别尝试了这两个方案。 尝试实现方案之前,我们考虑需要实现哪些内容。(1)如

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包