现在我们每天都离不开网络,计算机之间的通信安全是怎么保证的。在这篇文章中,将介绍TLS技术是怎么为安全的通信保驾护航的。
为了能够使理论知识更够通俗易懂,在此,设计一个场景。小明和小花早恋,他们常通过鸿雁传书进行书信往来。
最初,小明将写好的书信通过信鸽传给小花,常常会发生信件被双方拆看的情况,年轻总是羞羞哒的,为了改变这种局面,小明想了一个办法,既然传明文不安全,那就加密呗,这个还显得有些小浪漫。这时引出了本文的第一个知识点,对称加密。原理很简单,用公式表示:
小明 `: C = E(M, K)`
小花 `: M = D(C, K)`
小明每次通信前先通过信鸽将密钥通过信鸽传给小花,然后再传信内容,通过该机制,交流了一段时间,发现通信内容还是会泄露。也就是说,这种机制也存在不安全的性。有问题就要解决,小明从书里知道了现在有一种新的加密技术,非对称加密技术。生成一组密码对,公钥key1和私钥key2.私钥加密过的内容只能用公钥来解密。用公式表示:
`小明` `: C = E(M, K1)`
`小花` `: M = D(C, K2)`
采用了该加密机制后,有一天,小明收到小花的分手信,这个让小明颓废了好久,二人的关系变得很紧张,最后才知道,是一个小王的家伙也喜欢小花,通信内容被他截获了,伪造小花的信件。这种方式也存在巨大的不安全性。这个最大的问题,就是对公钥的信息无法身份认证。
那么对传送的公钥做数字签名形成证书,然后验证该证书中的签名信息
机制流程:
小花:CSR = 小花公钥+小花域名
signature = E(CSR, 小亮的私钥)
CRT = CSR + signature
小明找小花通信时,先获取小花通过小亮签发的证书,小明这里存放着小亮的公钥,小明通过该公钥对签名信息进行验证,验证通过后,说明小红的公钥是信任的。
这种机制的前提是,必须要绝对的信任CA的公钥。可见,安全是建立在信任的基础之上。没有了信任也就没有了安全,我们在建立一套安全体系时,首先要考虑那些是可信的,那些是不可信的。
现在的https之所以可以能够正常运转,是建立在操作系统和浏览器对根证书信任的基础上,它们集成了根证书的公钥,这样就建立起了信任链。
以上内容,我们建立起了整个安全通信的理论体系。接下来,我们通过openssl,进行实践。
openSSL 是一个关于网络通信安全方面的一个工具,功能比较强大
使用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, 集群系统中都有着它的身影,它提供了一种安全的传输方式。有的只验证一方,有的需要做双方验证。在做系统间通信时,为了保证通信的安全性,这种机制在系用设计不可却少。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。