常规情况下,采用Golang部署https服务只需要使用http.Server{}的ListenAndServeTLS方法,并在该方法中配置好TLS证书的certFile和keyFile文件地址即可;或者采用gin框架中的g.RunTLS方法并在方法中配置好addr服务地址、certFile和keyFile文件地址即可。操作非常简单便捷,适用于各种场景。
但是以上普通方法,只能使一个域名有效。比如说我有一个域名:buptbridgewang.top,我可以直接这样操作将该域名变为https的服务。但是如果我有多个域名呢?比如说:buptbridgewang.com,buptbridgewang.com.cn,buptbridgewang.net等等。这个时候,我又不想增加服务器,想让多个域名均指向我的这个服务器,并且均能提供https安全链接,那么我该怎么办呢?
于是就引出了我们今天的问题:如何采用Golang进行单服务器多域名https证书的服务部署。
部署流程:在单域名部署https时,我只需在Golang中先进行TLSHandler middleware的设置,然后启动两个goroutine分别监听80和443端口即可:
主程序及TLSHandler middleware的设置:
Goroutine 1: 用于启动80端口的监听,以方便对http请求重定向至https。不启动该端口的监听将会导致http://xxx.com 的请求产生connection refused.
Gorutine 2: 用于启动443端口的监听,以处理https请求。
通过如上操作,https单域名的服务就启动了。
那么https多域名的服务如何配置呢?
其实很容易,我们只需要不采用gin默认的Run方法和RunTLS方法,而是采用自定义的http.Server来启动服务就可以了。
方法如下:首先自定义http.Server,并在其中配置好服务地址,Handler配置为gin.Engine默认的Handler(),然后初始化http.Server中默认的TLSConfig字段,并将该字段中的NameToCertificate初始化为map类型。NameToCertificate字段的含义就是域名->证书的映射。
在初始化完该server后,就需要加载证书并导入到srv中。如果有多个https的域名及证书,可以均以下面为例配置到srv.TLSConfig.NameToCertificate中去:
在配置完成后,还需要设置TLSConfig中的GetCertificate字段,该字段是一个方法,在该方法中,clientInfo.ServerName即为客户端访问服务器时采用的域名,通过NameToCertificate即可查询到对应域名的证书,进而校验通过。
最后,启动我们的TLS服务就可以啦~