使用Let‘s Encrypt的SSL证书配置HTTPS手记

前段时间,看见很多大会都在分享全站HTTPS的经验。HTTPS固然好,前提是SSL证书,并且签发证书的机构要靠谱。沃通的CA证书就相继被Mozilla和Google封杀了。曾经对于普通用户,权威,安全,并且免费的证书无疑就像天上的星星,可望而不可及。现在,这些星星变成了馅饼掉了下来。没错,我们可以申请安全免费的ssl证书--- Let‘s Encrypt。

Let’s Encrypt是电子前哨基金会(EFF)发布的免费 SSL 证书服务,Google,Mozilla和Microsoft都极力支持。很早之前就听说了let’s encrypt,当时碍于其证书有效期短,并且配置麻烦,遂懒得折腾。最近发现他们的网站发布了工具和一系列自动化的工作流配置。尝试了一下,还蛮不错。

安装 Cerbot

Certbot专门用来部署Let‘s encrypt的工具,其官网会根据使用的web服务器软件和操作系统平台,提供响应的安装工具和安装方法。

我这里选择了NginxUbuntu16.10的组合。会看到网站跳转到一个简易的使用文档。使用下面的命令安装即可:

WechatIMG2.jpeg
$ 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的ssl_certificate_key选项。
  • cert.pem 服务器证书,对应SSLCertificateFile选项。
  • chain.pem 除服务器证书之外的所有证书,Nginx对应ssl_trusted_certificate选项。
  • fullchain.pem 包括上面的服务器证书和其他证书,Nginx对应ssl_certificate选项。

实际上live目录的存放的证书文件都是对archive的连接。我们只要指定该目录的文件,当证书更下的时候,会自动修改连接。

配置HTTPS

我们已经生成了SSL证书,下面就是应用到我们的服务器了。对于配置nginx的https,有mozilla的一个网站提供了最佳实践。我们只需要选择nginx和openssl的版本,就会自动生成一个基础配置给我们,非常方便

WechatIMG3.jpeg

对于上面的配置,大致如下:

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的路径; ssl_certificate_key配置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为你的网站保驾护航。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容