首页 > 服务器 > 服务器环境 > 给博客加把小绿锁,Let’s Encrypt免费HTTPS SSL证书获取教程
2016
03-10

给博客加把小绿锁,Let’s Encrypt免费HTTPS SSL证书获取教程

Let’s Encrypt是EFF、Mozilla、Cisco、Akamai、IdenTrust与密西根大学研究人员共同创立的组织,这是一个免费的凭证中心(Certification Authority,CA),目的在于推动全球所有的网站都使用HTTPS加密传输,并由非营利的网际网路安全研究组织Internet Security Research Group(ISRG)负责营运。

对于开发者来说,部署HTTPS是一个双赢的选择,用户可以借此获得更加安全的使用体验,而站点也能够抵御恶意软件的注入或广告追踪。Let’s Encrypt已于2015年12月3日进入公测(Public Beta),所有网站都可以免费获取Let’s Encrypt的证书。

据说Google优先收录带HTTPS加密的网站。

获取Let’s Encrypt证书

项目GitHub地址:https://github.com/letsencrypt/letsencrypt – > https://github.com/certbot/certbot

官方教程:https://certbot.eff.org/docs/using.html

2016年5月更新:

最近官方做了调整,简化了获取证书的难度,并将项目名改为了certbot,以下为全新安装方法:

等待安装依耐环境并初始化,然后直接看第四步。

以前的获取方法

### 以下为老版本获取方法 ###

1.登录服务器,安装git

2.安装python2.7环境

如果已经有了python2.7环境,可以跳过。

可以安装EPEL和IUS软件库,见:Centos/RedHat 7/6/5切换阿里云源并安装EPEL/IUS/REMI仓库

CentOS 6安装python2.7

CentOS7:

3.获取letsencrypt客户端

初始化letsencrypt(这步可以跳过,直接到第4步)

会自动安装依赖环境,如果遇到软件包安装失败:使用镜像解决Python pip安装软件包失败

如果初始化时提示python版本不对:

如果一切顺利,中途可能会弹弹窗要求同意协议,类似于这样:

给博客加把小绿锁,Let's Encrypt免费HTTPS SSL证书获取教程 - 第1张  | 扩软博客

或者像这样:

给博客加把小绿锁,Let's Encrypt免费HTTPS SSL证书获取教程 - 第2张  | 扩软博客

以上两种情形都说明初始化成功。

现在,你可以查看帮助信息:

输出内容可以看文章的最后。

### 以上为老版本获取方法 ###

4.运行客户端获取证书

获取证书有几种方案,官方已经开发了用于Apache服务器的插件,而Nginx的插件还是实验性功能。本文不探讨使用插件的方式,读者可以自行阅读官方的User Guide。

下面是两种通用获取方法,推荐使用 方案二

方案一)获取证书时会使用80端口,如果你的服务器可以关闭,可以使用如下方式:

关闭占用80端口的服务器,比如Apache或者Nginx

输入以下命令来获取证书:

-d 后面为需要获取证书的域名,申请完成后所有域名共用一个证书。

如果申请成功,会显示以下信息,可惜的是获取一次有效期只有90天,到期后需要续签:

证书文件放在了/etc/letsencrypt/live下。

方案二)如果你不想关闭服务器,也可以指定webroot来获取证书:

–server: 指定 letsencrypt 服务器,-w: 指定网站根目录,-d: 指定网站域名。用 , 分开同一个网站绑定的所有域名

PS:如果你的域名使用的是国内的NS服务商,比如:hichina、dnspod、cloudxns,可能不能正常通过验证,见这条 Issue:DNS CAA query timeout

错误提示类似于:

解决方案是将域名的NS服务商换为国外的,例如namecheap、linode、cloudflare、google cloud DNS。

你可以先尝试是否能正常获取,如果不能的话,可以选择切换域名的NS服务器。我在操作的时候将域名的NS换到了 https://www.cloudflare.com,但是换了NS需要等几个小时才能生效。

配置Nginx添加Https

添加一个网站:

以上设置会将所有的 Http 请求通过301重定向到 Https。

更新证书的时候,letsencrypt 会通过 http 协议访问你网站目录下的一个文件,请求类似于:

而通过上述设置,可以让服务器上的所有网站证书更新时使用同一个目录,而不用分别去配置每个网站的目录。

打开网站看看,已经加上绿色锁头了,可是如果网页上存在有没走Https的链接,就不能全绿。

给博客加把小绿锁,Let's Encrypt免费HTTPS SSL证书获取教程 - 第3张  | 扩软博客

Let’s Encrypt续签

新版续签只需要一条命令:

或者:

你可以选择添加一个计划任务,自动续签。

优化Https安全性

各服务器推荐配置可以参考:https://cipherli.st/

1.首先生成dhparam.pem:

我用的是2048bit加密,当然如果你服务器配置够好,可以选4096bit。

2.生成HTTP Public Key Pinning 参考:Public Key Pinning

在这里直接贴上我的配置:

配置完之后可以测试一下现在的安全级别:https://www.ssllabs.com/ssltest/

给博客加把小绿锁,Let's Encrypt免费HTTPS SSL证书获取教程 - 第4张  | 扩软博客

HTTP Security Report:https://httpsecurityreport.com/

配置参考地址:

1.Configuring Let’s Encrypt for nginx with Automatic Renewal

2.Strong SSL Security on nginx

3.使用 Nginx 构建优化的 https 服务

将网站加入HSTS preload list

HSTS preload list是什么?

HSTS preload list是Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用Chrome浏览器访问时,会自动转换成HTTPS。Firefox、Safari、Edge浏览器也会采用这个列表。

加入地址:https://hstspreload.appspot.com

加入条件:

  1. 有效的证书;
  2. 将所有HTTP流量重定向到HTTPS;
  3. 确保所有子域名启用HTTPS,特别是www子域名;

同时,HSTS响应头需要满足以下条件。

  1. max-age至少需要18周,10886400秒;
  2. 必须指定includeSubdomains参数;
  3. 必须支持preload参数。

例如:

从申请到审核通过,时间在几天到几周不等。申请后,你可以在 https://hstspreload.appspot.com 网站中查询最新的状态, 也可以在Chrome浏览器的地址框中输入“chrome://net-internals/#hsts”查看。

从审核通过到正式加入到 Chrome 的 stable release 版本中还需要一段时间,因为要经过 canary、dev、beta 以及 stable。

这个文件就是 Chrome 的预加载列表文件:transport_security_state_static.json

参考地址:解决缺陷,让HSTS变得完美

以下为letsencrypt-auto --help all的输出信息:

点击显示隐藏内容


链接:

1.Let’s Encrypt User Guide

2.V2EX我的 Let’s Encrypt 证书也下来了

3.折腾Let‘s Encrypt免费SSL证书

4.One-line certificate generation/renews with Letsencrypt and nginx

最后编辑:
作者:
百度ID:“度娘程序员”,博主。
捐 赠如果您觉得这篇文章有用处,请支持作者!鼓励作者写出更好更多的文章!

给博客加把小绿锁,Let’s Encrypt免费HTTPS SSL证书获取教程》有 12 条评论

  1. Google Chrome 59.0.3071.104Google Chrome 59.0.3071.104Mac OS X 10.12.4Mac OS X 10.12.4

    我用了cloudxns的域名解析,他也提示我成功了,还发了邮件让我验证,但还是没变https,会不会是我配置NGINX出错了?

    这一段我隔一行粘贴在 NGINX配置文件后面,把里面的server name改成自己的两个域名,最后一行要不要改?

  2. Google Chrome 58.0.3029.110Google Chrome 58.0.3029.110Windows 10 x64Windows 10 x64

    想问下,官方的说明有更新嘛?英文我看不懂,麻烦博主看看。

  3. Google Chrome 53.0.2785.143Google Chrome 53.0.2785.143Windows 7 x64Windows 7 x64

    assassdda是的撒大所

  4. Google Chrome 49.0.2623.75Google Chrome 49.0.2623.75Windows 10 x64Windows 10 x64

    openssl rsa -in privkey.pem -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64
    writing RSA key
    FankyFNJUnHYf737yBalLqkC8bWTxZGTCeoMezFgNX0=

    openssl x509 -in chain.pem -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
    writing RSA key
    YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg=

    这几条命令返回的是openssl rsa -in privkey.pem -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64
    writing RSA key
    FankyFNJUnHYf737yBalLqkC8bWTxZGTCeoMezFgNX0=

    openssl x509 -in chain.pem -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
    writing RSA key
    YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg=

    openssl x509 -in chain.pem -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
    Error opening Certificate chain.pem
    140376260896584:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen(‘chain.pem’,’r’)
    140376260896584:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:
    unable to load certificate
    unable to load Public Key
    139816420394824:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: PUBLIC KEY
    47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=

    这是为什么

  5. Google Chrome 49.0.2623.75Google Chrome 49.0.2623.75Windows 10 x64Windows 10 x64

    使用博主的设置后,安全评分是A+了,但是添加HSTS preload list提示下面的
    我把D改成大写,Nginx又报错
    Warning: Non-standard capitalization of includeSubDomains
    Header contains the token includeSubdomains. The recommended capitalization is includeSubDomains.

  6. Pingback 引用通告: Wordpress使用SSL - | 异次元sky

  7. Google Chrome 43.0.2357.65Google Chrome 43.0.2357.65Windows 10 x64Windows 10 x64

    加密链接 是趋势啊

发表回复

你的邮箱地址不会被公开,垃圾评论将被删除。

有人回复时邮件通知我