Let’s Encrypt是一个公共且免费的SSL项目。SSL,英文全称Secure Sockets Layer,为Netscape所研发,用以保障在Internet上数据传输的安全,利用数据加密(Encryption)的技术,可确保数据在网络上的传输过程中不会被截取及窃听。简单的说,就是使用SSL加密http,来保证网站安全性和防止信息泄露。
安装 certbot获取证书
注意:安装证书之前要保证网站能通过http域名访问,不然申请过程会报错。
yum install certbot
certbot certonly --webroot -w /var/test/ralap -d ralap.net -d www.ralap.net
/var/test/ralap为网站根目录,后面跟多个域名。根据提示输入邮箱等确认信息。
Let’s Encrypt证书的生成之后,在“/etc/letsencrypt/live/ralap/”域名目录下有4个密钥证书相关文件,我们需要配置其中两个到nginx。
fullchain.pem - Nginx所需要ssl_certificate文件
privkey.pem - 安全证书KEY文件
安装certbot可能报错,可以在网上找到解决方法。
ImportError: No module named 'requests.packages.urllib3'
解决方法:
pip install --upgrade --force-reinstall 'requests==2.6.0' urllib3
修改nginx配置
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name www.ralap.net ralap.net;
root /var/test/ralap;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
#增加的部分
location / {
rewrite ^(.*) https://$host$1 permanent;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
Settings for a TLS enabled server.
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name www.ralap.net ralap.net;
root /var/test/ralap;
ssl_certificate "/etc/letsencrypt/live/ralap.net/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/ralap.net/privkey.pem";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
#增加的部分
location ~ /.well-known {
allow all;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
在原来http的server中修改
将http的连接重定向到https
location / {
rewrite ^(.*) https://$host$1 permanent;
}
在https的server中修改
ssl_certificate "/etc/letsencrypt/live/ralap.net/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/ralap.net/privkey.pem";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
location ~ /.well-known {
allow all;
}
重新启动nginx
systemctl restart nginx
再打开网站就可以看到网站是加密过的了。
证书自动续期
Let’s Encrypt的证书只有3个月有效期,可以设置任务自动续期。
crontab -e
crontab执行时可能会报错,继续执行就可以了。
在打开的文件中输入
30 4 1 certbot renew --renew-hook "systemctl restart nginx" --quiet > /dev/null 2>&1 &
设置了每周一凌晨4点30自动更新证书,如果更新成功就自动重启nginx服务,证书在到期前30天内才能更新,多余的更新会自动忽略掉的,每周更新还有一个好处是更新可能会失败,这样最多还有4次的尝试机会来保证不会过期。