乐趣区

关于后端:GO-中如何设置-HTTPS-分享

GO 中如何设置 HTTPS 分享

先回顾一下上次说到对于 HTTP 相干的知识点

  • HTTP 属于网络模型中的 应用层协定 应用层 的作用就是规定 应用程序应用的用语标准
  • HTTP 的建设过程波及客户端和服务端,须要具体理解的能够查看文章:互联网协议知多少、来咱们一起探索一下 net/http 的代码流程

HTTPS 是什么?

说到 HTTPS 咱们就来看看 HTTPS 是个啥

HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),即超文本传输平安协定,是一种通过计算机网络进行平安通信的传输协定

HTTPS 为啥会呈现?

正是因为现有的 HTTP 在平安上有缺点,为了解决身份认证的问题,爱护替换数据的隐衷与完整性,HTTPS 便呈现了。

HTTP 的原理是啥?

那么咱们来说说 HTTP 简略原理

  • 客户端的浏览器先和服务器建设连贯,通过传输层的协定 TCP 来实现的。默认的 TCP 连贯的端口号是80 端口
  • 建设连贯后,客户端发送申请给到服务端,格局为:

    • URL(对立资源标识符)
    • 协定版本号
    • MIME 信息(修饰符,客户端的信息,许可内容)
  • 服务器收到申请后,给予回应,回应格局为

    • 状态行
    • 协定版本号
    • 胜利 / 谬误 的代码
    • MIME 信息(服务端信息,实体音讯,其余内容)

HTTPS 实际上是怎么实现的呢?

利用安全套接层(SSL)作为 HTTP 利用的子层

  • HTTPS 对应应用应用443 端口
  • HTTP 对应应用80 端口

HTTPS 有啥作用?

  • 建设一个信息安全通道,来保障数据传输的平安
  • 确认网站的真实性,但凡应用了 HTTPS 的网站,都能够通过点击浏览器地址栏的锁头标记来查看网站认证之后的实在信息,也能够通过 CA 机构颁发的平安签章来进行查问

那么 HTTPS 和 HTTP 有啥区别?

  • HTTP 协定须要到 CA 申请证书,个别收费证书很少,大多是须要花钱买的
  • HTTP 是超文本传输协定,信息是明文传输,HTTPS 则是具备安全性的 ssl 加密传输协定。
  • HTTP 和 HTTPS 应用的是齐全不同的连贯形式,用的端口也不一样
  • HTTP 的连贯很简略,是无状态的
  • HTTPS 协定 是由 SSL / TLS + HTTP 协定 构建的可进行加密传输、身份认证的网络协议,比HTTP 协定 平安。

说到这里,那么 SSL 是个啥?

是一种平安协定

目标是为网络通信提供平安及数据完整性才有的这个协定

SSL 协定 分为 2 层:

  • SSL 记录协定(SSL Record Protocol)

SSL他是在传输层协定下面的,他能够为高层协定提供 数据封装 压缩 加密 等基本功能的反对

  • SSL 握手协定(SSL Handshake Protocol)

用于在理论的数据传输开始 之前 ,通信单方进行 身份认证 协商加密算法 替换加密密钥 等。

SSL 协定可能提供哪些服务呢?

简略说下 SSL 协定可能提供哪些服务:

  • 认证用户和服务器,确保数据发送到正确的客户机和服务器
  • 加密数据以避免数据中途被窃取
  • 保护数据的完整性,确保数据在传输过程中不被扭转。

那么 HTTPS 波及了哪些加密算法呢?

  • 加密:RSA / DH

DH 算法解决了密钥在单方不间接传递密钥的状况下实现密钥替换,感兴趣的小伙伴的进一步具体理解一下

  • 身份验证 / 数字签名:RSA 算法

RSA 签名 的数学逻辑与 RSA 加密 完全一致。只是颠倒应用了私钥与公钥。

RSA 公开密钥明码体制的原理是:

依据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其艰难,因而能够将乘积公开作为加密密钥

加密简略流程

解密简略流程

RSA 非对称加密算法 原理:

单方都失去了会话密钥,拿到公钥的一方学生成随机的会话密钥,而后利用公钥加密它;再把加密后果发给对方,对方用私钥进行解密

先分享这些根本的点,对于 HTTPS 细节原理,加密算法原理以及代码具体实现,咱们后续再进行细化,接下来咱们持续咱们的主题,GO 如何设置 HTTPS

GO 如何设置 HTTPS

Golang 中设置HTTPS,须要用到一个中间件,

没错,不必咱们本人实现底层,咱们能够站在伟人的肩膀上进行绘制宏伟蓝图

这个中间件是 Secure

是 Go 的 HTTP 中间件,可促成疾速取得安全性。

Secure是一个规范的 net / http Handler,能够与许多框架一起应用,间接与 Go 的 net / http 包一起应用也是没有问题的

package main

import (
   "github.com/unrolled/secure"
   "net/http"
)

var myHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {w.Write([]byte("<h1>hello xiaomotong!!</h1>"))
})

func main() {
   secureMid := secure.New(secure.Options{AllowedHosts:          []string{"hello\\.com", ".*\\.hello\\.com"},
      AllowedHostsAreRegex:  true,
      HostsProxyHeaders:     []string{"X-Forwarded-Host"},
      SSLRedirect:           true,
      SSLHost:               "ssl.hello.com",
      SSLProxyHeaders:       map[string]string{"X-Forwarded-Proto": "https"},
      STSSeconds:            21365000,
      STSIncludeSubdomains:  true,
      STSPreload:            true,
      FrameDeny:             true,
      ContentTypeNosniff:    true,
      BrowserXssFilter:      true,
      ContentSecurityPolicy: "script-src $NONCE",
      IsDevelopment:         true,
   })

   handler := secureMid.Handler(myHandler)
   http.ListenAndServe("127.0.0.1:8888", handler)
}

咱们在开发调试的时候 将 参数 IsDevelopment 设置 为 true 即可

如果 IsDevelopmenttrue则 AllowedHosts,SSLRedirect,STS 头和 HPKP 头 将有效。

咱们在开发的时候,就默认应用 HTTP,否则会被重定向到 HTTPS

这使您能够在开发 / 测试模式下工作,而不用进行任何宜人的重定向到 HTTPS(即,开发能够在 HTTP 上进行),或者阻止 localhost 主机呈现问题。

咱们来看看 Options 的参数

// Options is a struct for specifying configuration options for the secure.Secure middleware.
type Options struct {
   // If BrowserXssFilter is true, adds the X-XSS-Protection header with the value `1; mode=block`. Default is false.
   BrowserXssFilter bool // nolint: golint
   // If ContentTypeNosniff is true, adds the X-Content-Type-Options header with the value `nosniff`. Default is false.
   ContentTypeNosniff bool
   // If ForceSTSHeader is set to true, the STS header will be added even when the connection is HTTP. Default is false.
   ForceSTSHeader bool
   // If FrameDeny is set to true, adds the X-Frame-Options header with the value of `DENY`. Default is false.
   FrameDeny bool
   // When developing, the AllowedHosts, SSL, and STS options can cause some unwanted effects. Usually testing happens on http, not https, and on localhost, not your production domain... so set this to true for dev environment.
   // If you would like your development environment to mimic production with complete Host blocking, SSL redirects, and STS headers, leave this as false. Default if false.
   IsDevelopment bool
   // nonceEnabled is used internally for dynamic nouces.
   nonceEnabled bool
   // If SSLRedirect is set to true, then only allow https requests. Default is false.
   SSLRedirect bool
   // If SSLForceHost is true and SSLHost is set, requests will be forced to use SSLHost even the ones that are already using SSL. Default is false.
   SSLForceHost bool
   // If SSLTemporaryRedirect is true, the a 302 will be used while redirecting. Default is false (301).
   SSLTemporaryRedirect bool
   // If STSIncludeSubdomains is set to true, the `includeSubdomains` will be appended to the Strict-Transport-Security header. Default is false.
   STSIncludeSubdomains bool
   // If STSPreload is set to true, the `preload` flag will be appended to the Strict-Transport-Security header. Default is false.
   STSPreload bool
   // ContentSecurityPolicy allows the Content-Security-Policy header value to be set with a custom value. Default is "".
   ContentSecurityPolicy string
   // ContentSecurityPolicyReportOnly allows the Content-Security-Policy-Report-Only header value to be set with a custom value. Default is "".
   ContentSecurityPolicyReportOnly string
   // CustomBrowserXssValue allows the X-XSS-Protection header value to be set with a custom value. This overrides the BrowserXssFilter option. Default is "".
   CustomBrowserXssValue string // nolint: golint
   // Passing a template string will replace `$NONCE` with a dynamic nonce value of 16 bytes for each request which can be later retrieved using the Nonce function.
   // Eg: script-src $NONCE -> script-src 'nonce-a2ZobGFoZg=='
   // CustomFrameOptionsValue allows the X-Frame-Options header value to be set with a custom value. This overrides the FrameDeny option. Default is "".
   CustomFrameOptionsValue string
   // PublicKey implements HPKP to prevent MITM attacks with forged certificates. Default is "".
   // Deprecated: This feature is no longer recommended. Though some browsers might still support it, it may have already been removed from the relevant web standards, may be in the process of being dropped, or may only be kept for compatibility purposes. Avoid using it, and update existing code if possible.
   PublicKey string
   // ReferrerPolicy allows sites to control when browsers will pass the Referer header to other sites. Default is "".
   ReferrerPolicy string
   // FeaturePolicy allows to selectively enable and disable use of various browser features and APIs. Default is "".
   // Deprecated: This header has been renamed to Permissions-Policy.
   FeaturePolicy string
   // PermissionsPolicy allows to selectively enable and disable use of various browser features and APIs. Default is "".
   PermissionsPolicy string
   // SSLHost is the host name that is used to redirect http requests to https. Default is "", which indicates to use the same host.
   SSLHost string
   // AllowedHosts is a list of fully qualified domain names that are allowed. Default is empty list, which allows any and all host names.
   AllowedHosts []string
   // AllowedHostsAreRegex determines, if the provided slice contains valid regular expressions. If this flag is set to true, every request's
   // host will be checked against these expressions. Default is false for backwards compatibility.
   AllowedHostsAreRegex bool
   // HostsProxyHeaders is a set of header keys that may hold a proxied hostname value for the request.
   HostsProxyHeaders []string
   // SSLHostFunc is a function pointer, the return value of the function is the host name that has same functionality as `SSHost`. Default is nil.
   // If SSLHostFunc is nil, the `SSLHost` option will be used.
   SSLHostFunc *SSLHostFunc
   // SSLProxyHeaders is set of header keys with associated values that would indicate a valid https request. Useful when using Nginx: `map[string]string{"X-Forwarded-Proto": "https"}`. Default is blank map.
   SSLProxyHeaders map[string]string
   // STSSeconds is the max-age of the Strict-Transport-Security header. Default is 0, which would NOT include the header.
   STSSeconds int64
   // ExpectCTHeader allows the Expect-CT header value to be set with a custom value. Default is "".
   ExpectCTHeader string
   // SecureContextKey allows a custom key to be specified for context storage.
   SecureContextKey string
}

感兴趣同学能够具体的理解一下 secure 包中的每个参数细节

咱们来看看 如何 将 HTTP 重定向到 HTTPS

HTTP 重定向到 HTTPS

咱们的服务起来后,默认拜访本机的 localhost:8888,会被 HTTPS 重定向到lcoalhost:4433

package main

import (
   "log"
   "net/http"

   "github.com/unrolled/secure"
)

var myHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {w.Write([]byte("<h1>hello xiaomotong!! HTTPS </h1>"))
})

func main() {
   secureMiddleware := secure.New(secure.Options{
      SSLRedirect: true,
      // 这在生产中是可选的。默认行为是将申请重定向到 HTTPS 协定
      SSLHost:     "localhost:4433",
   })

   han := secureMiddleware.Handler(myHandler)

   // HTTP
   go func() {log.Fatal(http.ListenAndServe(":8888", han))
   }()

   log.Fatal(http.ListenAndServeTLS(":4433", "cert.pem", "key.pem", han))
}

代码中的 两个文件

  • cert.pem
  • key.pem

能够通过如下命令生成,将生成文件放到代码同级目录即可

go run $GOROOT/src/crypto/tls/generate_cert.go --host="localhost"

实际效果

  • 服务开启后,拜访本机的 localhost:8888,会被 HTTPS 重定向到lcoalhost:4433
  • 第一次执行第一步后,浏览器会弹出一个不平安的页面,点击 持续 即可看到咱们的重定向后果页面

总结

  • 简略 分享了 HTTPS,HTTPS 和 HTTP 的区别
  • SSL 是什么,波及到的加密算法
  • Golang 中设置 HTTP 重定向到 HTTPS,心愿对你有点帮忙

欢送点赞,关注,珍藏

敌人们,你的反对和激励,是我保持分享,提高质量的能源

好了,本次就到这里,下一次 GO 的并发编程分享

技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。

我是 小魔童哪吒,欢送点赞关注珍藏,下次见~

退出移动版