为你的网站配置免费的HTTPS支持
Table of Contents
另一篇相关文章:https证书自动续订(renew)问题。
一、什么是HTTPS协议?
HTTPS协议是HTTP协议的安全版,S就是Secure(安全)的意思。常称为HTTP over TLS,HTTP over SSL或HTTP Secure。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在1994年首次提出,随后扩展到互联网上。
注:关于SSL与TLS的区别请看:TLS与SSL之间关系。
二、为什么要用HTTPS协议?
- 传输过程中对用户的关键信息进行加密,防止类似Session ID或者Cookie内容,登录时提交的密码,证件号等被攻击者捕获造成的敏感信息泄露等安全隐患。
- 传输过程中对数据进行完整性校验,防止DNS或内容遭第三方劫持(使用HTTPS防止流量劫持)、篡改等中间人攻击(MITM)隐患。
- 浏览器会显示安全标记(一把锁),用户看到这个用起来也比较放心(实际上也确实是比较安全):
Chrome显示安全标记
Firefox显示安全标记
Safari显示安全标记
三、配置免费的HTTPS服务器
https协议的默认端口是443,要使用https协议,需要在网页服务器(nginx或apache httpd)把原来监听80端口改监听443端口,并配置ssl支持,这样你的网站就支持https协议了,这里我用nginx作为示例:
1、修改nginx配置文件
未配置ssl
server {
listen 80;
server_name www.xiebruce.top xiebruce.top;
access_log /data/wwwlogs/www.xiebruce.top_nginx.access.log combined;
error_log /data/wwwlogs/www.xiebruce.top_nginx.error.log error;
index index.html index.htm index.php;
root /data/wwwroot/wordpress;
location / {
try_files $uri $uri/ /index.php?$args;
}
}
配置了ssl支持
server {
listen 443;
server_name www.xiebruce.top xiebruce.top;
access_log /data/wwwlogs/www.xiebruce.top_nginx.access.log combined;
error_log /data/wwwlogs/www.xiebruce.top_nginx.error.log error;
index index.html index.htm index.php;
root /data/wwwroot/wordpress;
#ssl start
ssl on;
ssl_certificate /etc/letsencrypt/live/xiebruce.top/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xiebruce.top/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHellA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
#ssl end
location / {
try_files $uri $uri/ /index.php?$args;
}
}
不同网站具体需配置规则可能不一样,你不需要看我的具体配置,你只要在你原来的配置基础上,把listen 80改成listen 443,然后添加以下ssl支持语句即可:
ssl on;
ssl_certificate /etc/letsencrypt/live/www.xiebruce.top/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.xiebruce.top/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHellA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
其中ssl_certificate
为数字证书(相当于公钥)路径,ssl_certificate_key
为私钥路径,直接使用以上配置是不行的,因为数字证书文件和私钥文件并不存在,我们需要获取才可以,那这个数字证书和私钥文件从哪里来呢?其实数字证书(包括私钥,因为它们是一对的)是由证书授权机构颁发的,这是全球10大数字证书颁发机构:全球10大SSL证书品牌对比, 通过对比,我最后选用了Let's Encrypt
这个证书授权机构,也就是说,我们要从Let's Encrypt
这个证书授权机构中获取数字证书和私钥文件。
2、获取数字证书
我们可以使用ACME(Automatic Certificate Management Environment )自动证书管理环境工具——certbot
从Let's Encrypt
这个证书授权机构里免费获取证书并管理证书,如果要了解Let's Encrypt
证书授权原理请查看:How It Works
2.1 安装certbot
sudo yum install certbot
如果yum找不到安装包,请先使用以下语句安装epel
,再回过头去安装certbot
sudo yum -y install epel-release
2.2 获取指定域名证书
certbot certonly --webroot -w /data/wwwroot/wordpress -d www.xiebruce.top -d xiebruce.top
实例截图
其中-w后面的参数为表示网站根目录,-d后的参数为域名,这句命令会从Let’s Encrypt里获取证书和私钥,最后会打印出证书和私钥存储在什么路径。
生成的证书文件如下:
总用量 28K
drwxr-xr-x 2 xiebruce xiebruce 4.0K 11月 25 23:09 .
drwx------ 4 xiebruce xiebruce 4.0K 2月 14 15:41 ..
-rw-r--r-- 1 xiebruce xiebruce 1.9K 11月 25 23:09 cert.pem
-rw-r--r-- 1 xiebruce xiebruce 1.7K 11月 25 23:09 chain.pem
-rw-r--r-- 1 xiebruce xiebruce 3.5K 11月 25 23:09 fullchain.pem
-rw-r--r-- 1 xiebruce xiebruce 1.7K 11月 25 23:09 privkey.pem
-rw-r--r-- 1 xiebruce xiebruce 682 11月 25 23:09 README
各文件作用:
文件名 | 内容 |
---|---|
cert.pem | 服务端证书 |
chain.pem | 浏览器需要的所有证书但不包括服务端证书,比如根证书和中间证书 |
fullchain.pem | 包括了cert.pem和chain.pem的内容 |
privkey.pem | 证书的私钥 |
把这两个路径复制到前面的nginx配置文件中的ssl_certificate和ssl_certificate_key参数中,nginx -s reload,然后用https访问你的域名试试吧:
/etc/letsencrypt/live/www.xiebruce.top/fullchain.pem
/etc/letsencrypt/live/www.xiebruce.top/privkey.pem
如果你同一个服务器中有多个网站,你还可以同时设置多个域名,示例如下:
sudo certbot certonly --webroot -w /var/www/abc -d abc.com -d www.abc.com -w /var/www/xyz -d xyz.cn -d m.xyz.cn
此命令将获得abc.com,www.abc.com,xyz.cn和m.xyz.cn的单个证书; 它会将文件放在/var/www/abc下面以证明前两个域的控制,并在/var/www/xyz下放置第二对。
2.3 获取通配符证书
这一步不是必须的,这是用通配符的方法配置https证书,有些童鞋可能需要匹配通配符证书,而不是每个域名都要自己手动写,特别要注意的是,通配符证书无法匹配无www的域名解析,比如我的博客域名,有www的是www.xiebruce.top
,无www的是xiebruce.top
,那么通配符解析*.xiebruce.top
只能解析有www的,这很好理解,因为就算*可以为空,但后面还有个点呀,.xiebruce.top
跟xiebruce.top
还是无法匹配的,并且这个点是不能去掉的,也就是通配符你不可以写成*xiebruce.top
。
下面开始配置通配符证书,在配置之前,请先打开你的添加域名解析记录的窗口,比如我是阿里云的域名,我就在阿里云里打开准备添加解析记录的窗口,并且记录类型选TXT,注意是TXT,不是A:
然后执行以下命令:
sudo certbot certonly -d '*.xiebruce.top' --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory
特别注意!!!到了Please deploy a DNS TXT record under the name
这一步,不要直接按回车,前面不是打开了添加解析记录的窗口吗?现在你要做的就是把下图显示的这个域名和记录值填到那里,然后点确定添加这条解析记录:
看,就是这么填:
记录类型:TXT
主机记录:_acme-challenge.xiebruce.top,这是我的域名,你的域名肯定不一样,但前面的『_acme-challenge』这个应该是一样的
记录值:这个填给出的记录值即可
添加完域名解析以后,用以下命令检查是否已经解析成功(注意,这个命令不用在服务器运行,在你自己电脑上,或者服务器重新开一个窗口运行就行,千万别断掉你前面正在运行的certbot),另外注意换成你的域名:
dig -t txt _acme-challenge.xiebruce.top @8.8.8.8
通过上边的dig命令检测,如果出现以下红框中的内容,则说明解析成功,现在你可以回到刚才用certbot申请通配符证书那里按回车了,按回车后,正常的话,数字证书和私钥路径会显示出来,还是像前面那样,把它粘到你的nginx的ssl配置对应的ssl_certificate和ssl_certificate_key里面:修改nginx配置文件 然后sudo nginx -s reload
即可。
- 实例截图
2.4 续订证书
通配符证书自动更新,请看:https证书自动续订(renew)问题。
这个证书的有效期为90天,因为第一次弄,我也不知道是90天后才能续订还是第90天就能续订,后面续订之后再来更新吧。
如果你是通配符方式获取的,那重新运行一次那个命令即可。
如果你是用--webroot
安装的,使用以下命令测试续订是否正常(dry run是演练、排练的意思):
sudo certbot renew --dry-run
如果以上语句没有问题,则执行以下命令更新(该方式无法更新通配符证书):
sudo certbot renew
另外可安装certbot-auto,其功能与certbot类似,好像比certbot更方便一点:
# 下载
wget https://dl.eff.org/certbot-auto
# 设为可执行权限
chmod u+x certbot-auto