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/
目录下看到对应域名的文件
遇到过的两个证书生成出现的问题:
1.
报错提示:ImportError: No module named 'requests.packages.urllib3'运行以下命令后,成功解决pip install requests urllib3 pyOpenSSL --force --upgradepip install --upgrade --force-reinstall 'requests==2.6.0'复制代码
2.
报错提示: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服务。