form1.cn
Make a little progress every day

ContOS7中Let's Encrypt永久免费SSL证书教程

20th of April 2018 Linux Command 2775

Let's Encrypt免费SSL证书的出现,也会对传统提供付费SSL证书服务的商家有不小的打击。到目前为止,Let's Encrypt获得IdenTrust交叉签名,这就是说可以应用且支持包括FireFox、Chrome在内的主流浏览器的兼容和支持,虽然目前是公测阶段,但是也有不少的用户在自有网站项目中正式使用起来。

虽然目前Let's Encrypt免费SSL证书默认是90天有效期,但是我们也可以到期自动续约,不影响我们的尝试和使用。


第一、安装Let's Encrypt前的准备工作

在服务器上部署Let's Encrypt免费SSL证书之前,需要系统支持Python2.7以上版本以及支持GIT工具。

如果你的服务器没有自带Python或者版本过低,你需要进行安装或升级。

GIT安装:"apt-get -y install git"或者"yum -y install git-core


第二、快速获取Let's Encrypt免费SSL证书

获取证书和布局还是比较复杂的,Let's Encrypt肯定是考虑到推广HTTPS的普及型会让用户简单的获取和部署SSL证书,所以可以采用下面简单的一键部署获取证书。


git clone https://github.com/letsencrypt/letsencrypt #时间有点久
cd letsencrypt #进入目录


基本用法

./letsencrypt-auto certonly --standalone --email admin@form1.cn -d form1.cn -d www.form1.cn 

--standalone 用这个命令无需指定站点目录和提前解析
--email 最好是真实的,因为证书到期会收到邮件提醒
-d 域名


如果你想要生成泛域名的证书,使用以下命令:

./letsencrypt-auto certonly --webroot -d 'form1.cn,www.form1.cn' -w /datafile/form1/web

-d '这里泛域名用逗号隔开'
-w 需要指定域名访问的站点根目录,当然你得先把域名解析到改服务器


如果有你不同的域名解析到服务器,你可以执行多次该命令:

./letsencrypt-auto certonly --webroot -d 'newsite.com,www.newsite.com' -w /var/www/newsite/public


然后执行上面的脚本,我们需要根据自己的实际站点情况将域名更换成自己需要部署的。

我用的是nginx代理服务器


注意:如果nginx在启动的情况下,可能生成不了证书,请关闭nginx,在执行上方脚本。


执行脚本后会输一个紧急通知邮件,还会出现选项 (A)gree  或 (C)ancel  ,填A、Y按Enter键即可


第三、Let's Encrypt免费SSL证书获取与应用

在完成Let's Encrypt证书的生成之后,我们会在"/etc/letsencrypt/live/form1.cn/"域名目录下有4个文件就是生成的密钥证书文件。

cert.pem  - Apache服务器端证书
chain.pem  - Apache根证书和中继证书
fullchain.pem  - Nginx所需要ssl_certificate文件
privkey.pem - 安全证书KEY文件


我使用的Nginx环境,那就需要用到fullchain.pem和privkey.pem两个证书文件,文件路径最好不要移动。

ssl_certificate /etc/letsencrypt/live/form1.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/form1.cn/privkey.pem;


在Nginx环境中,只要将对应的ssl_certificate和ssl_certificate_key路径设置成我们生成的2个文件就可以,最好不要移动和复制文件,因为续期的时候直接续期生成的目录文件就可以,不需要再手工复制。


第四、解决Let's Encrypt免费SSL证书有效期问题

当我们在服务器上维护多个站点时,我们真的应该依赖某种方法自动更新我们的 Let's Encrypt 证书。没人愿意每三个月去手动更新一次。很幸运,Let's Encrypt 官方提供了一段代码来处理这个问题 ,而我们只需要创建一个计划任务,采用 cron 定时任务命令定期自动运行(这段代码) 。现在,我们创建一个文件  /etc/letsencrypt/auto_renew.sh。把下面的代码添加进来,你也可以自己做些修改,实现你想要的功能。

#!/bin/sh  
# This script renews all the Let's Encrypt certificates with a validity < 30 days  
  
if ! /opt/letsencrypt/letsencrypt-auto renew > /var/log/letsencrypt/renew.log 2>&1 ; then    
    echo Automated renewal failed:  
    cat /var/log/letsencrypt/renew.log  
    exit 1  
fi    
nginx -t && nginx -s reload


现在将以上的脚本添加到计划任务, 执行 sudo crontab -e 添加下面一行代码:

@daily  /etc/letsencrypt/auto_renew.sh  


第五、关于Let's Encrypt免费SSL证书总结

A - 域名DNS和解析问题。在配置Let's Encrypt免费SSL证书的时候域名一定要解析到当前VPS服务器,而且DNS必须用到海外域名DNS,如果用国内免费DNS可能会导致获取不到错误。

B - 安装Let's Encrypt部署之前需要服务器支持PYTHON2.7以及GIT环境,要不无法部署。

C - 需要关闭nginx代理服务器,执行生成证书命令才能生成证书成功。

D - Let's Encrypt默认是90天免费,需要手工或者自动续期才可以继续使用。


第六、一个nginx部署的例子,环境是lnmp

server {
    listen 80;
    server_name api.form1.cn admin.form1.cn;
    rewrite ^(.*)$  https://$host$1 permanent;
}

server {
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/form1.cn/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/form1.cn/privkey.pem;
    
    server_name api.form1.cn admin.form1.cn;
    
    location \
    {
        if (!-e $request_filename) {
            rewrite  ^/(.*)index.php(.*)$  $1/index.php?s=$2  last;
            rewrite  ^(.*)$  /index.php?s=$1  last;
            break;
        }
    }
    
    root /datafile/form1;
    index index.html index.php;
    
    error_page  404 /404;
    access_log /var/log/nginx/www.log;
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
    }
    location ~ .*\.(js|css)?$
    {
        expires      12h;
    }
    include "vhost/conf.phpfix"; #php-代理设置
}


只有http设置

server {
    listen 80;
    server_name form1.com;
    root /datafile/form1/public;

    location /
        {
            if (!-e $request_filename) {
                rewrite  ^/(.*)index.php(.*)$  $1/index.php?s=$2  last;
                rewrite  ^(.*)$  /index.php?s=$1  last;
                break;
            }    
        }

    index index.php index.html;
    error_page  404 /404;
    access_log /home/wwwlogs/form1.log;

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }

include "vhost/conf.phpfix";

}


php-代理设置

location ~ \.php {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param  PATH_INFO          $fastcgi_path_info;
        include fastcgi.conf;
        fastcgi_pass    unix:/tmp/php-cgi.sock;
}


参考地址1:https://www.cnblogs.com/jtnote/p/7155687.html

参考地址2:https://blog.csdn.net/hj7jay/article/details/55504176