今天(2017/8/1),cnbeta上报道Chrome计划在2018年取消对赛门铁克CA的信任。我的网站之前的ca证书是从阿里云和腾讯云申请的免费证书,都是从赛门铁克签发的。神仙打架,凡人遭殃。有了这档子事,我就开始着手更换一个可靠的证书。经过再三筛选,最终决定使用Let’s encrypt提供的证书(免费)。原因是这家机构是大学背景,而且谷歌参与出资。下面是具体的操作过程。

安装 ACME client

按照官方推荐,采用Certbot作为ACME客户端。

  • 访问Certbot网站,选择Http服务器和操作系统,会自动提示对应的Certbot客户端。我的服务器是Nginx+Centos 6,根据提示做以下操作

    wget https://dl.eff.org/certbot-auto
    chmod a+x certbot-auto

获取证书

  • 第一次签发证书的命令很慢很慢,需要安装许多依赖包和python组件。如果长久没反应,杀掉重来。多试几次。

    sudo ./certbot-auto --nginx certonly  
    # 建议带上certonly参数,否则程序会直接修改nginx配置,我是不放心的- -#

  • 运行成功后,会提示你输入一些信息,比如邮箱用于接受一些通知,最重要的是需要你启用https的站点。程序会自动扫描nginx的配置文件,获取当前的站点列表,一次可以选择多个站点。

  • 最终在/etc/letsencrypt生成一些目录。而证书文件放在/etc/letsencrypt/live/lefer.cn/目录里。

    [root@iZ280imktowZ letsencrypt]# ls
    accounts archive csr keys live options-ssl-nginx.conf renewal
    [root@iZ280imktowZ lefer.cn]# ls
    cert.pem chain.pem fullchain.pem privkey.pem README
    [root@iZ280imktowZ lefer.cn]# more README
    This directory contains your keys and certificates.

    `privkey.pem` : the private key for your certificate.
    `fullchain.pem`: the certificate file used in most server software.
    `chain.pem` : used for OCSP stapling in Nginx >=1.3.7.
    `cert.pem` : will break many server configurations, and should not be used
    without reading further documentation (see link below).

    We recommend not moving these files. For more information, see the Certbot
    User Guide at https://certbot.eff.org/docs/using.html#where-are-my-certificates.

配置Nginx

  • 拿到证书文件后,修改nginx的站点配置文件。核心配置项应如下。所有开启Https的站点引用相同的pem。据说年底letsencrypt会出泛域名的免费ca证书。

        ssl on;
    ssl_certificate /etc/letsencrypt/live/lefer.cn/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/lefer.cn/privkey.pem;
    ssl_session_cache shared:le_nginx_SSL:1m;
    ssl_session_timeout 1440m;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    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";
  • 重启nginx服务,看看小锁的证书信息吧。

    ca

  • 可以看到有效期仅仅是3个月。好在Let’s Encrypt提供了自动续约的功能。我们通过crontab去自动续约。

    [root@iZ280imktowZ lefer.cn]# crontab -l
    # 官方建议每隔12小时续约一次
    0 */12 * * * ./web/ca/certbot-auto renew > /dev/null 2>&1

END