首页 > 服务器 > 服务器环境 > 给博客加把小绿锁,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证书获取教程》有 14 条评论

  1. Pingback 引用通告: 【教程】Let’s Encrypt免费HTTPS SSL证书获取教程 – Sabia科学研究所

  2. Firefox 54.0Firefox 54.0Mac OS X 10.11Mac OS X 10.11

    Hi 領鮮一步, just became aware of your blog through Google, and found that it
    is truly informative. I’m going to watch out for brussels.
    I’ll be grateful if you continue this in future. A lot
    of people will be benefited from your writing. Cheers!

  3. 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改成自己的两个域名,最后一行要不要改?

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

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

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

    assassdda是的撒大所

  6. 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=

    这是为什么

  7. 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.

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

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

    加密链接 是趋势啊

发表回复

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

有人回复时邮件通知我