Let's Encrypt
Let's Encrypt是由互联网安全研究小组(ISRG,一个公益组织)于2015年末推出的数字证书认证机构一个免费SSL证书,证书有90天的有效期,可以配置自动化更新证书,非常适合个人使用。
安装证书
安装certbot
yum install certbot
获取证书(standalone和webroot模式)
standalone 独立模式安装证书
certbot certonly --email youremail@gmail.com -d example.com
设置你的邮箱和服务域名,执行该命令即可生成证书。 tips:
- 生成会启用服务器的443端口,来验证域名是否与服务器绑定
- 确保你没有其他服务占用了443端口(如nginx)
webroot 模式在服务根目录下安装证书
certbot certonly --webroot -w /var/www/example -d example.com --email youremail@gmail.com
使用--webroot
模式会在你指定的/var/www/example
服务目录中创建.well-known
文件夹,这个文件夹里面包含了一些验证文件,certbot会通过访问example.com/.well-known/acme-challenge
来验证你的域名是否绑定的这个服务器。
证书生成成功以后可以在/etc/letsencrypt/live/
目录下看到对应域名的文件
遇到过的两个证书生成出现的问题:
报错提示:
ImportError: No module named 'requests.packages.urllib3'
运行以下命令后,成功解决
pip install requests urllib3 pyOpenSSL --force --upgrade
pip install --upgrade --force-reinstall 'requests==2.6.0'
复制代码
报错提示:
raise ImportError("'pyOpenSSL' module missing required functionality. "
ImportError: 'pyOpenSSL' module missing required functionality. Try upgrading to v0.14 or newer.
解决:
装高版本pyOpenSSL即可
复制代码
配置nginx启用HTTPS
使用standalone模式生成证书以后配和Nginx即可启用https Nginx配置
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name www.binlive.cn binlive.cn;
rewrite ^(.*)$ https://$host$1 permanent;
}
server {
listen 443 ssl;
server_name www.binlive.cn binlive.cn;
ssl on;
ssl_certificate /etc/letsencrypt/live/binlive.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/binlive.cn/privkey.pem;
ssl_ciphers 'AES128+EECDH:AES128+EDH:!aNULL';
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:10m;
ssl_prefer_server_ciphers on;
ssl_session_timeout 5m;
location /{
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $http_host; # required for docker client's sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;
}
}
}
复制代码
- 第一个server中监听80端口,把http请求改为https请求
- 第二个server中启用https服务,https服务的默认端口为443
- 在
ssl_certificate
和ssl_certificate_key
中指定生成的SSL的证书路径
自动更新SSL证书
Let’s Encrypt提供的证书有效期为90天,certbot renew
命令可以自动更新证书
crontab 定时任务
执行crontab -e
即可编辑定时任务,在编辑中输入下面命令即可 15 3 * */2 * certbot renew --pre-hook "nginx -s stop" --post-hook "nginx"
这段定时命令为每隔两月凌晨 3:15执行命令, --pre-hook 意思为执行命令之前的一步操作,更新证书需要先停止Nginx服务,在更新完成后会自动执行--post-hook 后面的命令,开启Nginx服务。