如何將http网站免费升级成https协议 使用encrypt 生成 签名。HTTPS的好处还有很多,但仅此这一条,就够我们花心思去升级我们的博客系统了。
了解Let's Encrypt
Let's Encrypt 就是一个 证书。如果要启用HTTPS,我们就需要从授权机构(以下简称CA) 处获取一个证书, 而从 Let's Encrypt ,我们可以获得网站域名的免费的证书。
Certbot 简介
Certbot 是Let's Encrypt官方推荐的获取证书的客户端,可以帮我们 自动 获取免费的Let's Encrypt 证书。
Certbot 是支持所有 Unix 内核的操作系统的,本文的例子是基于CentOS 8来讲解的。
获取免费证书
1、 安装Certbot客户端
centos 采用yum 安装 , 简单快捷 。 你可以采用其他模式安装 。
yum install certbot
2、使用命令为域名生成签证 ;
生成https签证:
certbot certonly --webroot -w /your_local_dir/wwwroot/yii2/frontend/web/ -d wechat.abclsp.com
将https签证生成到制定文件夹中 --config-dir 参数
certbot certonly --webroot -w /your_local_dir/wwwroot/yii2/frontend/web/ -d wechat.abclsp.com --config-dir /etc/nginx/conf.d/certss/
注意:
your_local_dir : 是你的服务地址,请注意项目路径。
说明:
/your_local_dir/wwwroot/yii2/frontend/web/ : 网站的根目录;
wechat.abclsp.com : 网站域名
--config-dir
/etc/nginx/conf.d/certss/ : http签证存储的地方
错误样例:
certbot certonly --webroot -w /your_local_dir/wwwroot/yii2/ -d wechat.abclsp.com --config-dir /etc/nginx/conf.d/certss/
结果如图:
错误的地方就是 文件夹路径不是网站的根目录,
成功案例:
certbot certonly --webroot -w /your_local_dir/wwwroot/yii2/frontend/web/ -d wechat.abclsp.com --config-dir /etc/nginx/conf.d/certss/
结果如图:
certbot提供很多的参数可以用,可参考这里 certbot 命令地址
我们有其他例如nginx的服务,它占用了443端口,我们就要先停止这些服务,在生成证书完毕后,我们再启用这些服务。
certbot certonly --standalone -d example.com -d www.example.com
至此,我们的第一证书生成已完成。下一步是配置我们的Web服务器并启用HTTPS。
4 Nginx 配置启用 HTTPS
我的配置是使用的是Nginx 服务器来转发请求,这里贴一下我的Nginx配置。
server {
listen 80;
server_name wechat.abclsp.com;
rewrite ^(.*) https://wechat.abclsp.com$1 permanent;
}
server {
listen 443;
server_name wechat.abclsp.com;
access_log /your_local_dir/wwwlogs/wechat_access_nginx.log combined;
error_log /your_local_dir/wwwlogs/error.log;
root /your_local_dir/wwwroot/yii2/frontend/web;
index index.html index.htm index.php;
ssl_certificate /etc/nginx/conf.d/certss/live/wechat.abclsp.com/fullchain.pem;
ssl_certificate_key /etc/nginx/conf.d/certss/live/wechat.abclsp.com/privkey.pem;
#error_page 404 /404.html;
#error_page 502 /502.html;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
location ~ [^/]\.php(/|$) {
#fastcgi_pass remote_php_ip:9000;
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$; #增加这一句
fastcgi_param PATH_INFO $fastcgi_path_info; #增加这一句
include fastcgi.conf;
}
include maccms.conf;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
expires 30d;
access_log off;
}
location ~ .*\.(js|css)?$ {
expires 7d;
access_log off;
}
location ~ ^/(\.user.ini|\.ht|\.git|\.svn|\.project|LICENSE|README.md) {
deny all;
}
}
配置主要是监听 443 端口和启用 SSL,并配置了 SSL 的证书路径(公钥,私钥的路径),通过这些配置,我们就可以成功启用Https了。
你打开网站的时候就可以看到标有 安全 的字样。比如:
5 自动更新 SSL 证书
配置完这些后,我们的工作尚未完成。
Let's Encrypt 提供的证书只有90天的有效期,我们必须在这些证书过期之前重新获得它们。有什么办法呢?
certbot 给我们提供了一个很方便的命令,那就是
certbot renew # 使用【默认配置目录】的更新命令
certbot renew --config-dir /etc/nginx/conf.d/certs # 使用【自定义配置目录】的更新命令
使用此命令,他将自动检查系统中的证书并自动更新它们。
注意:
更新完成后需要重启Nginx:nginx -s reload。
我们可以运行这个命令测试一下
certbot renew --dry-run
如果运行的时候出现了这个错误:
Attempting to renew cert from /etc/letsencrypt/renewal/api.diamondfsd.com.conf produced an unexpected error: At least one of the required ports is already taken.. Skipping.
这是因为生成证书的时候使用的是 --standalone 模式。
这个模式在验证域名时,此模式需要启用端口443。此错误意味着要启用的端口已被占用。
这时候必须先关掉nginx,运行以下命令:
nginx -s stop
运行这个命令,没有报错的话,也就是所有的证书都刷新成功。证书是90天才过期,我们只需要在过期之前执行更新操作就可以了。
当然,这种不用我们每次去更新,我们容易忘记的,可以用linux的定时任务来完成。用 crontab做一个定时任务就可以了
写上 cron 计划:编写如下任务详情
15 2 * */2 * certbot renew --pre-hook "nginx -s stop" --post-hook "nginx -s start" # standalone模式
15 2 * */2 * certbot renew --post-hook "nginx -s reload"
# 非standalone模式
命令的意思就是:每隔 两个月的 凌晨 2:15 执行更新操作。
--pre-hook 表示执行更新操作之前要做的事情。
--standalone模式的证书需要停止 nginx 服务,解除端口占用。
--post-hook 表示执行更新操作完成后要做的事情,这里就恢复 nginx 服务的启用
最后我们用 crontab -e 打开 linux 定时任务添加
15 2 * */2 * certbot renew --pre-hook "nginx -s stop" --post-hook "nginx -s start" # standalone模式
15 2 * */2 * certbot renew --post-hook "nginx -s reload"
至此,整个网站升级到HTTPS就完成了。
6 删除证书
删除所有证书:
$ sudo certbot delete
删除指定证书:
$ sudo certbot delete --cert-name example.com
删除指定目录下的指定证书:
$ certbot delete --cert-name example.com --config-dir /etc/nginx/conf.d/certs
评论 (0)