• Golang之双向认证


    此篇文章主要介绍https用Golang生成证书和Golang实现https认证的过程,至于ssl/tls相关的知识点,我在文章末尾会附上我个人觉得对读者有用的文章。

    单向验证过程:
    客户点包含ca.crt,服务端包含server.key和server.crt;

    客户端:客户端生成一个随机数random-client,传到服务器端;

    服务端:服务器端接收消息之后,生成一个随机数random-server和包含公钥的证书,一起回馈给客户端;

    客户端:客户端收到的东西原封不动,加上premaster secret(通过random-client、random-server 经过一定算法生成的数据),再一次送给服务器端,这次传过去的东西是经过服务端的公钥进行加密后数据;

    服务端:服务端经过私钥(server.key),进行解密,获取 premaster secret(协商密钥过程);

    此时客户端和服务器端都拥有了三个要素:random-client、random-server和premaster secret,安全通道已经建立,以后的交流都会校检上面的三个要素通过算法算出的session key;而双向认证过程相当于客户端和服务端反过来再执行认证、加解密、协商一遍。

    证书生成方式:

    1. openssl工具生成:

    第一步,生成ca密钥和ca证书

    openssl genrsa -out ca.key 2048

    添加 -subj 是为了省去创建请求之后的交互

    openssl req -new nodes -key ca.key -subj “//CN=nzh.com” -days 5000 -out ca.crt

    第二步,生成server密钥和证书

    openssl genrsa -out server.key 2048

    //CN必须添加,服务端的域名,或者hosts文件中ip的别名,等同于localhost

    openssl req -new -key server.key -subj “//CN=server” -out server.csr

    openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 5000

    第三步,生成client密钥和证书

    openssl genrsa -out client.key 2048

    openssl req -new -key server.key -subj “//CN=client” -out client.csr

    echo extendedkeyUsage=clientAuth > ./extfile.cnf

    openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile ./extfile.cnf -out client.crt -days 5000

    1. Golang代码生成:

    第一步,生成证书之前,先构造出证书结构体,并初始化相应的参数;

    构造证书请求结构体
    第二步,进行证书签名,如果不是CA证书,则加载待签名的证书;

    加载待签名证书
    第三步,进行证书签名,图中46行和49行主要区别生成CA自签名证书还是生成CA证书签名;

    证书签名过程
    最后生成证书目录结构如下:

    证书目录结构
    Golang代码实现双向认证过程:
    服务器端:

    双向认证过程中,只要结构体实现了ServeHTTP结构就相当于实现一个handler;

    加载服务端的公钥和私钥用于解密客户端发送过来的随机字符;

    加载CA证书是为了验证客户端的证书是否合格;

    服务端代码
    客户端:

    客户端公钥,私钥和CA证书处理等同于服务端证书处理,然后发送请求,打印返回值;

    客户端代码
    后续会继续补充curl命令以及整个实现源码。

    作者:取个帅气的昵称华华
    链接:https://www.jianshu.com/p/14fbf585b0d3
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    【IT面试新理解】
    抖音播映量破500的原因找到了,不是内容不好,而是这5个功能
    socket编程-----常用socket编程函数
    万万没想到,我用文心一言开发了一个儿童小玩具
    窄边极简折叠玻璃门,实现自由推拉及折叠,遥控随意切换透明与磨砂效果
    以高字节地址为字地址是什么
    金仓数据库KingbaseES客户端编程开发框架-Hibernate(5. Hibernate注意事项)
    数据库大咖,带你深入高性能MySQL架构系统,值得一看
    blender 快捷键记录
    【Spark的五种Join策略解析】
  • 原文地址:https://blog.csdn.net/shelutai/article/details/134050923