前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用Go和Let's Encrypt证书部署HTTPS

使用Go和Let's Encrypt证书部署HTTPS

作者头像
FB客服
发布于 2018-02-28 08:31:30
发布于 2018-02-28 08:31:30
1.8K00
代码可运行
举报
文章被收录于专栏:FreeBufFreeBuf
运行总次数:0
代码可运行

为什么要使用HTTPS?使用HTTPS的途径有哪些?如何用Go来部署HTTPS?拿出你的小本本,你要的干货都在这儿!

HTTPS 的好处我们已在之前的文章中提高好多。它加密浏览器和服务器之间的流量,保障你密码传输的安全,让你的页面加载速度飞快,有助于网站的SEO优化还有对HTTP网站百般嫌弃的浏览器厂商……这些都是使用HTTPS的理由。那么问题来了,怎样可以又快又好地部署HTTPS呢?

使用第三方提供的HTTPS

比如说CloudFlare,他们的免费方案为你那仅支持HTTP的网站提供仿HTTPS代理服务。

要使用CloudFlare:

配置你的域,使用CloudFlare的DNS服务器 在CloudFlare的DNS设置中,将域指向你的服务器,并通将“状态”设为“DNS和HTTP代理服务器(CDN)” 在CloudFlare的加密设置中,将SSL设为“灵活”(该选项使浏览器通过HTTPS与CloudFlare对话,CloudFlare通过HTTP与浏览器对话) 在web管理界面配置CloudFlare的HTTPS代理,提供你的服务器的IP地址。 除此之外,还要启用“总是使用HTTPS”选项

浏览器与CloudFlare对话,CloudFlare负责提供SSL证书,并代理通向你的服务器的通信。由于额外的通信量,这可能会减慢网络速度,也可能由于CloudFlare服务器比你的服务器要快(变得更快是他们的工作),所以导致网络速度变快。

AWS、谷歌云以及其它一些主机服务提供商也为托管在他们那里的服务器提供免费HTTPS服务。

另一个选项是在支持HTTPS的反向代理服务器(如Caddy)后面运行你的服务器。

直接支持HTTPS

很久很久以前,想要一张ssl证书就必须每年为一个域名花很多钱。而现在,Let’s Encrypt改变了这一切。

这是一个非营利性机构,它提供免费证书,并且提供HTTP API来获得证书。API允许自动化处理这一过程。

在Let’s Encrypt出现之前,你可能会购买一个证书,而这仅仅是一串字节而已。你会把证书存放在一个文件中,并配置你的网络服务器来使用它。

有了Let’s Encrypt以后,你就能够使用他们的API来免费获得证书了,而且这一过程是在你的服务器启动后自动完成的。

值得庆幸的是,所有与API进行对话的艰苦工作都已由其他人做完了。我们只需要安装插件就可以了。

有两个Go库可以实现Let’s Encrypt支持。

我一直在使用golang.org/x/crypto/acme/autocert,它是由Go的核心开发人员开发的。

现在已经有几个月了,它运行一切正常。

下面是怎样启动一个使用Let’s Encrypt提供的免费SSL证书的HTTPS网络服务器的方法。

完整的例子请看:free-ssl-certificates/main.go。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const (htmlIndex = `Welcome!`inProduction = true)func handleIndex(w http.ResponseWriter, r *http.Request) {io.WriteString(w, htmlIndex)}func makeHTTPServer() *http.Server {mux := &http.ServeMux{}mux.HandleFunc("/", handleIndex)// set timeouts so that a slow or malicious client doesn't// hold resources foreverreturn &http.Server{ReadTimeout: 5 * time.Second,WriteTimeout: 5 * time.Second,IdleTimeout: 120 * time.Second,Handler: mux,}}func main() {var httpsSrv *http.Server// when testing locally it doesn't make sense to start// HTTPS server, so only do it in production.// In real code, I control this with -production cmd-line flagif inProduction {// Note: use a sensible value for data directory// this is where cached certificates are storeddataDir := "."hostPolicy := func(ctx context.Context, host string) error {// Note: change to your real domainallowedHost := "www.mydomain.com"if host == allowedHost {return nil}return fmt.Errorf("acme/autocert: only %s host is allowed", allowedHost)}httpsSrv = makeHTTPServer()m := autocert.Manager{Prompt: autocert.AcceptTOS,HostPolicy: hostPolicy,Cache: autocert.DirCache(dataDir),}httpsSrv.Addr = ":443"httpsSrv.TLSConfig = &tls.Config{GetCertificate: m.GetCertificate}go func() {err := httpsSrv.ListenAndServeTLS("", "")if err != nil {log.Fatalf("httpsSrv.ListendAndServeTLS() failed with %s", err)}}()}httpSrv := makeHTTPServer()httpSrv.Addr = ":80"err := httpSrv.ListenAndServe()if err != nil {log.Fatalf("httpSrv.ListenAndServe() failed with %s", err)}}

需要注意的是:

HTTPS的标准端口是443; 你可以只运行HTTP、只运行HTTPS或两者都运行; 如果服务器没有证书,那么它将会使用HTTP API向Let’s Encrypt服务器请求证书。

这些请求被限制到每周处理20个,以避免Let’s Encrypt服务器过载。

因此,在某个地方缓存证书是非常重要的。在我们的例子中,我们将证书缓存到磁盘上,使用的是autocert.DirCache命令。

缓存只是一个界面,所以你可以在一个SQL数据库Redis中执行你所存储的。

你必须正确安装DNS

为核实你确实是你所申请证书的域的所有者,Let’s Encrypt服务器会回叫你的服务器。

为了正常工作,DNS名必须解析到你的服务器的IP地址。

这意味着,HTTPS代码-路径的本地测试是很难的。我通常不这么做。

如果你真的想这么做,你可以使用ngrok来将你的本地端口暴露给互联网,设置DNS来将你的域名解析到ngrok创建的公共DNS上,然后等待确认DNS信息传给Let’s Encrypt的计算机。

你可能会好奇:这个HostPolicy业务是什么?

正如我提到的, Let’s Encrypt限制了证书供应,所以你需要确保服务器不会向其请求你不关心的域的证书。Autocert的文档很好地解释了这一点。

我们的例子假设的是最常见的情况:一个服务器仅响应一个域。你可以很容易地改变这一点。

在本地测试时,我们不运行HTTPS

当在你的笔记本电脑上进行本地测试时,运行HTTPS版本是毫无意义的。

你的计算机很可能没有可见公用IP地址,所以Let’s Encrypt服务器无法达到你那里,所以你将不会得到证书。

我们也不能绑定到HTTPS端口443(只有根进程可以绑定到1024以下的端口)。

在这个例子中,我使用inProduction标记来决定是否应该启动HTTPS服务器。

在实际代码中,我会加入检查-production命令行标志的代码,并使用它。

从HTTP重定向到HTTPS

如果你能够使用HTTPS了,那么提供纯HTTP就毫无意义了。

我们可以将所有HTTP请求重定向到同样的HTTPS上,以获得更好的安全性和搜索引擎优化效果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func makeServerFromMux(mux *http.ServeMux) *http.Server {// set timeouts so that a slow or malicious client doesn't// hold resources foreverreturn &http.Server{ReadTimeout: 5 * time.Second,WriteTimeout: 5 * time.Second,IdleTimeout: 120 * time.Second,Handler: mux,}}func makeHTTPToHTTPSRedirectServer() *http.Server {handleRedirect := func(w http.ResponseWriter, r *http.Request) {newURI := "https://" + r.Host + r.URL.String()http.Redirect(w, r, newURI, http.StatusFound)}mux := &http.ServeMux{}mux.HandleFunc("/", handleRedirect)return makeServerFromMux(mux)}func main() {httpSrv := makeHTTPToHTTPSRedirectServer()httpSrv.Addr = ":80"fmt.Printf("Starting HTTP server on %s\n", httpSrv.Addr)err := httpSrv.ListenAndServe()if err != nil {log.Fatalf("httpSrv.ListenAndServe() failed with %s", err)}}

技术部分到此为止了。

免费证书从何而来?

有种意见认为,由于一个设计错误,SSL协议不仅进行加密,还会向浏览器证明网站的身份。它担负着责任,使得我们可以追踪google.com网站的所有者,并且看到该网站的确是由美国谷歌公司,而不是由莫斯科的黑客伊万所有。

我们只信任极少数公司(证书颁发机构)会颁发能够证明网站所有者身份的证书。

当你申请一个证书时,证书颁发机构必须核实你的身份。他们通过查看你的文件来做这项工作。

核实文件需要人力。保证证书安全也需要人力。证书颁发机构为颁发证书而收费是合理的。

信任并不是成比例的。浏览器和操作系统销售商可以信任10家公司不会颁发无效证书,但他们不可能信任1000家。

我们不想让随便一家公司变成骗子证书颁发机构,然后为黑客伊万颁发google.com域的证书。

为了得到仅有的几个理想结果而连续审核数千家证书颁发机构,将会花费太多的精力。

由少数几家公司控制市场很可能导致垄断,这样,由于缺乏竞争,价格将居高不下。

这正是SSL证书市场当前的行情。你每年只花60美元就可以拥有一台低端服务器,但一个证书却比这要昂贵。

这是一个问题,因为SSL证书的成本是所有网站采用加密技术的明显障碍。

少数几家公司决定共享他们的资源来解决这一问题,从而更有利于整个互联网。于是他们资助了Let’s Encrypt这样一家证书颁发机构,然后编制一些必要的软件并运营着颁发证书的服务器。

这就是免费证书的来历。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何获取免费的 SSL 证书?
SSL 证书作为保障网站安全的关键工具,其重要性不言而喻。它不仅能加密数据传输,保护用户隐私,还能提升网站的可信度和搜索引擎排名。对于预算有限的个人站长和小型企业来说,免费的 SSL 证书无疑是保护网站安全的最佳选择,本文将简单介绍SSL证书的加密原理和几种获取免费证书的方式。
星尘安全
2025/05/15
2100
如何获取免费的 SSL 证书?
Go 语言网络编程系列(五)—— HTTP 编程篇:HTTP/HTTPS 请求处理
本篇教程我们将介绍 HTTP 服务端技术,包括如何处理 HTTP 请求和 HTTPS 请求。
学院君
2019/11/12
2.2K0
Go 语言网络编程系列(五)—— HTTP 编程篇:HTTP/HTTPS 请求处理
yoyogo v1.7.5 发布, 独立依赖注入DI
一个简单、轻量、快速、基于依赖注入的微服务框架( web 、grpc ),支持Nacos/Consoul/Etcd/Eureka/k8s /Apollo等 .
yoyofx
2021/07/19
3010
yoyogo v1.7.5 发布, 独立依赖注入DI
使用Let's Encrypt实现nginx网站https加密
Let's Encrypt是一个于2015年三季度推出的数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的SSL/TLS证书。证书有90天的有效期,适合个人使用或者临时使用,不用再忍受自签发证书不受浏览器信赖的提示。Certbot是一款易于使用的客户端,实现Web服务器自动提取和部署SSL/TLS证书。
fanzhh
2019/08/20
1.4K0
Let's Encrypt免费泛域名SSL证书申请及自动续签
Let's Encrypt: https://letsencrypt.org , 是一个免费的、自动化的、开放的证书颁发机构。截至2018年9月,它的全球SSL证书市场份额已超过50%,得到主流浏览器和厂商的认可与支持。
Cong Min
2019/09/07
20.9K1
Go语言·Web调优详解
Go1.8将要来了,这种格局即将被打破了! 我们最近尝试性的将Go1.8编译的服务暴漏到了外网,结果发现crypto/tls 和net/http都得到了极大的提升:稳定性、性能以及服务的可伸缩性! crypto/tls 现在已经是2016年了,我们不可能再去裸奔在互联网了,因此基于TLS是必然的选择,所以我们需要crypto/tls这个库。好消息就是在1.8下,该库的性能得到了很大的提升,性能表现堪称十分优秀,而且安全性也非常出色。 默认推荐的配置类似 Mozilla标准 https://wiki.mozi
李海彬
2018/03/28
1.2K0
Go语言·Web调优详解
实例展示(High API):
一个Go编程语言的运行依赖注入库。依赖注入是更广泛的控制反转技术的一种形式。它用于增加程序的模块化并使其具有可扩展性。
yoyofx
2023/06/10
2520
IIS 使用 Let’s Encrypt 证书部署 HTTPS 站点
Let’s Encrypt(https://letsencrypt.org ) 是可以签发免费 SSL / TLS 证书的 CA 机构,它是为普及 HTTPS 而发起的,推动了基础 DV SSL 证书的普及。其证书已经被 Mozilla、Google、Microsoft 和 Apple等主流浏览器支持,只需要 web 服务器配置好 HTTPS 证书,浏览器会在加载时验证 web 服务器 HTTPS证书是否有效。 使用 Let’s Encrypt 一个很重要的理由是免费,避免 ISP 劫持;还有申请速度快、无需注册账户等优点。在对比了众多免费 CA 后,Let’s Encrypt是比较方便和理想的,它提供了基础 DV SSL证书,只提供了数据加密;不验证身份,无法向用户证明网站的所有者。但即使这样也满足了基本需要了。
Savalone
2020/02/11
4.4K0
IIS 使用 Let’s Encrypt 证书部署 HTTPS 站点
免费ssl证书申请:给你的网站添加免费的https加密
SSL证书,用于加密HTTP协议,也就是HTTPS。随着淘宝、百度等网站纷纷实现全站Https加密访问,搜索引擎对于Https更加友好,加上互联网上越来越多的人重视隐私安全,站长们给网站添加SSL证书
神无月
2018/06/25
7.9K0
使用acme.sh申请Let's Encrypt免费的SSL证书
acme.sh 实现了 acme 协议,可以从letsencrypt生成免费的证书。接下来将为大家介绍怎样申请Let's Encrypt通配符证书。
青阳
2021/09/15
5.9K4
Go HttpServer 最佳实践
这是 Cloudflare 的 Filippo Valsorda 2006年发表在Gopher Academy的一篇文章, 虽然过去两年了,但是依然很有意义。
李海彬
2018/07/31
1.4K0
Go HttpServer 最佳实践
Go 每日一库之 net/http(基础和中间件)
几乎所有的编程语言都以Hello World作为入门程序的示例,其中有一部分以编写一个 Web 服务器作为实战案例的开始。每种编程语言都有很多用于编写 Web 服务器的库,或以标准库,或通过第三方库的方式提供。Go 语言也不例外。本文及后续的文章就去探索 Go 语言中的各个Web 编程框架,它们的基本使用,阅读它们的源码,比较它们优缺点。让我们先从 Go 语言的标准库net/http开始。标准库net/http让编写 Web 服务器的工作变得非常简单。我们一起探索如何使用net/http库实现一些常见的功能或模块,了解这些对我们学习其他的库或框架将会很有帮助。
用户7731323
2021/07/23
1.3K0
如何使用acme.sh自动获取、更新Let’s Encrypt的SSL证书?
acme.sh实现了acme协议,可以从let's encrypt生成免费的ssl证书。本文主要记录使用dnspod api 自动申请ssl证书
房东的狗丶
2023/02/17
5.5K0
使用golang部署运行tls的https服务时,不用停机,高效证书下放,如何实现?
这篇文章主要介绍如何在应用golang语言开发http/https服务时,如何让tls自动获取证书,而不必在证书更新或重置以后,还要重启服务器来让业务重新起效,本文分成三部分,第一部分会介绍tls加密的常用加密算法进行分析总结,虽然与主干关系不特别大,但是该段络会帮你厘清一个日常使用中,非常容易被混淆的问题;第二部分会重点介绍如何部署一个不需要重启也能tls自动更新的高抽象度的http服务;第三部分会对整个文章进行总结,相信基于该文章的学习,你一定会对tls领域和流量监测、安全防护领域常见的算法有相对深刻的理解,也对如何高度抽象一个自签名的golang服务有全新的认识。那么文章开始!
用户1413827
2023/11/28
1.3K0
go http 分析
handler 参数(w http.ResponseWriter, r *http.Request)
solate
2019/07/22
5970
给网站安装免费的通配SSL证书,轻松实现HTTPS并自动续签
出于安全考虑,现在大部分的网站都已经配置了SSL证书,直观的感觉就是现在大部分的网站都是HTTPS,而不是HTTP了。甚至,Chrome 从90版本开始,就已经是默认请求HTTPS:
Mintimate
2024/08/14
2.3K1
给网站安装免费的通配SSL证书,轻松实现HTTPS并自动续签
使用Certify来自动申请并配置Let’s Encrypt免费SSL证书到IIS8
越来越多的网站在启用HTTPS,也就是SSL加密通讯连接访问。特别是去年开始BAT在国内的推广和应用要求。要知道部署发布一个苹果iOS企业应用,下载服务器就必须使用HTTPS协议。
崔文远TroyCui
2019/02/26
2.9K0
使用Certify来自动申请并配置Let’s Encrypt免费SSL证书到IIS8
使用Let's Encrypt的SSL证书配置HTTPS手记
前段时间,看见很多大会都在分享全站HTTPS的经验。HTTPS固然好,前提是SSL证书,并且签发证书的机构要靠谱。沃通的CA证书就相继被Mozilla和Google封杀了。曾经对于普通用户,权威,安全,并且免费的证书无疑就像天上的星星,可望而不可及。现在,这些星星变成了馅饼掉了下来。没错,我们可以申请安全免费的ssl证书--- Let's Encrypt。 Let’s Encrypt是电子前哨基金会(EFF)发布的免费 SSL 证书服务,Google,Mozilla和Microsoft都极力支持。很早之前就
李海彬
2018/03/19
2.5K0
使用Let's Encrypt的SSL证书配置HTTPS手记
白嫖https免费证书
HTTPS 证书的定价因供应商、证书类型、证书品牌、有效期等因素而异。一般来说,SSL/TLS 证书的价格分为以下几种类型:
叔牙
2023/06/21
1.1K0
白嫖https免费证书
go net/http标准库源码
可以看到 Go 实现的http服务步骤非常简单,首先注册路由,然后创建服务并开启监听即可。
leobhao
2024/04/01
1510
推荐阅读
相关推荐
如何获取免费的 SSL 证书?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验