2016年10月5日,国庆第五天。
今天,终于把博客的HTTPS搞完了。
之前一直觉得HTTPS很复杂,证书又贵(一年几百上千),所以一直没弄。这次趁着假期,研究了一下Let's Encrypt的免费证书,折腾了大半天,终于搞定了。
现在,访问博客,地址栏前面已经有了一把小绿锁,看着就舒服。
今天就来记录一下这次配置HTTPS的过程,希望能帮到想配置HTTPS的朋友。
一、为什么要做HTTPS
在开始之前,先说说为什么要做HTTPS。
HTTPS,简单来说,就是HTTP的加密版。HTTP传输的数据是明文的,容易被窃听、被篡改、被劫持。而HTTPS通过SSL/TLS协议,对传输的数据进行加密,保证数据的安全性和完整性。
做HTTPS的好处,主要有以下几个:
1. 安全性 这是最基本的。HTTPS能保证用户和服务器之间传输的数据是加密的,不会被窃听和篡改。对于有用户登录、支付等功能的网站,HTTPS是必须的。
虽然我的博客没有登录和支付功能,但是做了HTTPS,也能防止运营商的广告劫持和内容篡改。之前用HTTP的时候,偶尔会出现运营商插入的广告,很烦人。做了HTTPS之后,这种情况就没有了。
2. SEO友好 Google从2014年开始,就把HTTPS作为排名信号之一。做了HTTPS的网站,在Google搜索中会有一定的排名优势。
百度虽然没有明确说,但是据观察,HTTPS的网站在百度的收录和排名也有一定的优势。而且,百度站长平台也在大力推HTTPS。
所以,做HTTPS,对SEO是有好处的。
3. 浏览器信任 现在的浏览器,对HTTP网站越来越不友好了。Chrome从2017年开始,会把HTTP网站标记为"不安全"。Firefox也有类似的计划。
做了HTTPS,地址栏前面会有一把小绿锁,用户看着也更信任。
4. 性能 很多人觉得HTTPS比HTTP慢,因为加密解密需要消耗性能。但是实际上,随着硬件性能的提升和HTTPS优化技术的发展,HTTPS的性能损耗已经很小了。而且,HTTPS还可以配合HTTP/2,提升网站的加载速度。
所以,性能不应该成为不做HTTPS的理由。
二、Let's Encrypt介绍
以前,做HTTPS需要购买SSL证书,价格从几百到几万不等,对于个人博客来说,是一笔不小的开支。
但是现在,有了Let's Encrypt,一切都不一样了。
Let's Encrypt是一个免费、自动化、开放的证书颁发机构(CA),由互联网安全研究小组(ISRG)运营,得到了Mozilla、Google、Facebook、Microsoft等大公司的支持。
Let's Encrypt的特点:
1. 免费 不需要花一分钱,就能申请到SSL证书。对于个人站长和小网站来说,太友好了。
2. 自动化 证书的申请、部署、续期,都可以自动化完成。不需要手动操作,省心省力。
3. 开放 Let's Encrypt的协议和代码都是开放的,任何人都可以使用和贡献。
4. 多域名支持 一张证书可以支持多个域名(SAN),也支持通配符证书(*.example.com)。
5. 浏览器信任 Let's Encrypt的根证书已经被主流浏览器信任,包括Chrome、Firefox、Safari、Edge等。申请的证书,在这些浏览器里都会显示小绿锁。
当然,Let's Encrypt也有一些限制:
- 证书有效期只有90天,需要定期续期(但是可以自动化)
- 有申请频率限制(每个域名每周最多申请多少次)
- 不支持OV和EV证书(只有DV证书,即域名验证型)
对于个人博客和小网站来说,这些限制都不是问题。DV证书完全够用,90天有效期可以自动化续期,申请频率限制也不会触及。
三、准备工作
在开始配置之前,需要做一些准备工作。
1. 有一个域名 你需要有一个域名,并且已经解析到你的服务器。Let's Encrypt在颁发证书的时候,需要验证你对域名的所有权。
我的博客域名是example.com,已经解析到了腾讯云的服务器上。
2. 有一台服务器 你需要有一台服务器,并且有root权限。我的服务器是腾讯云的Linux服务器,系统是CentOS 7,Web服务器是Nginx。
3. 安装Certbot Certbot是Let's Encrypt官方推荐的证书管理工具,可以自动化地申请、部署和续期证书。
在CentOS 7上安装Certbot:
# 安装EPEL源
yum install epel-release -y
# 安装certbot和nginx插件
yum install certbot python2-certbot-nginx -y安装完成后,可以用certbot --version查看版本。
四、申请证书
准备工作做好了,就可以申请证书了。
Certbot提供了多种申请方式,最简单的是用Nginx插件,自动配置Nginx。
certbot --nginx -d example.com -d www.example.com这个命令会:
- 自动验证域名所有权
- 申请证书
- 自动配置Nginx
- 自动设置HTTP跳转HTTPS
执行命令后,会提示你输入邮箱(用于紧急联系和续期提醒),然后询问是否同意服务条款,是否愿意接收邮件,是否设置HTTP跳转HTTPS。按照提示操作就行。
如果一切顺利,证书就申请成功了,Nginx也自动配置好了。
但是,我在实际操作的时候,遇到了一些问题。因为我的Nginx配置比较复杂,Certbot的自动配置没有完全成功。所以,我选择了手动配置的方式。
手动申请证书的命令:
certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com这个命令会用webroot的方式验证域名所有权(在网站根目录下创建一个验证文件),然后只申请证书,不自动配置Nginx。
申请成功后,证书会保存在/etc/letsencrypt/live/example.com/目录下,包括:
cert.pem:服务器证书chain.pem:中间证书fullchain.pem:服务器证书+中间证书(Nginx用这个)privkey.pem:私钥
五、Nginx配置
证书申请成功后,就可以配置Nginx了。
我的Nginx配置如下:
# HTTP服务器,跳转到HTTPS
server {
listen 80;
server_name example.com www.example.com;
# 跳转到HTTPS
return 301 https://$server_name$request_uri;
}
# HTTPS服务器
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# 证书配置
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# SSL安全配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
# SSL会话缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 开启HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 网站根目录
root /var/www/example;
index index.html index.php;
# ... 其他配置 ...
}配置说明:
listen 443 ssl http2:监听443端口,开启SSL,支持HTTP/2sslcertificate和sslcertificate_key:指定证书和私钥的路径ssl_protocols:指定支持的SSL协议版本,建议禁用SSLv3(有POODLE漏洞)ssl_ciphers:指定加密套件,建议用安全的加密套件,禁用不安全的sslsessioncache:SSL会话缓存,提升HTTPS的性能Strict-Transport-Security:HSTS头,强制浏览器使用HTTPS访问
配置完成后,测试Nginx配置:
nginx -t如果配置没问题,重载Nginx:
nginx -s reload然后,用浏览器访问https://example.com,看看地址栏前面有没有小绿锁。如果有,就说明配置成功了。
六、自动续期
Let's Encrypt的证书有效期只有90天,所以需要定期续期。
Certbot提供了自动续期的命令:
certbot renew这个命令会检查所有证书,如果有证书快过期了(剩余有效期少于30天),就会自动续期。
为了实现自动化,我们可以把这个命令加到crontab里,每天执行一次:
# 编辑crontab
crontab -e
# 添加以下内容(每天凌晨3点执行续期)
0 3 * * * certbot renew --quiet --renew-hook "nginx -s reload"--quiet参数表示静默模式,只有出错的时候才输出信息。--renew-hook参数表示续期成功后执行的命令,这里是重载Nginx,让新证书生效。
这样,证书的续期就完全自动化了,不需要手动操作。
七、常见问题和踩坑总结
在配置HTTPS的过程中,我遇到了一些问题,也踩了一些坑。在这里总结一下,希望大家能避开。
1. 域名验证失败
申请证书的时候,需要验证域名所有权。如果验证失败,可能的原因:
- 域名没有正确解析到服务器
- 服务器的80端口没有开放(防火墙)
- Nginx配置有问题,验证文件无法访问
- 网站根目录的权限不对
解决方法:
- 确认域名已经正确解析到服务器
- 确认服务器的80端口已经开放
- 确认Nginx配置正确,网站根目录可访问
- 确认网站根目录的权限正确(Nginx的运行用户有读权限)
2. 证书路径错误
配置Nginx的时候,证书路径写错了,会导致Nginx启动失败。
解决方法:确认证书路径正确,证书文件存在,Nginx的运行用户有读权限。
3. 混合内容警告
配置了HTTPS之后,如果页面里有HTTP的资源(图片、CSS、JS等),浏览器会提示"混合内容"警告,小绿锁可能会变成黄色的感叹号。
解决方法:把页面里所有的HTTP资源,都改成HTTPS,或者用相对路径(//example.com/...)。
4. HTTP跳转HTTPS的配置
HTTP跳转HTTPS,建议用301永久重定向,不要用302临时重定向。301对SEO更友好。
而且,跳转的时候要保留URL参数,不要只跳转到首页。
5. HSTS的风险
开启HSTS之后,浏览器会强制使用HTTPS访问,在HSTS的有效期内,即使你关闭了HTTPS,浏览器也还是会用HTTPS访问。
所以,开启HSTS之前,要确认HTTPS已经稳定运行,不会再改回HTTP。建议刚开始的时候,把max-age设小一点(比如1天),确认没问题后,再慢慢增大。
6. 性能优化
HTTPS会有一定的性能损耗,可以通过以下方式优化:
- 开启SSL会话缓存(
sslsessioncache) - 开启OCSP Stapling
- 开启HTTP/2
- 用TLS 1.3(如果服务器支持)
八、写在最后
HTTPS终于搞完了:Let's Encrypt免费证书实战。
折腾了大半天,终于把博客的HTTPS配置好了。现在访问博客,地址栏前面有一把小绿锁,看着就舒服。
整个过程,其实不复杂。Let's Encrypt的免费证书,加上Certbot的自动化工具,让配置HTTPS变得非常简单。即使是新手,按照教程一步步来,也能搞定。
如果你还在犹豫要不要做HTTPS,我的建议是:做。现在HTTPS已经是标配了,不做HTTPS,不仅不安全,还会影响SEO,影响用户信任。而且,有了Let's Encrypt,HTTPS是免费的,为什么不做呢?
希望这篇文章,能帮到想配置HTTPS的你。如果在配置过程中遇到问题,欢迎在评论区留言,我们一起讨论。
最后,祝大家都能顺利配置好HTTPS,让自己的网站更安全,更专业。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录