HTTPS加密简介以及Nginx安装 Let’s Encrypt 免费SSL/TLS证书
HTTPS简介
专业术语
围绕着HTTPS加密有许多专业术语,下面几个只是冰山一角,但它们是最基本的。
- SSL:Secure Socket Layer. SSL是传输层TCP加密的一种协议。SSL1.0版本于1993年左右由网景公司(NetScape)发明。由于第一版有许多安全漏洞,所以它从未面世。SSL经历了3个版本:SSL1.0,SSL2.0,SSL3.0。
- TLS: Transport Layer Security. TLS是SSL的升级版。TLS现在基本替代了SSL,它也有三个版本:TLS1.0,TLS1.1,TLS1.2。目前正在筹划TLS1.3。
- X.509: 它是TLS证书的格式
- PKI:Public Key Infrastrcture 公钥基础设施
- CA: Cerfificate Authority, 证书签发机构。PKI中向网站服务器,邮箱服务器等签发SSL/TLS证书的机构。CA有两种类型:Root CA和中间CA。
人们有时会说SSL证书,有时会说TLS证书,也有人说SSL/TLS证书。其实他们指的是同一种证书,只是叫法不同而已。
加密的重要性
很多人认为只是在处理网上金融业务或者在登录时需要用到加密,但加密的用处绝不仅仅是这两个。加密是保护人们的网上隐私的重要手段。它还能帮助我们抵御其他形式的攻击。明文的HTTP不能保护服务器和浏览器之前的通信,是非常不安全的。
为什么需要加密?
加密技术为人们的网上活动提供了保密性、完整性和真实性。具体地是指:
- 保密性:保护人们的网上活动不受劫持,地理位置跟踪的威胁。防止其他人通过非正常手段了解用户的网上浏览记录。
- 完整性:保护资料在网络传输过程中的完整性,不受中间人修改。
- 真实性:帮助人们了解对方身份的真实性
Poodle攻击
2014年10月谷歌发现了一种新的攻击方法,叫做Poodle,全称为Padding Oracle On Downgraded Legacy Encryption。Poodle通过将浏览器和服务器之前的加密协议从TLS降低为SSL3.0,从而利用SSL3.0的漏洞进行攻击。所以自此以后,SSL3.0加密被认为是过时的技术。
服务器获取证书的困难和障碍
站长通常会认为HTTPS会拖慢网站的加载速度,并且对服务器的CPU有一定要求。很多人都感觉到获取一个SSL/TLS证书要花费时间和金钱。我之前写过一篇关于获取免费SSL证书的文章,你看了那篇文章就会感觉到这个过程是多么复杂。站长需要了解Cipher Suite以及OpenSSL命令行的用法,对于大多数人来说这相当困惑。而且当证书到期时,站长又得重新申请一次,不然用户浏览网站时,会被浏览器告知网站不安全。
Let’s Encrypt 项目
Let’s Encrypt (我们来加密吧)是一个由电子前哨基金会、Mozilla基金会、Akamai、密歇根大学、思科联合发起的一个项目。它旨在为站长提供一个免费的、完全自动化的证书申请过程,从而让整个互联网都能享受到HTTPS加密。Let’s Encrypt的证书申请过程非常简单、安全、快速、自动化并且免费。Let’s Encrypt是一个中间CA,它的CA证书由IdenTrust签发。IdenTrust是一个Root CA,受到所有主流浏览器的信任。从2015年10月后,Let’s Encrypt的中间CA证书被chrome、Firefox、Microsoft Edge、Safari和Opera所信任。
Let’s Encrypt 的概念
- DV: Domain Validation 域名验证。它用来验证SSL/TLS证书的申请人拥有域名的控制权。这个过程可以完全自动化,由机器完成,不需要人的介入。
- DVSNI:用来证明申请人对服务器拥有控制权。
- ACME:Automated Certificate Management Environment 自动化证书管理环境。它是申请人服务器和Let’s Encrypt CA服务器之前的通信协议。
Let’s Encrypt 证书的安全性
它支持对网站服务器(Apache、Nginx)自动配置SSL/TLS,并且在此过程中会自动备份原来的配置文件。到目前为止,自动配置只支持Apache,Nginx的支持工作还在进行。
Let’s Encrypt可以防止申请人对同一个域名进行两次申请。
单一模式
当网站服务器(web server)没有自动配置时,要使用单一模式。在单一模式下,证书和钥匙保存在文件系统,然后管理员手动进行服务器的SSL/TLS配置。
多域名证书和通配型证书(multi-domain cert & wildcard cert)
Let’s Encrypt目前支持多域名证书。在申请的时候你可以输入你拥有的多个域名,比如我可以输入我拥有的两个域名www.linuxdashen.com、www.linuxbabe.com。但最多只能输入100个域名。通配型证书(比如*.linuxdashen.com)目前不被支持。
为Nginx服务器安装一个免费的 Let’s Encrypt 证书
最有趣的时候到了,为Nginx安装证书!
首先在Linux服务器上安装Git:
Debian/Ubuntu: sudo apt-get install git CentOS: sudo yum install git Arch Linux: sudo pacman -S git
然后,克隆Let’s Encrypt的Github repository
git clone https://github.com/letsencrypt/letsencrypt cd letsencrypt
输入下面的命令获取SSL证书。certonly是指只获取SSL证书,但不安装证书,因为目前Let’s Encrypt还处于beta阶段,自动SSL配置还不支持Nginx,我们得手动配置SSL证书。–agree-tos是指同意服务条款(terms of service)。
./letsencrypt-auto --agree-tos certonly
这条命令会要求你输入一个邮箱地址,然后输入你的域名。邮箱地址是用来接收紧急通知和找回密钥的。
因为Let’s Encrypt支持多域名证书,所以你可以输入多个域名,但不能超过100个。注意你输入的域名的IP地址必须要指向你现在的服务器。Let’s Encrypt会通过DNS验证你的域名是否与你的服务器IP对应。输入的第一个域名是Common Name,然后全部域名都会出现在Alternative Name栏目下。
你可能会看见如下错误,提示nginx进程已经在监听80端口。
我们需要暂时停止nginx,然后再次运行一次上面的命令。
sudo service nginx stop or sudo systemctl stop nginx
./letsencrypt-auto --agree-tos certonly
如果出现下面的错误,只需要重新执行letsencrypt-auto命令。
Failed authorization procedure. www.linuxdashen.com (tls-sni-01): urn:acme:error:tls :: The server experienced a TLS error during DV :: Failed to connect to host for DVSNI challenge
当命令完成时,你会看到如下消息,表示你已经成功申请到了证书。证书和密钥都保存在/etc/letsencrypt/live/yourdomain目录下。
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/yourdomain.com/fullchain.pem. Your cert will expire on 2016-03-06. To obtain a new version of the certificate in the future, simply run Let's Encrypt again. - If like Let's Encrypt, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
然后,启动nginx进程
sudo service nginx start or sudo systemctl start nginx
配置/etc/nginx/sites-available/yourdomain.com 或者 /etc/nginx/conf.d/yourdomain.conf文件,将文件内容修改成如下形式。
server { listen 80; server_name yourdomain.com www.yourdomain.com; return 301 https://www.yourdomain.com$request_uri; } server { listen 443 ssl spdy; server_name www.yourdomain.com; ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_protocols 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:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK'; ssl_prefer_server_ciphers on; root /path/of/the/web/root; index index.php index.html index.htm index.nginx-debian.html; location / { try_files $uri $uri/ /index.php?$query_string; } ........
然后,重新加载nginx配置,
sudo service nginx reload or sudo systemctl reload nginx
现在浏览你的网站,浏览器地址栏会有一把绿色的锁。如果你想测试网站的加密强度,可以前往 ssl lab 测试。
如果你的nginx版本很低,比如nginx 1.4.x,那么你的nginx可能不能完全支持上面所给的配置。最好的办法是升级Nginx到最新版本。请查看此文章了解nginx升级到mainline版本的具体步骤。
来资磁一个:)
[疑问] 不懂。。。
就是支持的意思 23333333333
多谢,已配置成功。能不能写一个自动续期的脚本嗯?
证书有效期为90天。Let’s Encrypt还处于beta版,正式版会增加对Nginx的自动配置和自动续期。
贵站文章写的都非常详细,感恩互联网上有这么多大神、原创作家。
你喜欢我写的文章,我很欣慰。但我现在缺乏写文章的动力。
不错,如何续期呢!不是说这样只有90天嘛!