经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
创建并使用https证书
来源:cnblogs  作者:janbar  时间:2021/1/25 11:15:59  对本文有异议

前言

https要比http更安全些,因此可以配置Nginx服务器使用证书,客户端就会去第三方平台校验证书。
但是我们自己的服务器和客户端只是想要加个密而已,也没必要跑去第三方平台校验证书,省钱方便。
因此研究了一下生成证书和使用证书的笔记。

产生证书

网上很多都是用openssl命令行去产生,有点麻烦,主要是不想记一堆命令,因此找到一个非常简单的项目。
项目地址:https://github.com/michaelklishin/tls-gen,需要环境有python3、openssl、make这三个工具。
使用方法cd tls-gen/basic & make CN=www.janbar.com,这样客户端必须用该域名进行访问,并且要带上对应证书。
最终产生如下三个文件,testca/cacert.pem是客户端使用,server/cert.pem,server/key.pem是服务器使用。

  1. testca/
  2. cacert.pem
  3. server/
  4. cert.pem
  5. key.pem

记得在c:\Windows\System32\drivers\etc\hosts增加127.0.0.1 www.janbar.com,准备证书源码文件cert.go,内容如下:

  1. var (
  2. certPEMBlock = []byte(`-----BEGIN CERTIFICATE-----
  3. MIIDfjCCAmagAwIBAgIBATANBgkqhkiG9w0BAQsFADAxMSAwHgYDVQQDDBdUTFNH
  4. ZW5TZWxmU2lnbmVkdFJvb3RDQTENMAsGA1UEBwwEJCQkJDAeFw0yMTAxMjExMDEx
  5. MjJaFw0zMTAxMTkxMDExMjJaMCoxFzAVBgNVBAMMDnd3dy5qYW5iYXIuY29tMQ8w
  6. DQYDVQQKDAZzZXJ2ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDj
  7. pGglwTB/B1N07ZhwaP3erxDZDYhtDqir7fiuZQxgmWzQ5UeU7gp5ntu8bLXpFmVS
  8. s7si0WyOKbGoPi8Q/cvkZix3zkClAvS7vM2zW+0qa3Fp4dYRg42cjYAgenfpC0M5
  9. fKHhnBKjzWFOiTOyJIPcNpvhAcV9dvQIdgX64g/+M2J3pMK2+tU5Z49Nc1KqyUS/
  10. /zFo4C+HAk7Wbkc3Kgx8t4OZo0ddTdmLsPfRIU3hxqehRxhk7OccHBBb6JOVSF21
  11. 3h6kWwauN9djiOixpsS3jr1SVEGrhZk6zaOtZ+MSOg410pr3u79kdIuCYGNhvdDW
  12. soyNBNCFGOP/kj7dO5p/AgMBAAGjgacwgaQwCQYDVR0TBAIwADALBgNVHQ8EBAMC
  13. BaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwNQYDVR0RBC4wLIIOd3d3LmphbmJhci5j
  14. b22CD0RFU0tUT1AtQ1YxUUhPRIIJbG9jYWxob3N0MB0GA1UdDgQWBBSUjXz9K9NO
  15. tJJs+YXHVBUBG5RPEzAfBgNVHSMEGDAWgBRFxl2tSPMYhPZ+Pf6O1HiZ65yJzzAN
  16. BgkqhkiG9w0BAQsFAAOCAQEALxVtveN3LI1vi4uiaId6O87OjirugSD1xSkD7MFj
  17. aBb2u0+a/ziiNXeLCtxNxSb7HTknd/6SuTdgHzq1sCczk0BcV3FfEjNw3Y4sz9JO
  18. 0CBFnpgIvqFoA+rJEIiUwhyOkCh/aIVT8VMGm3gAHAeMhrYd4iF590+P1vgXTrvr
  19. 6T3FKojng3IgXxYzVUcia/UNEfY8U6f6yThC22kcThK/OeywpLB+NCm9/wt7sQUZ
  20. T8BEfhz0AKHFIih8wq5DD87Vc6fHkUBX6NBKmstm5X5smQTjJGd985fx1Rdka5ro
  21. o0IH6DYd8PjN0asvEb1RG5viSpcpXc5IFh7mNzmxaA7Ygw==
  22. -----END CERTIFICATE-----`)
  23. keyPEMBlock = []byte(`-----BEGIN PRIVATE KEY-----
  24. MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDjpGglwTB/B1N0
  25. 7ZhwaP3erxDZDYhtDqir7fiuZQxgmWzQ5UeU7gp5ntu8bLXpFmVSs7si0WyOKbGo
  26. Pi8Q/cvkZix3zkClAvS7vM2zW+0qa3Fp4dYRg42cjYAgenfpC0M5fKHhnBKjzWFO
  27. iTOyJIPcNpvhAcV9dvQIdgX64g/+M2J3pMK2+tU5Z49Nc1KqyUS//zFo4C+HAk7W
  28. bkc3Kgx8t4OZo0ddTdmLsPfRIU3hxqehRxhk7OccHBBb6JOVSF213h6kWwauN9dj
  29. iOixpsS3jr1SVEGrhZk6zaOtZ+MSOg410pr3u79kdIuCYGNhvdDWsoyNBNCFGOP/
  30. kj7dO5p/AgMBAAECggEAIG96j3aZbGAk2hJImCu9kI8tPWAaQj/GdMjxmBe5zcHO
  31. qW0h5+yK/Y1PDegHe3C/eys0zN8+MntqXuiNWERxWtfcGi3/NAPZzy41uQquHk80
  32. 17tf/xrZgKcAzJ/mmgQKzhQeFMFiPoizBrex7/4X87asO0E/XIMoflQiwf6X/MYc
  33. w/2ExWGoSxucsZs1J7HuBWp10G26t7yZEEFy+IjS8aleNnBm0vBgSZ2R/cqIpqTD
  34. hvfnM/Xv8ERVMlj+pzac+qzAyRJHgEkYdOzwy9+7v9bT3fv99I+jHJjo5qMu4/vM
  35. s2QMypO2ams4ClbB6bgcq1Bt8/WATXoS4hbyCNDNYQKBgQDzBnJKQ3Iqc7rqYHDY
  36. romxqwyeHsi5sCXCsA806drQBIX+n3MhJ5UcveDNW6QtNPX8/v8JWLU+yR64zatf
  37. Qz5YFBLcF2NYvkO3z5vrvCmRYZaAbmMv1I+RKTWL2UDi1JBTteTG5g9BLIPMGIuz
  38. WNVnrAG61IsHLnBzUvMuLxJn6QKBgQDvy7aW22yocsZBUlZ0bDxY7OieEQbCuafx
  39. ncbGlSRfqCkwU1MKifZHFbLlxlklr+bQJRDlN2RYtLBSKeU65PK2zm7G6hgRcBMG
  40. 52SiW59QoGmiP5DmZj4ILAV9/SmlTRsnB6q2OXdkAZ06vNI2oPMznSUiFyB2MJiH
  41. lrG0MGnWJwKBgQDt5oKdNjcdXZs9ctklFH8QYIyCgUonlErysdzBBKhB+BufrUFL
  42. 1G7A6xOUlEA8TNr9JjZNVPxgEQu1BwjawX3XRRdNQsvrBJ5P4rkU5GagvbJR2T3Z
  43. hbBg/sE/PJarNkBu4eGp325Rc501f1XKZIzL5vLujL/ocMp96lbKACR5eQKBgDTF
  44. 2WYz3iLoN3dyvnIay+EqKjt3Ncyu/SXweimD8yBWKtJm1BSyrg+Q1/E3iLEBmENg
  45. lOpNGXloMpGyhK9EaaIPplOCe0+DIbzYOc59aX9d/kFlyebaw3Ya8g57I6osYPhi
  46. +I/n772DmW2u1niNTVijkeOBwXQhV8AnSu6D5RbrAoGBAOycwo6VQGUNkwQW6e02
  47. 32TdC9C66Ky8tB/SWusu6fGD6hpHBA15T/saOuZ6WE0ir7VGyAr1P04mYebcZ31P
  48. B14WxQ1BhT6MGdd6DK+kG+gIfT38sSwy/sHIpbM+KcijmX2jJ1qf1O8TJHlvXMdx
  49. fuPIaJgJmNZtnQtAo2f+XVWp
  50. -----END PRIVATE KEY-----`)
  51. rootPEM = []byte(`-----BEGIN CERTIFICATE-----
  52. MIIDUDCCAjigAwIBAgIUI8rwLlo1JMFnSeuNOdR7qf1vkU4wDQYJKoZIhvcNAQEL
  53. BQAwMTEgMB4GA1UEAwwXVExTR2VuU2VsZlNpZ25lZHRSb290Q0ExDTALBgNVBAcM
  54. BCQkJCQwHhcNMjEwMTIxMTAxMTIyWhcNMzEwMTE5MTAxMTIyWjAxMSAwHgYDVQQD
  55. DBdUTFNHZW5TZWxmU2lnbmVkdFJvb3RDQTENMAsGA1UEBwwEJCQkJDCCASIwDQYJ
  56. KoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6NWvQP5lDgIDh5IC/BDHm1egEP3BG1
  57. Mqu0rO0505Vp5Y1/oc3OGqi3cJLcJ0JOjq4Y6pjTmqlf0zLG1LgRw96bJid0LI2O
  58. iCDHCkdu3efU3aWxXgGxRBLPe8g7JHUSoIGsERrjqxsplQ38z6n+Yzbndjixz11r
  59. MCeQXS+FZeHFdkqEiy7DDrDa1OxthH8lFjPqcxBC5Dz4OO7eNhwLtru9sMSYYvOL
  60. jO6TmpHsd6OHUDVFFfaXSxHGeRFKDm9cYqKmO4oexm4QFAtoDaWCDXcAnS8hi7ze
  61. wAGhVPTRZp/lXuCqwsAAjU40vb8Pqq5zuY05eCYINwPYY5S1OMNTfJMCAwEAAaNg
  62. MF4wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBRFxl2tSPMYhPZ+Pf6O1HiZ65yJzzAf
  63. BgNVHSMEGDAWgBRFxl2tSPMYhPZ+Pf6O1HiZ65yJzzAPBgNVHRMBAf8EBTADAQH/
  64. MA0GCSqGSIb3DQEBCwUAA4IBAQA03g3/AC3ylUjATzhxyglarRNrneZKM96KFm3c
  65. z99HzxBxX71hKBF6kV6GKdKQkl4Ocx6HLiHiIWviTFr0qNVNcafrdDwWa9dRg5da
  66. xKOOE9XoLYHWDmDaKgAIz4x5tDUDhAT4u7hkHQACz4TMlQG6L2uXPI0IiTv5185w
  67. vgNNpx2V3d9rlvq6AOWjhSrZ9rfuSnt3UbRjKmbZAGcaFb3Gqr7MdIZuYOB9CN7H
  68. o0wKNxKk00o7jav298tHinDdKvwYdAf8IgkEaHgBeFsPfNy8VGe4XWNdVT7HkzpO
  69. PHM7SBK+cEpKnylKkEdKb9ubSCe8NA4RpuKbeo36IS6Bcfmr
  70. -----END CERTIFICATE-----`)
  71. )

测试https服务器

测试代码文件test_https.go如下:

  1. package main
  2. import (
  3. "crypto/tls"
  4. "crypto/x509"
  5. "io"
  6. "net/http"
  7. "os"
  8. "time"
  9. )
  10. func main() {
  11. http.Handle("/", http.FileServer(http.Dir(".")))
  12. go func() {
  13. cf, err := tls.X509KeyPair(certPEMBlock, keyPEMBlock)
  14. if err != nil {
  15. panic(err)
  16. }
  17. err = (&http.Server{TLSConfig: &tls.Config{
  18. Certificates: []tls.Certificate{cf},
  19. }}).ListenAndServeTLS("", "")
  20. if err != nil {
  21. panic(err)
  22. }
  23. }()
  24. time.Sleep(time.Second)
  25. // 上面是http服务器的运行
  26. // 下面是http客服端访问
  27. roots := x509.NewCertPool()
  28. ok := roots.AppendCertsFromPEM(rootPEM)
  29. if !ok {
  30. panic("failed to parse root certificate")
  31. }
  32. client := &http.Client{Transport: &http.Transport{
  33. TLSClientConfig: &tls.Config{RootCAs: roots},
  34. }}
  35. req, err := http.NewRequest(http.MethodGet, "https://www.janbar.com", nil)
  36. if err != nil {
  37. panic(err)
  38. }
  39. resp, err := client.Do(req)
  40. if err != nil {
  41. panic(err)
  42. }
  43. io.Copy(os.Stdout, resp.Body)
  44. resp.Body.Close()
  45. }

执行go run test_https.go cert.go效果如下,显示了运行目录下的文件列表:

  1. <pre>
  2. <a href="test.exe">test.exe</a>
  3. <a href="test.go">test.go</a>
  4. </pre>

用tls加密tcp连接

测试代码test_tcp.go文件,源码如下:

  1. package main
  2. import (
  3. "crypto/tls"
  4. "crypto/x509"
  5. "fmt"
  6. "net"
  7. "time"
  8. )
  9. func main() {
  10. addr := "www.janbar.com:8080"
  11. go func() {
  12. err := tcpServer(addr)
  13. if err != nil {
  14. panic(err)
  15. }
  16. }()
  17. time.Sleep(time.Second)
  18. err := tcpClient(addr)
  19. if err != nil {
  20. panic(err)
  21. }
  22. }
  23. func tcpServer(addr string) error {
  24. cf, err := tls.X509KeyPair(certPEMBlock, keyPEMBlock)
  25. if err != nil {
  26. return err
  27. }
  28. s, err := tls.Listen("tcp", addr, &tls.Config{Certificates: []tls.Certificate{cf}})
  29. if err != nil {
  30. return err
  31. }
  32. defer s.Close()
  33. client := func(c net.Conn) error {
  34. tNow := time.Now().String()
  35. buf := make([]byte, len(tNow))
  36. n, err := c.Read(buf)
  37. if err != nil {
  38. return err
  39. }
  40. fmt.Printf("server [%s]\n", buf[:n])
  41. _, err = c.Write([]byte(tNow))
  42. return err
  43. }
  44. for {
  45. l, err := s.Accept()
  46. if err != nil {
  47. return err
  48. }
  49. go func(c net.Conn) {
  50. defer c.Close()
  51. if err := client(c); err != nil {
  52. fmt.Println(err)
  53. }
  54. }(l)
  55. }
  56. }
  57. func tcpClient(addr string) error {
  58. roots := x509.NewCertPool()
  59. ok := roots.AppendCertsFromPEM(rootPEM)
  60. if !ok {
  61. panic("failed to parse root certificate")
  62. }
  63. c, err := tls.Dial("tcp", addr, &tls.Config{RootCAs: roots})
  64. if err != nil {
  65. return err
  66. }
  67. defer c.Close()
  68. tNow := time.Now().String()
  69. c.Write([]byte(tNow))
  70. buf := make([]byte, len(tNow))
  71. n, err := c.Read(buf)
  72. if err != nil {
  73. return err
  74. }
  75. fmt.Printf("client [%s]\n", buf[:n])
  76. return nil
  77. }

执行go run test_tcp.go cert.go效果如下:

  1. server [2021-01-21 21:09:51.7942154 +0800 CST m=+1.011929701]
  2. client [2021-01-21 21:09:51.7852425 +0800 CST m=+1.002956801]

总结

以前使用的tcp连接没有任何加密,现在想想还是不安全。用上证书,起码会校验访问域名和证书等信息,多少会安全一些。
以上都是用来测试等等,如果需要正式使用证书,还是去各大网站花钱申请吧。我一直用万网的免费证书,但是有效期只有一年额。

原文链接:http://www.cnblogs.com/janbar/p/14310465.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号