使用Let's Encrypt的SSL证书配置HTTPS手记
Let’s Encrypt是电子前哨基金会(EFF)发布的免费 SSL 证书服务,Google,Mozilla和Microsoft都极力支持。很早之前就听说了let’s encrypt,当时碍于其证书有效期短,并且配置麻烦,遂懒得折腾。最近发现他们的网站发布了工具和一系列自动化的工作流配置。尝试了一下,还蛮不错。
安装 Cerbot
Certbot专门用来部署Let‘s encrypt的工具,其官网会根据使用的web服务器软件和操作系统平台,提供响应的安装工具和安装方法。
我这里选择了Nginx和Ubuntu16.10的组合。会看到网站跳转到一个简易的使用文档。使用下面的命令安装即可:
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot
对于Ubuntu14以上的版本,可能并没有add-apt-repository。需要安装下面的软件包:
$ sudo apt-get install python-software-properties
$ sudo apt-get install software-properties-common
Cerbot是EFF为了避免以前使用letsencyrpt配置繁琐而开发的工具。因操作系统不一样,安装的软件包也不一样,例如centos安装的是cerbot-auto,以前的ubuntu安装的则是letsencyrpt。具体用那个,直接通过上面的组合,根据文档提示即可。
配置
别担心,Cerbot就是为了减少配置而生的。这里的配置即创建一个目录,配置域名访问服务器即可。首先创建一个文件夹,用于letsencrypt的目录。
$ sudo mkdir -p /etc/letsencrypt
然后编辑nginx,启动一个基本的web服务。假设你的网站根目录再/var/www
下。nginx配置大致如下
server {
listen 80 default_server;
root /var/www;
index index.html index.htm index.nginx-debian.html;
server_name www.example.com;
location / {
try_files $uri $uri/ =404;
}
}
配置完毕nginx,确保能访问 http://www.example.com
。配置域名和http服务器的主要作用在于让letsencrypt校验你是该域名的所有者。因为等下调用Certbot命令的时候,会在www
目录下创建一个隐藏的.well-known/acme-challenge
的文件,然后letsencrypt访问http://www.example.com/.well-known/acme-challenge
。如果无法访问,那么letsencrypt会认为该域名不是你的,自然就无法为你签发证书了。
生成证书
又是安装,又是配置服务器。目前为止还不算复杂。当然,下面也不会复杂,有了上面的准备,生成证书只需要一条命令。
$ sudo certbot certonly --webroot -w /var/www -d www.example.com
运行命令之后,会有一些选择,Yes或者No,有一步需要提供一个邮箱,用于证书快过期的时候收到letsencrypt的提示。
上面的命令中,certonly是子命令,webroot
是一个插件。w
参数表示网站的根目录,即certbot创建.well-know
的地方,d
参数表示签发的域名。可以一次指定多个 w网站
和d域名
的配对。
对于其他系统,有可能不是这个certbot命令,可能是certbot-auto或者letsencrypt
签发成功之后,就会在/etc/letsencrypt
下生成如下的文件:
$ ls
accounts archive csr keys live post-hook.d pre-hook.d renew-hook.d renewal
其中archive
文件夹存放多个归档的证书,keys
是所有的证书。这些都是跟重签证书和续有效期有关的。使用certbot的工具,我们可以忽略这些目录。当前使用的证书存放在live文件下。
在/etc/letsencrypt/live/www.example.com
目录下有README cert.pem chain.pem fullchain.pem privkey.pem
这几个文件,
▪ privkey.pem 这是私匙,对应Nginx的sslcertificatekey选项。 ▪ cert.pem 服务器证书,对应SSLCertificateFile选项。 ▪ chain.pem 除服务器证书之外的所有证书,Nginx对应ssltrustedcertificate选项。 ▪ fullchain.pem 包括上面的服务器证书和其他证书,Nginx对应ssl_certificate选项。
实际上live目录的存放的证书文件都是对archive的连接。我们只要指定该目录的文件,当证书更下的时候,会自动修改连接。
配置HTTPS
我们已经生成了SSL证书,下面就是应用到我们的服务器了。对于配置nginx的https,有mozilla的一个网站提供了最佳实践。我们只需要选择nginx和openssl的版本,就会自动生成一个基础配置给我们,非常方便
对于上面的配置,大致如下:
server {
listen 80 default_server;
listen [::]:80 default_server;
# Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
# certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
ssl_certificate /path/to/signed_cert_plus_intermediates;
ssl_certificate_key /path/to/private_key;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
ssl_dhparam /path/to/dhparam.pem;
# intermediate configuration. tweak to your needs.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
# HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
add_header Strict-Transport-Security max-age=15768000;
# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;
## verify chain of trust of OCSP response using Root CA and Intermediate certs
ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;
....
}
listen 443 ssl http2; 表示监听443端口,并开启http2,当然也可以不开启。
ssl_certificate配置fullchain.pem
的路径; sslcertificatekey配置privkey.pem
的路径。
ssl_dhparam的配置/etc/nginx/ssl
。如果不存在这个文件,就自己创建。创建的命令如下:
$ sudo mkdir /etc/nginx/ssl
$ sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
生成ssl_dhparam.pem
文件大概需要一分钟。ssl_trusted_certificate
的配置是可选的,并且nginx文档也提到ssl_certificate
如果已经包含了intermediates
,所以我们就配置这个。
resolver的作用是配置解析OCSP服务器的域名,通常会写VPS云服务商提供的DNS服务器。这里我们也忽略。
配置完毕之后,重启nginx,此时再访问你的域名www.example.com
就能看见https的协议,浏览器加上了一把绿色的小锁。
检测SSL的安全性
配置成功HTTPS之后,为了验证我们的成果,可以通过Qualys SSL Labs网站检测。不出意外,你将得到一个A+。如果还没有,则仔细看看还差什么方面的修补啦。
如果开启了nginx的HTTP2配置,也会看见浏览器访问的开发者工具中,显示的h2的协议。当然,nginx开启http需要版本在1.9.5之上,编译还需要设置--with-http_v2_module
。对于1.10.1以上的版本,则默认安装的就能开启http2的功能。
更新证书
letsencrypt的证书权威且安全,就是有效期只有90天。过期前需要续时间。好在certbot提供的工具足够简单。
运行命令sudo certbot renew
即可续时间,如果还没到过期时间,运行命令也不会有大碍。当然你可以使用命令测试sudo certbot renew --dry-run
。续的时候certbot也会根据上面配置域名的时候,校验服务器上.well-know
。确保你的服务器依然可以访问这个文件,不然会认证失败。
成功续了时间之后,还需要重启服务器。因此需要自己写一个脚本或者cron。定期更新证书的有效期并且重启nginx服务。
总结
Let‘s Encrypt项目刚开始的时候,使用确实很麻烦。有好心人做了第三方配置脚本,可是对不同系统的兼容性比较差。不知道是不是用户反馈还是EFF看不下去了,才开发了Certbot。Certbot确实是神器,化繁为简。由此可见,很多时候,我们可以通过技术创造去提供更好的服务。使用HTTPS,开启HTTP2.0。让letsencrypt为你的网站保驾护航。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- sed 实用实例参考
- 微信小程序WXML页面常用语法(讲解+示例)
- Golang领域模型开篇,当Go遇上DDD
- Spring事务专题(五)聊聊Spring事务到底是如何实现的
- 深色模式适配指南
- 【Flutter 专题】97 仿网易新闻标签选择器
- 宋宝华:论Linux的页迁移(Page Migration)完整版
- 三、玩转Git三剑客-Git与Github的简单同步
- 四、玩转Git三剑客-Git多人单分支集成协作时的常见场景
- 准时下班的秘密:集成 GitLab && JIRA 实现自动化 workflow
- ZLT-MP v4.1.0 发布
- 高并发系统三大利器之限流
- XtraBackup工具详解 Part 2 xtrabackup安装
- XtraBackup工具详解 Part 4 XtraBackup权限及配置
- XtraBackup工具详解 Part 5 使用innobackupex对数据库进行全备