about 1 results (0.02 seconds)

如何免费的让网站启用HTTPS

by LauCyun Sep 12,2017 17:39:48 12,602 views

在16年沃通事件之前,我一直用的是沃通的SSL证书,沃通事件之后我用的是腾讯云和第三方合作推出的免费一年的证书GeoTrust DV SSL,每个证书对应一个独立的域名(https://xx.abc.com),可以申请多个证书。今天为大家提供Let's Encrypt这个免费的解决方案。

很早之前我就在关注 Let's Encrypt 这个免费、自动化、开放的证书签发服务。Let's Encrypt 是一个于2015年推出的数字证书认证机构,将通过旨在消除当前手动创建和安装证书的复杂过程的自动化流程,为安全网站提供免费的SSL/TLS证书。这是由互联网安全研究小组(ISRG – Internet Security Research Group,一个公益组织)提供的服务。主要赞助商包括电子前哨基金会Mozilla基金会Akamai以及Cisco等公司(赞助商列表)。

好了,废话不多说了,开始吧!这篇文章也主要讲的是通过Let's Encrypt + Nginx来让网站升级到HTTPS。

1 环境

为你的网站来安装一个证书十分简单,只需要使用电子子前哨基金会EFF的Certbot,就可以完成。

在那个机器上图标下面,选择一下你用的中间件和操作系统。比如,我选的是:Nginx和Debian 9 (stretch),如图1。


图1 choose your server software and the system

2 获取免费证书

安装Certbot客户端

$ sudo apt-get install certbot

获取证书:

$ certbot certonly --webroot -w /var/www/example -d laucyun.com -d www.laucyun.com

这个命令会为http://laucyun.comhttp://www.laucyun.com这两个域名生成一个证书,使用--webroot模式会在/var/www/example中创建.well-known文件夹,这个文件夹里面包含了一些验证文件,certbot会通过访问http://laucyun.com/.well-known/acme-challenge来验证你的域名是否绑定的这个服务器。这个命令在大多数情况下都可以满足需求。

但是,有些时候我们的一些服务并没有根目录,这时候使用--webroot就走不通了。certbot还有另外一种模式--standalone, 这种模式不需要指定网站根目录,他会自动启用服务器的443端口,来验证域名的归属。我们有其他服务(例如Nginx)占用了443端口,就必须先停止这些服务,在证书生成完毕后,再启用。

$ certbot certonly --standalone -d laucyun.com -d www.laucyun.com

证书生成完毕后,我们可以在/etc/letsencrypt/live/目录下看到对应域名的文件夹,里面存放了指向证书的一些快捷方式。

  • 错误信息:
    Attempting to renew cert from /etc/letsencrypt/renewal/laucyun.com.conf produced an unexpected error: At least one of the required ports is already taken.. Skipping.
    这是因为我的http://laucyun.com生成证书的时候使用的是--standalone模式,验证域名的时候,需要启用443端口,这个错误的意思就是要启用的端口已经被占用了。 这时候我必须把Nginx先关掉,才可以成功。果然,我先运行service Nginx stop运行这个命令,就没有报错了,所有的证书都刷新成功。

这时候我们的第一生成证书已经完成了,接下来就是配置我们的web服务器,启用HTTPS。

3 Nginx配置启用HTTPS

到这里已经成功一大半了,只需要配置Nginx支持刚刚生成的证书。

配置可以参考:Mozilla SSL Configuration Generator,这是Mozilla搞得一个HTTPS配置文件自动生成器,支持Apache,Nginx等多种服务器。按照这个配置文件,选择Intermediate的兼容性。

这里生成的配置文件是业界最佳实践和结果,让Nginx打开了各种增加安全性和性能的参数:

server {
    listen 80 laucyun.com;
    listen [::]:80 laucyun.com;

    # Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate     /etc/letsencrypt/live/laucyun.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/laucyun.com/privkey.key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

    # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
    ssl_dhparam /opt/ssl/nginx/dhparam.pem;

    # intermediate configuration. tweak to your needs.
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    ssl_prefer_server_ciphers on;

    # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
    add_header Strict-Transport-Security max-age=15768000;

    # OCSP Stapling ---
    # fetch OCSP records from URL in ssl_certificate and cache them
    ssl_stapling on;
    ssl_stapling_verify on;

    ## verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /etc/letsencrypt/live/laucyun.com/root_ca_cert_plus_intermediates;

    resolver <IP DNS resolver>;
     
    # your website configure
    ....
}

重点关注:

  • listen 443 ssl http2:作用是启用Nginx的http_v2_module模块支持HTTP2,Nginx版本需要高于1.9.5,HTTP2 具有更快的 HTTPS 传输性能,非常值得开启(关于性能你可以看一下这篇文章)。
  • ssl_certificatessl_certificate_key:分别对应/etc/letsencrypt/live/laucyun.com/fullchain.pem/etc/letsencrypt/live/laucyun.com/privkey.pem,这2个文件是之前就生成好的证书和密钥。
  • ssl_dhparam通过下面命令生成:
    $ sudo mkdir /opt/ssl/nginx/
    $ sudo openssl dhparam -out /opt/ssl/nginx/dhparam.pem 2048
  • ssl_trusted_certificate:需要下载Let's Encrypt的Root Certificates,不过根据Nginx官方文档所说,ssl_certificate如果已经包含了intermediates就不再需要提供ssl_trusted_certificate,这一步可以省略:
    $ cd /etc/letsencrypt/live/laucyun.com 
    $ sudo wget https://letsencrypt.org/certs/isrgrootx1.pem 
    $ sudo mv isrgrootx1.pem root.pem 
    $ sudo cat root.pem chain.pem > root_ca_cert_plus_intermediates
  • resolver:作用是resolve names of upstream servers into addresses。 在这个配置中,resolver是用来解析OCSP服务器的域名的,建议填写你的VPS提供商的DNS服务器。

Nginx配置完成后,重启后,用浏览器测试是否一切正常。

$ nginx -s reload

4 自动更新 SSL 证书

配置完这些过后,我们的工作还没有完成。 Let's Encrypt 提供的证书只有90天的有效期,我们必须在证书到期之前,重新获取这些证书,certbot给我们提供了一个很方便的命令,那就是certbot renew

所以,你还要设置上自动化的更新脚本,最容易的莫过于使用crontab了。

新建一个文件/home/certbot-auto-renew-cron,加入如下内容(每隔两个月的凌晨2:15执行更新操作):

15 2 * */2 * /usr/bin/certbot renew --pre-hook "/usr/sbin/service nginx stop" --post-hook "/usr/sbin/service nginx start"

说明:

  • crontab中有六个字段,其含义如下:
    • 第1个字段:分钟 (0-59)
    • 第2个字段:小时 (0-23)
    • 第3个字段:日期 (1-31)
    • 第4个字段:月份 (1-12 [12 代表 December])
    • 第5个字段:一周当中的某天 (0-7 [7 或 0 代表星期天])
    • 第6个字段:计划执行的脚本或命令的名称
  • --pre-hook:这个参数表示执行更新操作之前要做的事情,因为我有--standalone模式的证书,所以需要停止Nginx服务,解除端口占用。
  • --post-hook:这个参数表示执行更新操作完成后要做的事情,这里就恢复Nginx服务的启用

最后我们用crontab来启动这个定时任务:

$ crontab certbot-auto-renew-cron

最后,用专业在线工具Qualys SSL Labs测试你的服务器 SSL 安全性,它提供了全面的 SSL 安全性测试,填写你的网站域名(如图2),给自己的 HTTPS 配置打个分。


图2 SSL Server Test

至此,整个网站升级到HTTPS就完成了。 总结一下我们需要做什么:

  • 获取Let's Encrypt免费证书
  • 配置Nginx开启HTTPS
  • 定时刷新证书

参考文档:

...

Tags Read More..