HTTPS
的时代, HTTPS 证书
目前应用普遍, 发展迅速. 相较于明文传输的 HTTP
, HTTPS
更加安全. HTTPS
即 Hypertext Transfer Protocol Secure
, 因为其安全层使用的是 TLS/SSL
, 所以 HTTPS
也能够称为 HTTP over TLS
或 HTTP over SSL
. 关于 HTTPS
证书的分类, 能够参考这篇博客HTTPS 证书
须要向国际公认的证书证书认证机构 Certificate Authority (CA) 申请.HTTPS
证书, 而后将其部署在咱们的网站上.www.awesome.com
在前文的基础上, 咱们只需增长 acme.sh 这个工具. 它的中文文档在这里. 安装 acme.sh
的过程很简单, 在 Terminal
中输入以下命令 acme.sh
便可.html
curl https://get.acme.sh | sh
咱们可使用 http
方式来验证咱们对域名的全部权.python
若是只申请单域名证书 (Single Domain Certificate, 如单域名 www.awesome.com
), 那么在 Terminal
中运行以下命令便可git
acme.sh --issue -d www.awesome.com --standalone
acme
会在当前目录生成一个验证文件, 而后运行一个监听 80 端口的 server, 若是 Let's Encrypt
成功地经过域名下载了这个文件, 就验证了咱们对域名的全部权, 就能够签发证书了.github
咱们也能够运行一个 file server
监听 80
端口web
cd ~/webapp python3 -m http.server 80
而后在另外一个 Terminal
里输入以下命令flask
cd ~ acme.sh --issue -d www.awesome.com --webroot ~/webapp
咱们也能够经过 dns
方式来验证咱们对域名的全部权. 若是要申请通配符证书 (Wildcard Certificate, 如 *.awesome.com
形式的通用域名), 则须要用 dns
方式进行验证.api
首先咱们在 Godaddy
上申请开发者 API key & secret
, 而后参考 acme.sh
的文档 readme 和 dnsapi, 执行以下命令浏览器
export GD_Key="xxxxxxxx" export GD_Secret="yyyyy" acme.sh --issue --dns dns_gd -d "*.awesome.com" -d awesome.com
若是一切顺利, 咱们会发现 Godaddy 的 DNS txt record
中多了一条 _acme-challenge
记录. 接下来acme
会先等待 120s
以待新的纪录生效, 而后通知 Let's Encrypt
验证咱们对域名的全部权, 验证经过后, Let's Encrypt
会为咱们签发证书.安全
对于单域名证书, 根据 acme 的文档, 咱们须要执行如下命令, 将证书和公钥放到 ~/ssl/
文件夹中bash
acme.sh --installcert -d www.awesome.com --key-file ~/ssl/server.key --fullchain-file ~/ssl/server.cer
对于通配符证书, 操做也是相似的, 把域名换成 "*.awesome.com"
就行了
acme.sh --installcert -d "*.awesome.com" --key-file ~/ssl/server.key --fullchain-file ~/sslwebsite/server.cer
而后, 在以前编写的 server 中, 咱们须要引入证书和公钥, 从而将明文的消息用 ssl/tls 包裹起来. 根据 Stack Overflow, 这篇文章下面的 Comments, 以及 werkzeug docs, 咱们须要在 app.run()
中加上 ssl_context=('~/ssl/server.cer', '~/ssl/server.key')
参数, 再把监听端口改成 443
便可:
# class IndexHandler(...): # ... if __name__ == '__main__': app.add_url_rule('/', view_func=IndexHandler.as_view('index')) context = ('./server.cer', './server.key') app.run(port=443, host='0.0.0.0', debug=True, threaded=True, ssl_context=context)
HTTPS
证书已经申请和部署完成了. 可是咱们的 server
目前还存在一个问题, 就是只能访问 https://www.awesome.com
, 而原来的 http://www.awesome.com
已经没法访问了, 由于咱们的 server
如今只能监听 443
端口而不能监听 80
端口. 下一篇文章, 咱们将解决这个问题, 方法是另外写一个 server
来监听 80
端口, 并经过 redirect
将 http
服务重定向为 https
. 同时, 咱们还将学习如何使用 HSTS
, 使浏览器默认以更安全的 https
的方式访问咱们的网站.