网站配置HTTPS加密传输协议

Author: 张浩森 Date: Apr 29, 2018 Updated On: Apr 29, 2018
Categories:
Tags:

一、前言

​ 当今时代对上网的安全性要求比以前更高,chrome和firefox也都大力支持网站使用HTTPS,苹果也从2017年开始在iOS 10系统中强制app使用HTTPS来传输数据,微信小程序也是要求必须使用HTTPS请求,由此可见HTTPS势在必行。Google浏览器也把所有没有用https协议的网站判断为危险网站。

二、HTTPS

​ 超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,缩写:HTTPS,常称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在1994年首次提出,随后扩展到互联网上。

​ 与HTTP的URL由“http://”起始且默认使用端口80不同,HTTPS的URL由“https://”起始且默认使用端口443。HTTP是不安全的,且攻击者通过监听和中间人攻击等手段,可以获取网站帐户和敏感信息等。HTTPS被设计为可防止前述攻击,并在正确配置时被认为是安全的。

​ 这学期上了计算机网络,目前正在学习传输层的相关知识,在TCP的rdt中翻来覆去的折腾。因为学习应用层的时候学习了HTTP协议,就准备给自己的网站配置一下HTTPS。

​ http与https的几点区别:
1、https协议需要到CA申请证书,一般是收费的。
2、http协议运行在TCP之上,所有传输的内容都是明文,https运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。
3、http与https是两种不同的链接方式,端口也不一样,http使用80端口,https使用443端口。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

三、HTTPS SSL证书

​ SSL证书,用于加密HTTP协议,也就是HTTPS。淘宝、百度等网站纷纷实现全站Https加密访问,搜索引擎对于HTTPS更加友好,加上互联网上越来越多的人重视隐私安全,站长们给网站添加SSL证书似乎成为了一种趋势。

​ 如果是首次考虑为网站部署HTTPS,估计在选择证书上会有些头疼,查阅一些资料后发现这里要考虑的因素确实有很多,比如是否支持多域名、泛域名、保额、证书的价格还有浏览器上的小图标样式区别等等。目前主流的SSL证书主要分为DV SSL、OV SSL、EV SSL、还有自签名证书。

​ 这里要注意,自签名证书是被浏览器视作不安全的。因此不能利用软件生成自签名证书来加密HTTP。

四、Let’s Encrypt SSL证书

​ Let’s Encrypt是国外一个公共的免费SSL项目,由 Linux 基金会托管,它的来头不小,由Mozilla、思科、Akamai、IdenTrust和EFF等组织发起,目的就是向网站自动签发和管理免费证书,以便加速互联网由HTTP过渡到HTTPS。
Let’s Encrypt安装部署简单、方便,目前也已经有现成的安装脚本,可以很快的完成证书的申请及发放。
目前Let’s Encrypt免费证书的有效期只有90天,由于Let’s Encrypt的证书属于自动签发的,所以我们也可以自己写脚本来实现定期自动更新Let’s Encrypt证书,达到一劳永逸的效果。

五、利用Let’s Encrypt SSL实现网站HTTPS

​ 利用脚本快速获取Let’s Encrypt SSL证书,官方推荐的自动化证书颁发和安装脚本是Certbot,所以这里也是采用这个脚本进行安装(执行脚本需要root权限 )。

获取脚本:

1
2
3
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
mv certbot-auto /usr/local/sbin/

获取证书:

1
2
cd /usr/local/sbin
./certbot-auto certonly

后面的获取取证书过程中Let’s encrypt需要验证用户对域名的所有权,根据提示操作即可。

第一步选择nginx插件,后面的按照提示走就可以了。

可以进入/etc/letsencrypt/live/www.abigale.xin路径下查看生成的证书。

配置网站使用HTTPS访问,在Nginx中需要同时绑定两个Server分别监听80(HTTP)及443(HTTPS)端口。

Nginx关键配置清单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
##80端口接收的请求直接重定向到HTTPS端口
return 301 https://www.yourdomain.com$request_uri;
##....
}
server {
listen 443 default ssl;
ssl on;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
server_name yourdomain.com www.yourdomain.com;
##...
}

配置完成后重载入Nginx配置即可生效,再次通过浏览器访问你的网站就可以看到绿色小锁头的图标了。

Let’s Encrypt 证书的有效期为90天,建议是每60天更新证书,以免有误差影响正常服务,证书自动更新可以通过运行certbot-auto来进行。
为所有已安装证书的域名更新,运行如下命令:

1
./certbot-auto renew

命令执行过程会检查证书的到期日期,如果证书还未到期会提示你的证书尚未到期,输出如下:

1
2
3
4
5
6
7
8
Saving debug log to /var/log/letsencrypt/letsencrypt.log
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/yourdomain.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal
The following certs are not due for renewal yet:
/etc/letsencrypt/live/yourdomain.com/fullchain.pem (skipped)
No renewals were attempted.

为确保证书永不过期,需要增加一个cron的定期执行任务,由于更新证书脚本首先会检查证书的到期日期,并且仅当证书距离少于30天时才会执行更新,因此可以安全的创建每周甚至每天运行的cron任务。
编辑crontab来创建一个定时调度任务(需要root权限),运行:

1
sudo crontab -e

添下以下代码:

1
2
30 3 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/letsencrypt-renew.log
40 3 * * 1 /usr/local/nginx/sbin/nginx -s reload

以上代码为创建两个定时调度任务,先是在每周一的上午3:30执行certbot-auto renew命令来更新证书,然后是在每周一上午3:40时重新加载Nginx,以使用更新的证书,命令生成的log将通过管道输出到/var/log/letsencrypt-renew.log日志文件。
至此,网站就已经开使用免费的Let’s Encrypt TLS/SSL证书来安全地提供HTTPS内容。

六、总结

​ 一个好的第三方证书颁发机构还是很重要的。配置HTTPS也是运维必备的技能。还有很多证书颁发机构,以后如果做运维了再去深入研究。