专栏首页云端漫步安全通信TLS介绍
原创

安全通信TLS介绍

理论基础

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

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

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

小明 `: C = E(M, K)`

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

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

`小明` `: 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),发给小红
小花: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的服务

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工具访问

$ curl --cacert server.crt https://localhost

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

openssl s_client -showcerts -connect localhost:443 > cacert.pem
curl --cacert cacert.pem https://localhost

总结

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ​go语言数值类型及布尔类型

    常量是程序在编译时就确定的值,程序在执行时不能修改常量的值。声明常量使用关键字const。在声明常量时,需要对常量赋值。

    暮雨
  • http server测试

    在对http服务测试时,我们可以通过两种方式来完成,一种基于http服务,一种基于自带的测试包来完成。

    暮雨
  • 数组和切片

    在上文对基本类型做了介绍,如,现在需要10个int类型的变量,安装上文中介绍,我们可以声明10个变量,那么100个呢,这样是不有些麻烦?这时数组就出现了。可以声...

    暮雨
  • 本地git创建仓库,连接码云

    https://cloud.tencent.com/developer/article/1468179

    秋雨
  • 紧急安全公告—BadTunnel漏洞修复—2016年6月20日

    6月14日,微软安全公告上发布了高危漏洞BadTunnel:CVE-2016-3213。CVE-2016-3213即Windows WPAD 特权提升漏...

    嘉为科技
  • 看完这篇垃圾回收,和面试官扯皮没问题了

    Java 相比 C/C++ 最显著的特点便是引入了自动垃圾回收 (下文统一用 GC 指代自动垃圾回收),它解决了 C/C++ 最令人头疼的内存管理问题,让程序员...

    用户5546570
  • 看完这篇垃圾回收,和面试官扯皮没问题了

    Java 相比 C/C++ 最显著的特点便是引入了自动垃圾回收 (下文统一用 GC 指代自动垃圾回收),它解决了 C/C++ 最令人头疼的内存管理问题,让程序员...

    kunge
  • CTF| 你想要的RSA解题技巧(二)

    上一期已经给大家分享了RSA的基本解题思路,总结如下,本期带来几种复杂的RSA题目解法。 ? 以上都是基本解法,基于n能够分解的前提下进行的解法,但是当题目n的...

    漏斗社区
  • 看完这篇垃圾回收,和面试官扯皮没问题了

    Java 相比 C/C++ 最显著的特点便是引入了自动垃圾回收 (下文统一用 GC 指代自动垃圾回收),它解决了 C/C++ 最令人头疼的内存管理问题,让程序员...

    Java技术江湖
  • Python-SSH日志审计

    日常开头先扯点什么,最近有本 内网安全攻防的书到了,质量确实不错,看着看着突然想了一下自己在进入内网机器后的一些信息收集的操作,然后就联想到了我服务器上的SSH...

    Elapse

扫码关注云+社区

领取腾讯云代金券