Web 开发学习笔记(3) --- 申请和部署HTTPS证书

简介

  • 如今已经进入 HTTPS 的时代, HTTPS 证书 目前应用普遍, 发展迅速. 相较于明文传输的 HTTP, HTTPS 更加安全.


  • HTTPSHypertext Transfer Protocol Secure, 因为其安全层使用的是 TLS/SSL, 所以 HTTPS 也能够称为 HTTP over TLSHTTP over SSL. 关于 HTTPS 证书的分类, 能够参考这篇博客


  • HTTPS 证书 须要向国际公认的证书证书认证机构 Certificate Authority (CA) 申请.


  • 接下来, 咱们将使用自动化证书管理工具 acme.sh 为咱们的域名申请 Let's Encrypt 颁发的 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 的文档 readmednsapi, 执行以下命令浏览器


      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 端口, 并经过 redirecthttp 服务重定向为 https. 同时, 咱们还将学习如何使用 HSTS, 使浏览器默认以更安全的 https 的方式访问咱们的网站.


参考连接

相关文章
相关标签/搜索