https证书详解、获取以及nginx配置

发布:elantion 日期:2018-07-11 阅读:1619 评论:0

https有天然的安全性,具备不可监听、不可篡改的特性。随着用户对安全性要求越来越高,很多网站开始把流量切换至https,特别是国外的网站,例如google、facebook、twitter等,至2017年初,全球大约10%的流量使用https,并且快速增长。但在国内,由于百度技术的落后(或者说策略的保守),至到2015年才开始收录https网站,所以很多网站为了SEO,只能舍弃,至到最近才敢开始转移。

https证书详解

之前我曾想过购买证书,无奈每年的费用不小,而且钱包体弱多病,于是作罢。直到这几天在研究TLS协议时竟然让我发现了免费的(真)https证书(怎么像广告了),在安装之前我们先了解一下证书。

https证书的类型

https证书除了用于加密通道,还有是为了让用户浏览你的网站时,证明这网站就是你的网站,不是别人冒用的网站(证明你是你)。所以证书必须是浏览器认为合法的证书机构(Certificate authority)签发,例如Comodo、Symantec、GoDaddy等,都是些有名的IT安全机构或者服务器提供商,是有信誉的,可信任的,所以签发的证书,浏览器也认可。

域名认证证书Domain Validation

该类证书用于证明你就是网站的所有者,用户浏览时可以确保该域名访问的网站是指向正确的。

组织认证证书Organization Validation

该类证书需要人工审查,证明申请人就是该组织的负责人,用户浏览该网站时可以确保域名指向的组织是正确的。

扩展认证证书Extended Validation

该类证书是目前最高级别的证书,不仅需要人工审请申请资料,还要提交很多组织相关的证明材料,审查时间长。用户浏览该网站时,浏览器地址栏会显示绿色,并且会显示组织机构的名称,可以确保域名指向正确。

(不安全)自签证书Self-signed certificate

自已签发的证书,可以使用openssl等工具签发,不能证明域名的指向正确,但可以确保通道是安全的,打开网站时,浏览器会弹窗询问用户是否认可该网站的证书,这种证书是完全免费、无限期、快速签发,适合个人或内部使用,例如网站调试。

证书的选择

除了最后一种自签证书,其他的证书都可以确保域名的指向正确和通信通道的安全性,只是逼格更高一点而已(恕我肤浅),像google这种更重视技术层面上安全的公司,chrome并不会区别这几种证书的显示方式。但像Safari、IE等,貌似更喜欢EV这种证书,整条绿色的地址栏会让用户更安全?
所以,像银行、电商这些安全级别要求高的网站自然会选择EV证书,除了安全之外,更重要的是“绿条”更显逼格,像Apple、Amazon等。但像谷歌这种企业,反而选择了OV证书,只要证明“我是我”,并且通道安全就可以,在我心中逼格更高。最后,如果你像我一样只是一个苦逼的小站长,有个DV证书就满足了。至于自签证书嘛。。。没什么用处,还是用回http吧。。。

兼容性

如果你的目标用户包含微信就必须要小心了,因为是否认可证书并不是由用户说了算,而是由浏览器内置的名单来决定的,像微信认可的CA就比较少,像下面letsencrypt出的证书微信就不认可了,打开网站会变成空白页,你也没法去怼微信。

letsencrypt.org提供免费的DV证书

之前看过一些免费的DV证书,一般只给你签个一个月,续签就要收费了。但letsencrypt提供的证书,续签是免费的,并且签发过程是自动的(当然,人工这么贵),也没有广告之类的附加要求,是真·免费DV证书。

为啥免费

DV证书只要证明域名的所有者就可以,所以全程电脑自动化认证是没问题的,有些证书提供商只需验证邮箱地址后缀就行,成本几乎为零,为什么一直在收费,是因为这些验证技术、服务器都是烧钱的。Letsencrypt背后由Internet Security Research Group (ISRG)支持,是个非盈利的组织,这个项目的目的就是为了让世界所有人民浏览网站变得更安全,这么美好的梦想,于是就吸引了Mozilla,Cisco、Google、Facebook等大公司的赞助,这样资金就不是问题了,意外的是国内也有公司支持,叫云片公司,当然还有我的一点点小心意。

阿里云提供免费DV证书

阿里云也有免费的证书,而且相对Let's encrypt,因为它是由Symatec签发的,对,就是那个做杀毒软件公司-西门赛克,大多浏览器都认可,所以兼容性更好,像微信这种奇葩也支持,而且有效期也有一年,足够日常使用。

获取letsencrypt证书

熟悉https原理的同学就知道,TLS通道需要两份密钥,一份是私有密钥、一份是公开密钥。获取证书需要用到Certbot这个工具,下面以CentOS 7 + Nginx为例,你也可以直接使用Certbot官网的指导,英文文档并不复杂,就是一些证书的专业术语会让人有点困惑。

Let's encrypt客户端:Certbot

获取证书最简单的方式是通过certbot来获取,通过ssh进服务器,安装运行后按提示完成即可。CentOS安装需要EPEL,使用yum安装:

sudo yum install certbot

然后执行以下命令,启动获取证书向导:

certbot certonly

之后大家按向导来操作就行,其中有个地方会问你证书的分发方式(就是如何把public key发给用户),一种是nginx plug方式(自动安装插件并分发,官方推荐),一种是用现成的服务配置,手动配置。我这人比较喜欢拆腾,用的是第二种。非常抱歉,操作时没有截图,这部分就不能展开了,有那位朋友的服务器还没配置的,我可以帮忙配置,顺便截个图。

配置nginx

证书生成之后,如果像我这种用的是第二种分发方式,服务器就需要手动指向证书的位置。

server {
    listen 443 ssl;
    server_name www.lazycoffee.com;
    ssl_certificate /etc/letsencrypt/live/www.lazycoffee.com/cert.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.lazycoffee.com/privkey.pem;
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;
    location / {
        proxy_pass http://localhost:3000;
    }
}

为啥没有80端口?因为既然用上了https就别留后门了,http访问全部跳转到https。下面这个配置不仅把http跳转https,顺便把lazycoffee.com的流量都跳到了www.lazycoffee.com

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name lazycoffee.com;
    return 301 https://www.lazycoffee.com$request_uri;
}
server {
    listen 80;
    listen [::]:80;
    return 301 https://www.lazycoffee.com$request_uri;
}

像[::]:符号是用于ip6,不需要的可以删除。到这里,你就可以重启一下nginx,验证是否通过:

sudo service nginx -s reload

打开lazycoffee.com,如果自动跳转到www.lazycoffee.com,并且使用https就表示配置是正确的。如果出现打开超时,可以检查一下防方墙的配置,像阿里云的服务器需要在安全配置开通443端口。

自动更新证书

Let's encrypt申请的证书是会过期的,申请一次有三个月有效期,在快到期前30天就可以续期,但你可不想每三个月就手动更新一次吧?我们可以设置一个定期检查命令,快过期了就自动帮你续期。
先检查更新命令是否正常,下面是执行模拟更新的命令,可以试试,无害:

sudo certbot renew --dry-run

如果执行没什么问题,他就会显示如下信息:

运行通过就可以添加到计划任务中:

sudo crontab -e

添加如下文本:

15 3 * * * certbot renew

15是分钟,3是小时,意思是每天零晨三点十五分就执行一次该命令(这个时候服务器负担一般是最小的)。

总结

使用HTTPS协议能大大提升传输的安全性,但像任何技术一样,不可能是完美的,仍存在被破解的危险(例如心跳攻击BEAST),所谓的安全,只是你比坏人跑得更快而已。至于你网站布署HTTPS之后的安全程度,可以使用该网站测试:https://www.ssllabs.com/ssltest/index.html ,至少拿个『A』评分才合格,如果能拿到『A+』也是极好的。

https://www.ssllabs.com/ssltest/analyze.html?d=www.lazycoffee.com