— 2018.08.15更新

推荐使用acme.sh,教材参考:申请Let’s Encrypt通配符HTTPS证书

简单易用,且没有cerbot的各种安装问题,连证书的自动更新都不必操心!

关于HTTPS

引维基百科的说法

超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS)是一种网络安全传输协议。在计算机网络上,HTTPS经由超文本传输协议进行通信,但利用SSL/TLS来对数据包进行加密。HTTPS开发的主要目的,是提供对网络服务器的身份认证,保护交换数据的隐私与完整性

HTTPS的主要思想是在不安全的网络上创建一安全信道,并可在使用适当的加密包和服务器证书可被验证且可被信任时,对窃听和中间人攻击提供合理的防护。

关于TLS/SSL

依然引用维基百科

传输层安全协议(英语:Transport Layer Security,缩写:TLS),及其前身安全套接层(Secure Sockets Layer,缩写:SSL)是一种安全协议,目的是为互联网通信,提供安全及数据完整性保障

相关算法

TLS利用密钥算法在互联网上提供端点身份认证与通讯保密,其基础是公钥基础设施。

TLS包含三个基本阶段:

  • 对等协商支持的密钥算法
  • 基于非对称密钥的信息传输加密和身份认证、基于PKI证书的身份认证
  • 基于对称密钥的数据传输保密

国内现状

由于运营商的劫持,国内公司不堪其扰,纷纷将全站采用https

安装配置

  • wget https://dl.eff.org/certbot-auto
  • chmod a+x ./certbot-auto
  • ./certbot-auto –help all
  • ./certbot-auto certonly –standalone –email wwj@example.com -d www.just4fun.site (可以使用二级域名)

如果最后一条命令报错:setuptools pkg_resources pip wheel failed with error code 2

解决方案是:

1
2
3
4
5
sudo apt-get install letsencryp

sudo apt-get purge python-virtualenv python3-virtualenv virtualenv

sudo pip install virtualenv

需要注意的是,验证的时候保证80/443端口对外开放,且不被占用,如果这些端口实现被nginx占用,先停掉nginx

完成后查看生成的证书:

  • sudo tree /etc/letsencrypt/live/

证书续签

证书的失效期是3个月,

续签的命令为:

  • ./certbot-auto renew 或
  • ./certbot-auto renew –standalone –pre-hook “service nginx stop” –post-hook “service nginx start”

可以用cron添加一个定时任务,自动续签。

将证书用于nginx

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
:::text

upstream minio_server {
            server 127.0.0.1:9000 fail_timeout=0;
    }

# 监听 HTTPS 请求
server {
        #server_name example.com;
        listen 8443 ssl;

        # TLS 基本设置
        ssl_certificate /etc/letsencrypt/live/www.just4fun.site/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/www.just4fun.site/privkey.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        # 网站的其它设置不变
        # [...]
  location / {
        try_files $uri @proxy_to_app;
  }

  # No basic auth security on the heartbeat url, so that ELB can use it


  location @proxy_to_app {
    proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
    proxy_set_header X-Forwarded-Port $http_x_forwarded_port;
    proxy_set_header X-Forwarded-For $http_x_forwarded_for;
    proxy_set_header Host $http_host;

    proxy_redirect off;
    proxy_pass http://minio_server;
  }
}

当然我们可以将任意端口用于https,不过证书无法移植到其他服务器(可能是我还不熟悉)

访问https://www.just4fun.site:18443,一切正常(我在青云的路由器上将8443端口映射为18443)

参考