为什么要使用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.Java中的包(package) 2.1 包,对应到磁盘中的文件夹 2.2 新建一个class,默认保存在缺省包中 2.3 声明包的关键字:package package语句,置顶位置 2.4 导 ...

  2. Linux 多个JDK的版本 脚本切换

    这里是在CentOS 系统下配置多个版本之间的切换 1.到官网下载jdk7和jdk8 地址:http://www.oracle.com/technetwork/cn/java/javase/downl ...

  3. Vue基础概念,学习环境等

    前提: 你已有 HTML.CSS 和 JavaScript 中级前端知识. 概念: Vue.js(读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vu ...

  4. redis五种数据类型

    string Redis的字符串和其他编程语言或者其他键值存储提供的字符串非常相似. 命令 行为 GET 获取存储在给定键中的值 SET 设置存储在给定键中的值 DEL 删除存储在给定中的值(这个命令 ...

  5. html5中cookie介绍,封装以及添加,获取,删除

    cookie是储存在用户本地终端上的数据. 在我们登陆网站时有记录密码,也有时间限制比如说7天,5天等等这都是我们利用cookie来写的, 这就是利用了cookie的会话周期,但cookie同时又是不 ...

  6. lftp的用法

    lftp是Linux下的一个ftp工具,支持ftp, ftps, http, https, hftp, fish, sftp, file, bittorrent等协议(支持https 和 ftps,必 ...

  7. linux 下用renameTo方法修改java web项目中文件夹名称问题

    经测试,在Linux环境中安装tomcat,然后启动其中的项目,在项目中使用java.io.File.renameTo(File dest)方法可行. 之前在本地运行代码可以修改,然后传到Linux服 ...

  8. mysql基于binlog回滚工具_flashback(python版本)

        update.delete的条件写错甚至没有写,导致数据操作错误,需要恢复被误操作的行记录.这种情形,其实时有发生,可以选择用备份文件+binlog来恢复到测试环境,然后再做数据修复,但是这样 ...

  9. Discuz添加自定义模板广告

    在做Discuz中广告的时候碰到个大问题,现在我需要做一个轮播的通屏广告位,调用广告图片的代码应该是以下代码:<ul>     <li style="background: ...

  10. JS如何实现真正的对象常量

    前言 众所周知ES6新增的const关键字可以用来声明常量,但是它只对基本数据类型生效(Number.String.Boolean等),那如果我们想声明一个常量对象呢?该如何实现,Object内置对象 ...