为什么要使用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

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 forever
return &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 flag
if inProduction {
// Note: use a sensible value for data directory
// this is where cached certificates are stored
dataDir := "."
hostPolicy := func(ctx context.Context, host string) error {
// Note: change to your real domain
allowedHost := "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上,以获得更好的安全性和搜索引擎优化效果。
func makeServerFromMux(mux *http.ServeMux) *http.Server {
// set timeouts so that a slow or malicious client doesn't
// hold resources forever
return &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这样一家证书颁发机构,然后编制一些必要的软件并运营着颁发证书的服务器。

这就是免费证书的来历。

使用Go和Let's Encrypt证书部署HTTPS的更多相关文章

  1. 在Ubuntu/Centos使用 Let's Encrypt 证书部署 HTTPS的方法

    certbot地址 apache服务器(ubuntu环境): 1.获取软件包: $ sudo apt-get update $ sudo apt-get install software-proper ...

  2. SSL证书部署HTTPS站点Apache/Nginx配置

    SSL证书及HTTPS协议 SSL 证书是一种数字证书,它使用 Secure Socket Layer 协议在浏览器和 Web 服务器之间建立一条安全通道,从而实现:1.数据信息在客户端和服务器之间的 ...

  3. Nginx自建SSL证书部署HTTPS网站

    一.创建SSL相关证书 1.安装Nginx(这里为了测试使用yum安装,实际看具体情况) [root@localhost ~]# yum install nginx -y #默认yum安装已经支持SS ...

  4. Nginx配置SSL证书部署HTTPS网站

    1.购买ssl证书 购买网站:沃通 2.上传证书到nginx服务器,然后进行解压. 解压后的的效果: [root@bubidev-ng3 nginx]# pwd/etc/nginx [root@bub ...

  5. Nginx配置SSL证书部署HTTPS方法

    1.申请域名,绑定服务器ip(我申请的是阿里云服务器,以下就此为例) 2.可以在阿里云上免费申请SSL证书(下载证书,后续会用到) 3.在服务器中配置证书 在服务器上安装Nginx 将下载好的证书上传 ...

  6. 关于阿里云Symantec免费DV证书部署HTTPS

    获取阿里云Symantec免费DV证书: 官方文件说明: 证书文件214188487290026.pem,包含两段内容,请不要删除任何一段内容. 如果是证书系统创建的CSR,还包含:证书私钥文件214 ...

  7. Nginx配置SSL证书部署HTTPS网站(颁发证书)

    一.Http与Https的区别HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高 ...

  8. windows server2012之部署HTTPS安全站点

    现在的互联网越来越重视网络安全方面的内容,像我们日常生活中浏览的网上银行网站等涉及安全的你都会发现有https 的标志出现,在URL前加https://前缀表明是用SSL加密的. 你的电脑与服务器之间 ...

  9. 快速签发 Let's Encrypt 证书指南

    本文仅记录给自己的网站添加"小绿锁"的动手操作过程,不涉及 HTTPS 工作原理等内容的讲解,感兴趣的同学可以参考篇尾的文章自行了解. 简单了解下我的实验环境: 云服务器:Cent ...

随机推荐

  1. java 1.8 动态代理源码分析

    JDK8动态代理源码分析 动态代理的基本使用就不详细介绍了: 例子: class proxyed implements pro{ @Override public void text() { Syst ...

  2. 咦,好像可以自己做个webapi框架了-IRouteHandler的使用

    当我们学习到一定程度的时候,我们会想要去深入了解代码底层的东西,也更想拥有一个属于自己的框架,当然,博主也正是如此.本文可能成为编写一个webapi框架的开端.有研究MVC框架的朋友会发现,mvc框架 ...

  3. Vulkan Tutorial 12 Fixed functions

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 早起的图形API在图形渲染管线的许多阶段提供了默认的状态.在Vulkan中,从vie ...

  4. 玩转nodeJS系列:使用cluster创建nodejs单机多核集群(多进程)

    前言: nodejs提供了cluster集群(支持端口共享的多进程),cluster基于child_process,process二次封装,方便我们使用该功能实现单机nodejs的web集群. 1.c ...

  5. iOS,Android,Jave后台AES加密解密

    AES256 在iOS和Android上的相关代码: http://www.tuicool.com/articles/RVFbmmU 里面可以下载相关的代码. 我们遇到的问题是: 把Android的代 ...

  6. JDBC的批处理操作三种方式

    SQL批处理是JDBC性能优化的重要武器,批处理的用法有三种. package lavasoft.jdbctest; import lavasoft.common.DBToolkit; import ...

  7. 编码的秘密(python版)

    编码(python版) 最近在学习python的过程中,被不同的编码搞得有点晕,于是看了前人的留下的文档,加上自己的理解,准备写下来,分享给正在为编码苦苦了挣扎的你. 编码的概念 编码就是将信息从一种 ...

  8. Linux命令 查看文件内容

    cat [功能说明] 查看文件的内容  #cat本身是一个串接命令,把指定一个或多个源文件的内容,利用>符号重定向到目标文件中,如果不指定重定向文件,则默认在标准输出设备上显示.此时,可以利用c ...

  9. Paxos Made Simple(译)

    The Paxos algorithm, when presented in plain English, is very simple. 我叫Leslie Lamport,我最屌. 1. 简介 用于 ...

  10. Codeforces Round #419 (Div. 2)

    1.题目A:Karen and Morning 题意: 给出hh:mm格式的时间,问至少经过多少分钟后,该时刻为回文字符串? 思路: 简单模拟,从当前时刻开始,如果hh的回文rh等于mm则停止累计.否 ...