把有道云笔记中的笔记搬运过来golang
最近简单学习了HTTPS,并在golang中实践了一下,如今把学到的知识记录下来。算法
一些简单的概念,能够自行百度百科chrome
客户端和服务器通讯时两者须要的数据:浏览器
客户端和服务器通讯的流程:安全
在golang中的使用:服务器
首先咱们要有一个服务于https的服务端,经过golang的http包,很简单的就能完成https服务端的构建学习
func main() { http.HandleFunc("/test", func(writer http.ResponseWriter, request *http.Request) { defer request.Body.Close() writer.Write([]byte("hello world")) }) if err := http.ListenAndServeTLS(":8080", certPath, keyPath, nil); err != nil { panic(err) } }
certPath和keyPath分别是服务端证书和服务端私钥的路径,在这里我用openssl生成了一个CA根证书,用这个CA根证书签发了服务器证书。大数据
而后我将我用openssl生成的CA根证书导入浏览器中并信任该CA,而后重启chrome(不要随便导入未知的CA根证书,这很危险)加密
而后咱们经过浏览器访问https://localhost:8080/testspa
ok,已经能够正常通讯了。
若是没有把根证书导入到咱们的电脑中并设置信任会怎么样呢?下面我将根证书设为不信任。
再次访问https://localhost:8080/test
浏览器会提示你这个连接不是安全的https连接
数据摘要:将数据作hash以后获得的就是数据摘要。经常使用的算法有md5,sha1等等。
签名:签名就是用私钥对数据摘要进行加密,这个操做就叫作签名。
签名解决的问题:在非对称加密中,加密公钥是公开的,AB两个终端创建链接,发送的公钥可能会被其余人获取到,这我的获取到公钥后可能会假装成AB其中一人向另外一我的发送加密后的请求。为了防止有人冒充,引入了签名的机制来验证发送人是否合法。
签名验证问题:在非对称加密中,公钥用于数据加密,私钥用于数据解密,私钥也能够用于对数据签名,用公钥来验证签名。
签名验证的流程:非对称加密中,A要向B传送密文,B要验证接收到的数据是不是A发送的,因此A须要在向B发送密文数据时一块儿发送一个签名。首先将要发送的数据明文作hash,获得数据摘要,再用私钥加密数据摘要,生成签名,将签名和已加密的密文,一块儿发送给B,B拿到密文和签名后,用私钥对密文进行解密,解密后得到明文,对明文作hash生成数据摘要,B将A发送来的签名用A的公钥进行解密,解密后得到的数据摘要和B本身生成的数据摘要作比对,若是相同就是没有被篡改过的数据。