目的
熟悉openssl生成密钥和证书对,熟悉go中crypto/tls的用法

名词解释
PEM - Privacy Enhanced Mail,打开看文本格式,以”—–BEGIN…”开头, “—–END…”结尾,内容是BASE64编码. 
Apache和*NIX服务器偏向于使用这种编码格式.
查看PEM格式证书的信息:

openssl x509 -in certificate.pem -text -noout

DER - Distinguished Encoding Rules,打开看是二进制格式,不可读. 
Java和Windows服务器偏向于使用这种编码格式.
查看DER格式证书的信息:

openssl x509 -in certificate.der -inform der -text -noout

x509 
X.509是一种非常通用的证书格式。所有的证书都符合ITU-T X.509国际标准,因此(理论上)为一种应用创建的证书可以用于任何其他符合X.509标准的应用。
x509证书一般会用到三类文,key,csr,crt。 
Key 是私用密钥openssl格式,通常是rsa算法。 
Csr 是证书请求文件,用于申请证书。在制作csr文件的时候,必须使用自己的私钥来签署它,还可以设定一个密钥。 
crt是CA认证后的证书文,(windows下面的,其实是crt),签署人用自己的key给你签署的凭证。

下面是我的实操记录

利用openssl命令行生成密钥和证书
其实我们只需要执行下面的这个命令就可以了生成证书和私钥了
openssl req -new -nodes -x509 -out server.crt -keyout server.key -days 3650 -subj "/C=DE/ST=NRW/L=Earth/O=Random Company/OU=IT/CN=www.random.com/emailAddress=tao_627@aliyun.com"

采用下面的命令可以查看PEM格式的证书信息
openssl x509 -in server.pem -text -noout

编写tls协议的服务器和客户端
将代码放到GOPATH下面的工程目录下面

服务器端代码tls_server.go

package mainimport ("bufio""crypto/tls""log""net"
)func main() {log.SetFlags(log.Lshortfile)crt, err := tls.LoadX509KeyPair("server.crt", "server.key")if err != nil {log.Println(err)return}config := &tls.Config{Certificates: []tls.Certificate{crt}}ln, err := tls.Listen("tcp", ":443", config)if err != nil {log.Println(err)return}defer ln.Close()for {conn, err := ln.Accept()if err != nil {log.Println(err)continue}//每个连接对应创建一个协程go handleConnection(conn)}
}//在每个协程中处理接收数据,和发送数据的细节,出现任何错误,立即返回
func handleConnection(conn net.Conn) {defer conn.Close()r := bufio.NewReader(conn)for {msg, err := r.ReadString('\n')if err != nil {log.Println(err)return}println(msg)n, err := conn.Write([]byte("==welcome==\n"))if err != nil {log.Println(n, err)return}}
}

客户端代码tls_client.go

package mainimport ("crypto/tls""log"
)func main() {log.SetFlags(log.Lshortfile)conf := &tls.Config{InsecureSkipVerify: false,}conn, err := tls.Dial("tcp", "127.0.0.1:443", conf)if err != nil {log.Println(err)return}defer conn.Close()n, err := conn.Write([]byte("hi, my name is tao_627\n"))if err != nil {log.Println(n, err)return}buf := make([]byte, 100)n, err = conn.Read(buf)if err != nil {log.Println(n, err)return}println(string(buf[:n]))
}

编译
逐个编译得到client和server的可执行文件tls_client和tls_server
go build tls_client.go                                                                                                                                                   
go build tls_server.go

运行
在两个终端窗口中分别执行

sudo ./tls_server

./tls_client 

注意的问题
这里编写client代码时候需要注意:InsecureSkipVerify: true 
也就是说上面的代码中客户端不对服务端的证书进行验证。 
go实现的Client端默认也是要对服务端传过来的数字证书进行校验的,但客户端提示:这个证书是由不知名CA签发的!

参考文献
[1].https://studygolang.com/articles/10776

在Ubuntu 16.04.3 TLS上玩转tls协议的简单demo相关推荐

  1. 在Ubuntu 16.04.3 LTS上玩转quic-go项目

    说明 quic-go是使用Go来重写chromium中的QUIC协议,将来计划过渡到IETF版本的QUIC协议. 目前该协议还处于不断更新和活跃之中,目前IETF版本的QUIC协议草案版本号已经到dr ...

  2. 在Ubuntu 16.04.3 LTS上玩转QUIC开源项目proto-quic

    说明 proto-quic项目是民间从chromium中抽取出的QUIC实现相关的代码.采用这个项目的代码,比从chromium源码编译,要更快速和简单.因为毕竟GFW限制,不是所有的人都可以翻墙去下 ...

  3. 在Ubuntu 16.04.6 LTS上升级python 3.5到3.7.3实录

    缘由 我想安装一个python模块you-get,发现只能使用pip3安装,但是我发现我的Ubuntu 16.04.6 LTS上有python3.5,但是没有pip3,也无法成功安装,真是要了我的老命 ...

  4. 在Ubuntu 16.04.6 LTS上安装python3.7和pip3后出现Command '('lsb_release', '-a')' 出错问题的解决方法

    在Ubuntu 16.04.6 LTS上安装python3.7和pip3后出现Command '('lsb_release', '-a')' returned non-zero exit status ...

  5. 在Ubuntu 16.04.6 LTS上升级Go到最新版1.12.5实录

    上一次我在Ubuntu 16.04.3 LTS上从源码安装了Go,当时最新的版本是1.10,参见我之前的博文 https://blog.csdn.net/tao_627/article/details ...

  6. 在Ubuntu 16.04.5 LTS上利用python中的PIL模块压缩一百多兆的单张图片实操

    在前面的博文中,我将300多张电影海报拼接为了一张103MB的巨幅图片,我想拿它做电脑桌面(1080P),但是这么多的图片,存储和加载是个麻烦事儿,需要将它压缩到几MB大小. 在Ubuntu 16.0 ...

  7. 在Ubuntu 16.04.5 LTS上升级python的pip版本实录

    在ubuntu 16.04.5 LTS上使用Python安装模块时,比较顺手的方法是使用pip命令.这次,我在安装一个模块时,老是提示下面的问题,比较不爽.所以,我就照着提示做了一遍,记录下来,以作备 ...

  8. 在Ubuntu 16.04.4 LTS上调研开源QUIC项目ngtcp2

    最近在研究QUIC协议,尝试了一些QUIC相关的开源项目,主要是c,c++,go等语言编写的.这里记录下我折腾ngtcp2的过程. 基本思路就是参照github上该项目的README来进行就可以了.由 ...

  9. 在Ubuntu 16.04.3 LTS上运行go+https+json示例

    下面是我依据网上资料的实操过程,记录以作备忘.该示例给出了https通信并处理json文件的例子. 平台:Ubuntu 16.04.3 LTS go版本:1.10 1.生成自签名的服务器端的私钥KEY ...

  10. 在Ubuntu 16.04.3 LTS上搭建QUIC交互demo

    目的 本文依据参考文献中的资料,来利用chromium源码编译出quic_server和quic_client, 并依靠它们来发送QUIC协议请求,了解QUIC交互的细节. 前提 必须能够流畅地翻墙下 ...

最新文章

  1. 如何打印Qt中的枚举所对应的字符串
  2. HPU第三次积分赛-D:Longest Increasing Subsequence(DP)
  3. python识别人脸多种属性_人脸检测及识别python实现系列(4)——卷积神经网络(CNN)入门...
  4. html制作柱状图教程,基于Echarts的HTML5 Canvas折线图柱状图DEMO演示
  5. java--自动装箱,拆箱
  6. 有趣 IOS 开展 - block 使用具体解释
  7. Ubuntu 14.04中修复默认启用HDMI后没有声音的问题
  8. ndarray python 映射_191123 使用 Pybind11 和 OpenCV 创建 Python 库
  9. C# 连蒙带骗不知所以然的搞定USB下位机读写
  10. 触动精灵mysql用法_[触动精灵]触动精灵官方手册流水账2
  11. UVA10267 Graphical Editor【模拟】
  12. XP cmd命令 部分
  13. php fpm过多,Linux下php-fpm进程过多导致内存耗尽问题解决
  14. Atitit 字符串转换数组main参数解析 args splitByWholeSeparator String string= -host 101.1 8*124 -db 1
  15. linux系统,清理缓冲池内存
  16. ssdt函数索引号_shadow ssdt 服务表函数索引
  17. SQLyog 报错2058 :连接 mysql 8.0.11 解决方法
  18. inno setup使用1 记录一下相关参数
  19. 【学习笔记】山东大学生物信息学-01 生物数据库
  20. Modelsim软件仿真出错:Modelsim is exiting with code 7.

热门文章

  1. Go 学习笔记(5)— 算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、取地址和指针运算符
  2. Strusts2笔记7--国际化
  3. 操作系统--内存管理方式
  4. sqlserver查询一个表的字段信息
  5. 35个必备的wordpress插件
  6. portal认证 php,配置外置Portal认证示例(命令行)
  7. android receiver 通知,android – 来自BroadcastReceiver的呼叫通知
  8. php+rsa生成签名sign,PHP 做 RSA 签名 生成订单(支付宝例子)
  9. python运行不了control+shift+i_Python不支持 i ++ 语法的原因解析
  10. 怎么从华为nova4导入计算机,手机知识:华为nova4怎么导出联系人