使用Let's Encrypt为网站加上HTTPS
如何让自己的网站免费从HTTP升级为HTTPS?
本文就介绍使用 Let'sEncrypt的免费证书让网站升级为HTTPS。
作为一个博客,自然不想让在被别人浏览的时候,出现莫名的广告(运营商劫持)。
这时候,HTTPS的价值就体现出来了。
HTTPS的好处还有很多,但单单这一条,就够我花心思去升级了。
如果要启用HTTPS,我们就需要从证书授权机构(以下简称CA)处获取一个证书,Let'sEncrypt就是一个CA。
我们可以从Let'sEncrypt获得网站域名的免费的证书。
Certbot 是Let'sEncrypt官方推荐的获取证书的客户端,可以帮我们*自动*获取免费的Let'sEncrypt证书。
Certbot是支持所有Unix内核的操作系统的,个人博客的服务器系统是CentOS7。
这篇教程也是通过在个人博客上启用HTTPS的基础上完成的。
- 安装Certbot客户端
$yuminstallcertbot#CentOS $apt-getupdate&&apt-getinstallcertbot#Ubuntu $apkadd--no-cachecertbot#用Dockeralpine:nginx构建的容器
certbotcertonly--webroot-w/var/www/html/awaimai-dawaimai.com-dwww.awaimai.com
这个命令会为awaimai.com和www.awaimai.com这两个域名生成一个证书。
使用--webroot 模式会在/var/www/awaimai中创建.well-known 文件夹。
这个文件夹里面包含了一些验证文件,certbot会通过访问example.com/.well-known/acme-challenge来验证你的域名是否绑定的这个服务器。
证书生成完毕后,我们可以在/etc/letsencrypt/live/目录下看到对应域名的文件夹,里面存放了指向证书的一些快捷方式。
当然,我们也可以用--config-dir指定证书保存的路径:
certbotcertonly--webroot-w/var/www/html/awaimai-dawaimai.com-dwww.awaimai.com--config-dir/etc/nginx/conf.d/certs
certbot提供很多的参数可以用,可参考这里。
- 3standalone模式
这个命令在大多数情况下都可以满足需求。
但是有些时候我们的一些服务并没有根目录,例如一些微服务,这时候使用 --webroot 就走不通了。
certbot还有另外一种模式--standalone ,这种模式不需要指定网站根目录,他会自动启用服务器的443端口,来验证域名的归属。
我们有其他服务(例如nginx)占用了443端口,就必须先停止这些服务,在证书生成完毕后,再启用。
certbotcertonly--standalone-dexample.com-dwww.example.com
这时候我们的第一生成证书已经完成了,接下来就是配置我们的web服务器,启用HTTPS。
博客系统使用的是Nginx服务器来转发请求,这里贴一下我的Nginx配置。
server{ listen80; server_namewww.awaimai.comawaimai.com; rewrite^(.*)https://www.awaimai.com$1permanent; } server{ listen443ssl; sslon; server_namewww.awaimai.com; root/var/www/html/awaimai; indexindex.php; ssl_certificate/etc/nginx/conf.d/certs/live/awaimai.com/fullchain.pem; ssl_certificate_key/etc/nginx/conf.d/certs/live/awaimai.com/privkey.pem; location~\.php${ try_files$uri=404; fastcgi_pass127.0.0.1:9000; fastcgi_indexindex.php; fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name; includefastcgi_params; } location~/\.ht{ denyall; } }
主要是监听 443 端口,启用SSL,并配置SSL的证书路径(公钥,私钥的路径)。
通过这些配置我们就已经成功的完成了Https的启用。
现在打开我的博客 https://www.awaimai.com/ 就可以看到标有 安全 的字样。
配置完这些过后,我们的工作还没有完成。
Let'sEncrypt提供的证书只有90天的有效期,我们必须在证书到期之前,重新获取这些证书。
如果使用Docker容器,请参考文章《Docker使用cron定时任务》
certbot给我们提供了一个很方便的命令,那就是
certbotrenew#使用【默认配置目录】的更新命令 certbotrenew--config-dir/etc/nginx/conf.d/certs#使用【自定义配置目录】的更新命令
通过这个命令,他会自动检查系统内的证书,并且自动更新这些证书。
注意:更新完成后需要重启Nginx:nginx-sreload。
我们可以运行这个命令测试一下
certbotrenew--dry-run
如果运行的时候出现了这个错误:
Attemptingtorenewcertfrom/etc/letsencrypt/renewal/api.diamondfsd.com.confproducedanunexpectederror:Atleastoneoftherequiredportsisalreadytaken..Skipping.
这是因为生成证书的时候使用的是 --standalone 模式。
这个模式在验证域名的时候,需要启用443端口,这个错误的意思就是,要启用的端口已经被占用了。
这时候必须把nginx先关掉,才可以成功。所以,先:
nginx-sstop
运行这个命令,就没有报错了,所有的证书都刷新成功。
证书是90天才过期,我们只需要在过期之前执行更新操作就可以了。
这件事情就可以直接交给定时任务来完成。
linux系统上有 cron 可以来搞定这件事情。
新建了一个文件 certbot-auto-renew-cron,写上cron 计划:
152**/2*certbotrenew--pre-hook"nginx-sstop"--post-hook"nginx-sstart"#standalone模式 152**/2*certbotrenew--post-hook"nginx-sreload"#非standalone模式
这段内容的意思就是:每隔两个月的凌晨2:15执行更新操作。
- --pre-hook 表示执行更新操作之前要做的事情。--standalone模式的证书需要停止 nginx 服务,解除端口占用。
- --post-hook 表示执行更新操作完成后要做的事情,这里就恢复 nginx 服务的启用
最后我们用 crontab 来启动这个定时任务
crontabcertbot-auto-renew-cron
至此,整个网站升级到HTTPS就完成了。总结一下我们需要做什么
- 获取Let'sEncrypt免费证书
- 配置Nginx开启HTTPS
- 定时刷新证书
6删除证书
删除所有证书:
$sudocertbotdelete
删除指定证书:
删除指定目录下的指定证书:\
$certbotdelete--cert-nameexample.com--config-dir/etc/nginx/conf.d/ssl
原文地址:
- Let'sEncrypt使用教程,免费的SSL证书,让你的网站拥抱HTTPS