如何用Golang在本地开启Https服务

前言

从接触Go语言的那天开始,一直在写Http服务,从来没启用过Https服务。因为Https需要证书和私钥,一直不知道怎么弄。中间鼓起勇气尝试过几次,但是都以失败告终。

失败的原因是一直不知道证书、私钥是什么?Https是如何使用证书和私钥的?只要弄清楚了这些问题,开启Https服务也就是顺水推舟的事了。

关于证书和密钥相关的问题,强烈建议阅读密钥&数字签名&数字证书一文。总结如下:

  1. 证书可以认为就是公钥;
  2. 在Https通信中,需要CA认证中心的证书以及服务器的证书和私钥;
  3. 服务器的证书是用来发送给客户端的;
  4. CA认证中心的证书需要安装在客户机上,用来验证服务器证书的真实性;那么CA证书的真实性如何验证呢?不好意思,CA证书是自认证的。

现在我们可以确定开启Https服务需要三样东西:CA证书、服务器证书、服务器私钥。如何制作这三样东西并通过Golang开启Https服务就是本文的目的。

自制证书

自制证书的软件(我知道的)有两款:OpenSSLXCA。前者是命令行界面,后者是图形界面,强烈推荐使用XCA。

关于证书制作过程,可以参考这篇文章,写的图文并茂。证书制作好以后需要导出三样东西,一是CA证书,二是服务器证书,三是服务器私钥。关于证书的导出,文中已经写的很清楚了,我说一下服务器私钥的导出。首先切换到Private Keys选项卡,然后选中服务器私钥,最后点击Export导出。

在这里插入图片描述

服务器证书和服务器私钥导出后放到一个文件夹,编程的时候会用到。CA证书需要安装到浏览器中,谷歌浏览器可以参考这里

到这里所有的准备工作就做好了。

开启Https服务

有了前面的基础,Go语言开启Https服务就如同开启Http服务一样简单。代码如下↓

package main

import (
	"net/http"
)

var certPath = "F:\\certFile\\server\\cert01.crt"
var keyPath = "F:\\certFile\\server\\cert01.pem"

func hello(w http.ResponseWriter, r *http.Request) {
    fmt.Println(r.Proto) //打印http协议版本
	w.Write([]byte("<h1>hello world!</h1>"))
}

func main() {
	http.HandleFunc("/hello", hello)
	http.ListenAndServeTLS(":8080", certPath, keyPath, nil)
}

运行上面的代码,在浏览器中输入https://localhost:8080/hello回车就可以了,当然你的浏览器可能会告诉你这个链接不安全,继续访问就可以了。

上面的代码还会打印出Http协议的版本,这里会打印HTTP/2.0。这说明用ListenAndServeTLS开启Https服务时,Golang会自动使用HTTP/2.0协议。

Go语言提供了一个内置的包`net/http`,可以用来创建HTTP服务器。在Windows上,可以将这个HTTP服务器作为一个Windows服务运行。 下面是一个简单的示例代码,演示如何使用Go语言创建一个Windows服务程序: ```go package main import ( "fmt" "log" "net/http" "os" "os/signal" "syscall" "time" "golang.org/x/sys/windows/svc" "golang.org/x/sys/windows/svc/debug" ) type myService struct{} func (m *myService) Execute(args []string, r <-chan svc.ChangeRequest, changes chan<- svc.Status) (ssec bool, errno uint32) { const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown changes <- svc.Status{State: svc.StartPending} go func() { // 启动HTTP服务器 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, World!") }) err := http.ListenAndServe(":8080", nil) if err != nil { log.Fatal(err) } }() changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} loop: for { select { case c := <-r: switch c.Cmd { case svc.Interrogate: changes <- c.CurrentStatus time.Sleep(100 * time.Millisecond) changes <- c.CurrentStatus case svc.Stop, svc.Shutdown: break loop default: log.Printf("unexpected control request #%d", c) } } } changes <- svc.Status{State: svc.StopPending} return } func main() { isIntSess, err := svc.IsAnInteractiveSession() if err != nil { log.Fatal(err) } if isIntSess { runService() return } debug.Run("MyService", &myService{}) } func runService() { err := svc.Run("MyService", &myService{}) if err != nil { log.Fatal(err) } } ``` 这个示例代码创建了一个简单的HTTP服务器,监听在本地的8080端口。当将这个程序安装为Windows服务后,可以通过访问`http://localhost:8080`来访问该服务。 要将这个程序安装为Windows服务,可以使用`sc`命令或者使用第三方工具如`nssm`。下面是使用`sc`命令的示例: 1. 打开命令提示符,以管理员身份运行。 2. 进入程序所在的目录。 3. 执行以下命令安装服务:`sc create MyService binPath= "<程序路径>" start= auto` 4. 执行以下命令启动服务:`sc start MyService` 现在,你可以通过访问`http://localhost:8080`来测试这个服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值