前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >安全通信TLS介绍

安全通信TLS介绍

原创
作者头像
暮雨
修改2018-10-12 21:07:47
1.8K2
修改2018-10-12 21:07:47
举报
文章被收录于专栏:云端漫步云端漫步

理论基础

现在我们每天都离不开网络,计算机之间的通信安全是怎么保证的。在这篇文章中,将介绍TLS技术是怎么为安全的通信保驾护航的。

为了能够使理论知识更够通俗易懂,在此,设计一个场景。小明和小花早恋,他们常通过鸿雁传书进行书信往来。

最初,小明将写好的书信通过信鸽传给小花,常常会发生信件被双方拆看的情况,年轻总是羞羞哒的,为了改变这种局面,小明想了一个办法,既然传明文不安全,那就加密呗,这个还显得有些小浪漫。这时引出了本文的第一个知识点,对称加密。原理很简单,用公式表示:

代码语言:txt
复制
小明 `: C = E(M, K)`

小花 `: M = D(C, K)`

小明每次通信前先通过信鸽将密钥通过信鸽传给小花,然后再传信内容,通过该机制,交流了一段时间,发现通信内容还是会泄露。也就是说,这种机制也存在不安全的性。有问题就要解决,小明从书里知道了现在有一种新的加密技术,非对称加密技术。生成一组密码对,公钥key1和私钥key2.私钥加密过的内容只能用公钥来解密。用公式表示:

代码语言:txt
复制
`小明` `: C = E(M, K1)`

`小花` `: M = D(C, K2)`

采用了该加密机制后,有一天,小明收到小花的分手信,这个让小明颓废了好久,二人的关系变得很紧张,最后才知道,是一个小王的家伙也喜欢小花,通信内容被他截获了,伪造小花的信件。这种方式也存在巨大的不安全性。这个最大的问题,就是对公钥的信息无法身份认证。

那么对传送的公钥做数字签名形成证书,然后验证该证书中的签名信息

机制流程:

  1. 小花把自己的公钥和域名做为身份证申请(certificate signing request,CSR)
  2. 小花把CSR发给一个德高望重的人(被称为 certificate authority,CA),比如小亮,
  3. 小亮用自己的私钥加密小红的 CSR,得到的密文被称为数字签名(digital signature)
  4. 小亮把 signature 和 CSR 的明文合在一起称为 CA签署的身份证(CA signed certificate,CRT),发给小红
代码语言:txt
复制
小花:CSR = 小花公钥+小花域名
     signature = E(CSR, 小亮的私钥)
     CRT = CSR + signature

小明找小花通信时,先获取小花通过小亮签发的证书,小明这里存放着小亮的公钥,小明通过该公钥对签名信息进行验证,验证通过后,说明小红的公钥是信任的。

这种机制的前提是,必须要绝对的信任CA的公钥。可见,安全是建立在信任的基础之上。没有了信任也就没有了安全,我们在建立一套安全体系时,首先要考虑那些是可信的,那些是不可信的。

现在的https之所以可以能够正常运转,是建立在操作系统和浏览器对根证书信任的基础上,它们集成了根证书的公钥,这样就建立起了信任链。

以上内容,我们建立起了整个安全通信的理论体系。接下来,我们通过openssl,进行实践。

操作实践

openSSL 是一个关于网络通信安全方面的一个工具,功能比较强大

  • 生成公钥私钥openssl genrsa -out server.key 2048
  • 生成CSRopenssl req -nodes -new -key server.key -subj "/CN=localhost" -out server.csr
  • 签署身份openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt以上是一种自签名的方式,签名的证书和csr中的公钥相同

测试

使用go语言编写一个https的服务

代码语言:txt
复制
package main
 import (
     "io"
     "log"
     "net/http"
 )
 func main() {
     http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
         io.WriteString(w, "hello, world!\n")
     })
     if e := http.ListenAndServeTLS(":443", "server.crt", "server.key", nil); e != nil {
         log.Fatal("ListenAndServe: ", e)
     }
 }

浏览器中没有添加签名证书的公钥,会导致不信任,可以加公钥加入到浏览器中,就可以访问了。

curl工具访问

代码语言:txt
复制
$ curl --cacert server.crt https://localhost

如果没有可以通过openssl向服务端要一个

代码语言:txt
复制
openssl s_client -showcerts -connect localhost:443 > cacert.pem
curl --cacert cacert.pem https://localhost

总结

tls不仅仅用于https,在现在的docker, 集群系统中都有着它的身影,它提供了一种安全的传输方式。有的只验证一方,有的需要做双方验证。在做系统间通信时,为了保证通信的安全性,这种机制在系用设计不可却少。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 理论基础
  • 操作实践
  • 测试
  • 总结
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档