写在前面

  • 这里面我主要是自己独立的服务器添加 HTTPS 支持,关于对 GitHub 个人站点添加的以后再写。
  • 我的笔记和操作使用的是免费的域名和免费的 HTTPS 证书,但是操作对于所有的来说都是一样的。
  • 证书基于 TrustAsia, 别的都差不多的。
  • VPS 上用的 LNMP 建站。

用到的站点和准备工作

  • 服务器: 搬瓦工
  • 域名供应商:Freenom
  • HTTPS 证书支持:FreeSSL.org
  • 各个网站的账号和权限,域名解析这里就不写了,可以参考另一篇文章

操作步骤

  1. 首先一定要做的是给自己的网址进行解析好,也就是通过网址能够直接访问到网站 . 然后来到 FreeSSl 这个网站,网站操作很直白,首页填入你自己的域名(一般都是自己拥有的顶级域名,类似于 fancyking.ml 这种,而不是二、三级域名,www 可以在以后 301 重定向过来)。 TrustAsia提供的是双域名支持, Let's Encrypt 提供的是多域名的支持,目前是最好申请 V2 的多域名通配符版本。我这里拿的是亚洲诚信。
  2. 之后,输入邮箱,他会根据你的邮箱去给你证书,证书的生成参数没有特殊需求的话用他的默认参数就行,有的话就按照需求。
  3. 他会让你去证明网站的归属权,这里我选择的是 DNS 的验证证书,所以我需要把 DNS 域名的解析加上一条 TXT 记录,记录的值他会给你,按照他说的配置好 DNS 那边就好 (如果是国外的 DNS 解析,就像 FreeNom,生效可能比较慢,这个一种方法就是使用其他的解析服务,比如说 DNSPOD+或者 CLOUDXNS 或者其他的方法来加速解析生效,要不你就等一会儿,反正验证失败之后一天内也可以再次在订单列表中验证,但是注意尽量间隔 10 分钟以上)
  4. 验证成功之后你就会发现你可以下载证书文件(私钥自己看着添加吧,我没加)了,在订单列表中,下载证书,应该会得到压缩包:chain.zip . 第一次下载的包里面会有两个文件,一个 chain.pemprivate.key,(得到 crt 文件的一样,就是类型不同,其中 chain.pem 是我们的证书文件,它是一个包含中间证书的证书链文件。所以,当你的服务器需要三个文件时,你可以将 chain.pem 拆分为两个文件,比如 cert.pem(前部分) 和 ca.pem(后部分)。pem 是兼容 crt 的,也就是 pem 重命名就可以得到有效的 crt 文件) (注意的是,key 文件只有第一次下载的时候有!!!丢失了无法寻找,他网站那边也不留下!!!) . 上传证书文件到服务器,可以不是当前网站目录,在 VPS 上就好。
  5. 按照站点建立方式的不同,使自己的站点证书指向为当前服务器的绝对地址!下面按照我的 LNMP 给出。
  6. 一种是有了 SSL 证书再去建站,这个在 LNMP 上配置很简单,因为是引导式船创建站点,所以他会问你是不是要求支持 SSL,这个时候,会有两个选项,一个是自动去 Let's Encrypt 得到证书,这种就是傻瓜式的,输入一个邮箱就好;另一种就是自己获取的 SSL 证书,填入绝对路径就好
  7. 另一种就是给现有的网站加入 SSL,也很简单,使用命令 lnmp ssl add 然后按照步骤操作就好了。安装需要等一会儿。

强制使用 HTTPS 访问

经过上面的配置,我发现通过 HTTPS 的域名访问确实很正常, 但是一但输入的是没有加 HTTPS 的域名的话,还是不会验证 SSL 证书,所以需要手动的强制都走 https 的域名访问,方法 301 重定向如下:

  1. /usr/local/nginx/conf/vhost 目录下,找到自己的站点配置文件 比如我的就是 fancyking.ml.conf . 然后在不是 SSL 的那个 server(一般是第一个),里面,加上一行,位置如图片所示: 第七行的 return 301 https……

blob.jpg

关于网站 SSL 验证更加严谨

  • 这里主要是根据 MySSL 的评测进行的。如果仅仅经过上面的配置评测并不是 A+级别的,也不都是可信或者全绿,既然都上 SSL 了,那就把他弄的好点吧。

我的网站的评测信息 : HERF + 关于 TSL 协议版本 目前 PCIDSS已经将 TLSv1.0 判定为不合规,所以为了增加网站安全,适合行业标准,禁用 TLSv1.0 协议,默认指定主流 2.0 协议,在 Nginx 的 conf 文件 中加入下面的语句

ssl_protocols                TLSv1.1 TLSv1.2 TLSv1.3;

现在主流的浏览器都支持更高版本的 TLS,具体业务不支持的可以在网站评测的客户端握手模拟上看到

  • 开启 HSTS

HSTS 是 TLS 的安全保护,保证在配置或者实现错误的情况下,网站仍然按照高安全性访问,具体的功能和不足可以看维基百科 开启 HSTS 的话,依然是在 conf 文件加入一句话,如下

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload

上述语句加入生效后,用户在访问过一次网站接收到证书信息和响应头之后,在接下来指定的时间(31536000 即一年)中,用户只能通过 HTTPS 访问网站,比重定向更加安全,并且在指定时间内如果网站证书出了问题,用户无法绕过浏览器警告去访问网站

Let’s Encrypt 证书续约

  • 我一开始申请证书的地方无法在不到期的情况下进行续约认证,所以这次学习了一下代码续约,用到的是 Certbot,项目在Github,帮助文档在Docs
  • 安装是交互式的,一般不会出大的问题,就简单说几种情况
    • 参数
      • run 获取并安装证书到当前的域名和网站目录
      • certonly 获取和续约证书,不进行安装
      • renew 在证书未过期时,续约之前获取的所有证书
      • -d 后面跟一个网址,每一个域名前面都必须有-d
      • --standlone 使用独立的 web server 来验证
    • 续约或者获取过程有时会监听 80 端口,如果一直出问题的话,先把 Nginx 关了试一下
    • 我最后使用的成功续约的命令如下 ./certbot-auto certonly --renew-by-default --email my_email -d fancyking.ml -d www.fancyking.ml
    • 证书无论是通过 Certbot 还是在别的网站上获取了,在 Nginx 的配置文件中指定 SSL 的证书公钥私钥存放地址即可,注意开放 443,强行使用 HTTPS 看上面的操作,指定证书语句 ssl_certificate /etc/letsencrypt/live/lfancyking.ml/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/fancyking.ml/privkey.pem;

标签: SSL, 网站

添加新评论