启用HTTPS过程实例记录

因为 HTTPS 采用 SSL 加密,所以部署 HTTPS
时需要申请证书,证书的作用就是对浏览器和Web服务器双方的身份验证。

Let's Encrypt是由互联网安全研究组(ISRG)开发的免费开放认证机构。 Let's
Encrypt颁发的证书现在几乎所有浏览器都信任。

步骤1:申请证书

在本教程中,我们将逐步提供关于如何使用Ubuntu
18.04上的certbot工具使用Let's Encrypt保护Nginx的说明。

  我们采用Let's
Encrypt签发的免费证书,虽然
Let’s
Encrypt
只有90天的有效期,但是可以用Certbot自动部署工具,进入Certbot
主页,可以看到下图所示。

先决条件

Let's Encrypt
签发的证书有效期只有90天,甚至希望缩短到60天。有效期越短,泄密后可供监控的窗口就越短。为了支撑这么短的有效期,就必须自动化验证和签发。

在继续本教程之前,请确保您已满足以下先决条件:

因为自动化了,长远而言,维护反而比手动申请再安装要简单。

  1. 你有一个指向你的公共服务器IP的域名。
    在本教程中,我们将使用example.com。
  2. 通过这里的介绍安装Nginx 
    https://www.linuxidc.com/Linux/2018-05/152257.htm
  3. 你的域名有一个服务器模块。 你可以按照这个介绍了解如何创建一个。
    https://www.linuxidc.com/Linux/2018-05/152258.htm

图片 1

安装Certbot

在Certbot首页选择自己的web服务器类型和操作系统,我们使用的是
nginx+CentOS6.5,选择后就会自动跳转到install页面,

更新软件包列表并安装certbot软件包:

注意:centos6.5默认的python版本是2.6.6,安装Certbot需要python2.7版本,未来Certbot会对python3.x支持(Python
3.x support will hopefully be added in the future),

sudo apt update
sudo apt install certbot

遇到了升级python的问题,可以参考另一篇博客:如何升级Python? 
http://www.linuxidc.com/Linux/2015-02/112926.htm

图片 2

1.安装certbot

生成强大的Dh(Diffie-Hellman)组

  wget

Diffie-Hellman密钥交换(DH)是通过不安全的通信信道安全地交换加密密钥的方法。
我们将生成一组新的2048位DH参数以加强安全性:

  chmod a+x certbot-auto

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

  certbot-auto

图片 3

执行certbot-auto命令会安装一些packages,创建虚拟环境,在创建虚拟环境的过程中,需要输入域名(提醒:用逗号或/或空格分割域名)、输入邮箱(用于急切的通知和找回丢失的key)、同意agreement、选择ssl.conf;看下面的图片

如果你喜欢,你可以改变大小到4096位,但在这种情况下,生成可能需要超过30分钟,这取决于系统熵。

图片 4 图片 5 
图片 6 
图片 7

获取SSL证书

2.申请证书

要获取我们域的SSL证书,我们将使用Webroot插件,该插件通过在${webroot-path}/.well-known/acme-challenge目录中创建所请求域的临时文件以及Let's
Encrypt
验证服务器会使HTTP请求验证所请求域的DNS是否解析到运行certbot的服务器。

  申请证书有两种验证方式,一种是standalone,这种验证方式虽然也可以部署后,但是以后更新证书的时候需要重启
web 服务器;

为了使它更简单,我们将把.well-known/acme-challenge的所有HTTP请求映射到单个目录/var/lib/letsencrypt。
以下命令将创建该目录并将其设置为可写入Nginx服务器。

  第二种是webroot,就是在网站根目录下生成一个文件,通过访问该文件来验证,不需要重启
web 服务器。

mkdir -p /var/lib/letsencrypt/.well-known
chgrp www-data /var/lib/letsencrypt
chmod g+s /var/lib/letsencrypt

  第一种命令:./path/to/certbot-auto certonly --standalone -d example.com -d
www.example.com

图片 8

  第二种命令:./path/to/certbot-auto certonly --webroot -w /var/www/example -d
example.com -d www.example.com -w /var/www/baidu -d baidu.com -d
www.baidu.com (/var/www/example是网站的目录)

为避免重复代码,请创建以下两个片段,我们将在所有Nginx服务器块文件中使用这两个片段:

我用了第二种方法。执行第二种命令的过程中会有提醒,图片如下

/etc/nginx/snippets/letsencrypt.conf

  图片 9

location ^~ /.well-known/acme-challenge/ {
  allow all;
  root /var/lib/letsencrypt/;
  default_type "text/plain";
  try_files $uri =404;
}

3.测试自动生成证书是否成功

图片 10

  ./path/to/certbot-auto renew --dry-run

/etc/nginx/snippets/ssl.conf

4.添加定时任务自动更新证书

ssl_dhparam /etc/ssl/certs/dhparam.pem;

  Since Let's Encrypt certificates last for 90
days,所以我们还是写个定时任务吧

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

  crontab -u root -e (-u root 表示哪个用户的定时任务)

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;

  添加:* * * */3 * ./path/to/certbot-auto renew --quiet
(表示每3个月执行一次)

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 30s;

步骤2:部署https

add_header Strict-Transport-Security "max-age=15768000;
includeSubdomains; preload";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;

  修改nginx的配置文件(比如在/usr/local/nginx/conf/nginx.conf),添加如下代码,然后重启nginx

图片 11

# HTTPS server
# 部署HTTPS
server {
  listen 443 ssl;
  server_name www.example.com example.com;
  root /var/www/example;

上面的代码片段使用了Mozilla的chippers recomendend,支持OCSP
Stapling,HTTP严格传输安全性(HSTS),并强制实施少量以安全为重点的HTTP标头。
一旦创建了片段,打开域服务器块并包含letsencrypt.confsnippet,如下所示:

  ssl on;

/etc/nginx/sites-available/example.com

  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key
/etc/letsencrypt/live/example.com/privkey.pem;
  ssl_trusted_certificate
/etc/letsencrypt/live/example.com/chain.pem;

server {
  listen 80;
  server_name example.com www.example.com;

  ssl_session_cache shared:SSL:1m;
  ssl_session_timeout 5m;
  ssl_protocols TLSv1.2;(version1.2 is
the only secure protocol version. 请参考SSL Labs: Increased Penalty When TLS 1.2 Is Not
Supported)

  include snippets/letsencrypt.conf;
}

相关文章

Comment ()
评论是一种美德,说点什么吧,否则我会恨你的。。。