概述

目前, https 几乎已经是 web 站点的标配了, http 的站点和服务少之又少. 所以, 现在发布站点或者服务, https 是绕不开的一个点.

其实, 发布 https 还是 http, 对代码来说, 基本没有变化. https 难度的更多的是在如何创建和部署 SSL 证书上.

下面, 通过简单的例子来演示如何将一个简单 golang gin 服务部署成 https 服务.

https 证书的生成

证书的生成和具体的代码没有任何关系.

第一步:下载证书生成软件

通过 keymanager 来生成证书.

下载安装 keymanager 之后, 打开界面如下:

这里面有 1 个证书, 是我之前创建的, 新安装之后应该是空的. 这时, 你可以点击 【创建测试证书】 创建一个测试证书来实验发布 https 服务, 也可以点击 【证书申请】,申请一个真正的 https 证书(需要 freeSSL 帐号,也是免费的)

第二步:创建测试证书

本文主要演示 https 服务的发布过程,避免多余的步骤,所以使用测试证书。用真实证书的也一样,只是申请的过程有区别。 点击 【创建测试证书】之后,只要输入域名,然后点击下面的【创建证书】按钮即可。

第三步:导出证书

在证书列表页面点击【更多】,选择【导出证书】

选择 IIS 格式,并且输入密钥,作为测试我输入的是【12345678】

总结

借助 keymanager 工具,证书的制作非常简单,到这里为止,证书就算制作完成并导出了。

https 证书在 gin 框架中的部署

构建简单的 web 服务

为了验证证书是否可用,创建一个简单的基于 gin 框架的 web 服务。

package main

import (
  "strconv"

  "github.com/gin-gonic/gin"
  "github.com/unrolled/secure"
)

func main() {
  GinHttps(false) // 这里false 表示 http 服务,非 https
}

func GinHttps(isHttps bool) error {

  r := gin.Default()
  r.GET("/test", func(c *gin.Context) {
    c.String(200, "test for 【%s】", "https")
  })

  if isHttps {
    r.Use(TlsHandler(8000))

    return r.RunTLS(":"+strconv.Itoa(8000), "/path/to/test.pem", "/path/to/test.key")
  }

  return r.Run(":" + strconv.Itoa(8000))
}

func TlsHandler(port int) gin.HandlerFunc {
  return func(c *gin.Context) {
    secureMiddleware := secure.New(secure.Options{
      SSLRedirect: true,
      SSLHost:     ":" + strconv.Itoa(port),
    })
    err := secureMiddleware.Process(c.Writer, c.Request)

    // If there was an error, do not continue.
    if err != nil {
      return
    }

    c.Next()
  }
}

刚开始,以 http 的方式运行,启动后再浏览器输入 http://localhost:8000/test

证书转换

导出的 IIS 格式的证书无法直接使用,使用以下命令转换出相应的 pem 和 key 文件即可。

openssl pkcs12 -in test.pfx -nocerts -out key.pem -nodes
openssl pkcs12 -in test.pfx -nokeys -out test.pem
openssl rsa -in key.pem -out test.key

test.pfx 是我们导出的证书,如果不是这个名字,替换成你导出的证书名字即可。 使用的命令需要安装 openssl 工具。

改成 https 服务

只需将 main 函数中的调用参数改成 true 即可,其他不用变。 注意上面步骤转换出的 pem 和 key 文件的路径要放对。

func main() {
  GinHttps(true) // 这里true 表示 https 服务
}

注意,这里浏览器上显示【不安全】是因为此 SSL 证书是测试证书,实际项目中使用正式的证书就不会有【不安全】的提示了。


城市合伙人全球招募中:400-150-9800

参与线下宏伟蓝图,用业绩说话!
软件线索、软件需求,米鼠网帮你变现!
更灵活的合作模式(不限地域、不限金额、不限项目)
更高额的提成比例(提成是软件项目利润的80%)
利润的核算方式:
以平台公开招标的最低价中标价格为基准,剩下的为利润部分,如对平台的最低中标价格有异议,可以推荐供应商进行竞标。
义务:
1、作为城市合伙人,在该城市利用自身优势推广“米鼠网平台”,拓展甲 方所拥有的“米鼠网平台”实名认证用户和 VIP 用户
2、作为城市合伙人,在该城市利用自身优势推广“米鼠网商城”,并寻求该地域软件产品销售商,促成软件产品销售商委托甲方在“米鼠网商城”上代理销售软件产品销售商的软件产品的交易,并拓展软件产品采购用户促成与甲方的采购交易。