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.comwww.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端口。

Let's Encrypt

我们需要暂时停止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版本的具体步骤。

为这篇文章评分
[Total: 9 Average: 3.2]

“HTTPS加密简介以及Nginx安装 Let’s Encrypt 免费SSL/TLS证书”的8个回复

  1. 贵站文章写的都非常详细,感恩互联网上有这么多大神、原创作家。

发表评论

电子邮件地址不会被公开。 必填项已用*标注