资讯专栏INFORMATION COLUMN

如何在 CentOS 7 上生成 SSL 证书为 Nginx 加密

xiaoqibTn / 2972人阅读

摘要:本文首发开发指南如何在上安装是由开发的一个自由自动化和开放的证书颁发机构。目前几乎所有的现代浏览器都信任由颁发的证书。这个教程,将会一步一步的教你如何在上通过来生成安全证书,并配置到上。支持,严格传输安全并强制执行几个以安全为中心的头。

本文首发:开发指南:如何在 CentOS 7 上安装 Nginx

Let’s Encrypt 是由 Internet Security Research Group (ISRG) 开发的一个自由、自动化和开放的证书颁发机构。目前几乎所有的现代浏览器都信任由 Let’s Encrypt 颁发的证书。

这个教程,将会一步一步的教你如何在 CentOS 7 上通过 Certbot 来生成 SSL 安全证书,并配置到 Nginx 上。

开始前的准备

在继续此教程之前,请确保你已经满足了以下两个条件:

请确保你已经拥有了一个属于你的域名,并且已经解析到了你的服务器 IP 上,在接下来的教程中,我将会用 kaifazhinan.com 作为本教程的域名。

请确保你已经启用了 EPEL 仓库,并且已经安装了 Nginx,如果你还没有安装 Nginx,你可以先阅读 如何在 CentOS 7 上安装 Nginx 这篇文章来安装 Nginx。

安装 Certbot

Certbot 是一个非常简单方便的工具,它可以帮助我们生成 SSL 证书,自动更新 SSL 证书,并且将证书配置到 Web 服务上。

可以运行以下命令,从 EPEL 仓库中安装 Certbot:

sudo yum install certbot
生成 Dh (Diffie-Hellman) 组

Diffie–Hellman 密匙交换是一种可以在不安全的通信信道上安全交换密钥的方法。

现在运行以下命令,可以来生成一个新的 2048 位的 DH 参数:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
2048 位,生成时间大概 3-5 分钟左右。当然,如果您愿意也可以将大小改为 4096 位,但是这样的话,可能生成的时间至少需要花费 30 分钟,此操作具体时长取决于系统熵。
生成 SSL 证书

要生成域名的 SSL 证书,我们将使用 Webroot 插件在 ${webroot-path}/.well-known/acme-challenge 目录中创建临时文件来验证请求的域名。Let"s Encrypt 服务器会向临时文件发出 HTTP 请求,以验证请求的域名是否被正确的解析到了正在运行 Certbot 的服务器。

为了简便,我们将把所有访问 .well-known/acme-challenge 的 HTTP 请求都映射到 /var/lib/letsencrypt 这个目录中。

下面的命令将会创建这个目录,并且使 Nginx 对它拥有读写的权限。

sudo mkdir -p /var/lib/letsencrypt/.well-known
sudo chgrp nginx /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt
创建代码片段

为了避免 Nginx 配置文件中存在重复的代码,请创建以下两个代码片段(里面是 Nginx 的配置代码),我们将在相关的 Nginx 配置文件中包含这些片段:

1、首先,创建一个目录,用于存放 Nginx 配置的代码片段文件:

sudo mkdir /etc/nginx/snippets

2、创建第一个片段文件, letsencrypt.conf,其全路径为: /etc/nginx/snippets/letsencrypt.conf

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

3、创建第二个片段文件,ssl.conf,其全路径为: /etc/nginx/snippets/ssl.conf

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

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

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;

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

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

上面的代码中包含 Mozilla 的推荐部分。 支持 OCSP Stapling,HTTP 严格传输安全(HSTS)并强制执行几个以安全为中心的 HTTP 头。

加载 letsencrypt.conf

代码片段创建完成之后,就可以打开 Nginx 的域名独立配置文件,将 letsencrypt.conf 文件引入。

在这里,我们的域名是 kaifazhinan.com ,所以我们的配置文件为 kaifazhinan.com.conf, 文件的全路径为 /etc/nginx/conf.d/kaifazhinan.com.conf

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

  include snippets/letsencrypt.conf;
}

注意: 我们建议针对不同的域名,创建不同的独立配置文件。这样会比较清晰,便于管理和查找对应的配置。

Nginx 的主配置文件中有一行代码是 include /etc/nginx/conf.d/*.conf,这行代码的意思就是加载 /etc/nginx/conf.d/ 目录下所有以 .conf 结尾的配置文件,所以我们直接将独立的配置文件保存在 /etc/nginx/conf.d/ 目录下就会自动引入。

生成证书

重新加载 Nginx 配置使更改生效:

sudo systemctl reload nginx

你现在可以运行 Certbot 使用 Webroot 插件,为你的域名生成 SSL 证书:

sudo certbot certonly --agree-tos --email admin@kaifazhinan.com --webroot -w /var/lib/letsencrypt/ -d kaifazhinan.com -d www.kaifazhinan.com

注意: 记得将 admin@kaifazhinan.com 换成你自己的邮箱,还有 kaifazhinan.comwww.kaifazhinan.com 换成你的域名。

如果成功的生成了 SSL 证书,那么 Certbot 将打印类似以下的内容:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/kaifazhinan.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/kaifazhinan.com/privkey.pem
   Your cert will expire on 2019-02-11. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let"s Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
配置 Nginx

现在你已经成功生成了 SSL 证书,现在可以修改 Nginx 的域名配置了,这里我们的域名是配置文件是 kaifazhinan.com.conf,文件的全路径是 /etc/nginx/conf.d/kaifazhinan.com.conf

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

    include snippets/letsencrypt.conf;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name www.kaifazhinan.com;

    ssl_certificate /etc/letsencrypt/live/kaifazhinan.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/kaifazhinan.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/kaifazhinan.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    return 301 https://kaifazhinan.com$request_uri;
}

server {
    listen 443 ssl http2;
    server_name kaifazhinan.com;

    ssl_certificate /etc/letsencrypt/live/kaifazhinan.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/kaifazhinan.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/kaifazhinan.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    # 如果有补充的配置,可以写在这里
}

上面的代码,我们将 HTTP 的请求重定向到了 HTTPS,将 www.kaifazhinan.com 重定向到了 kaifazhinan.com 上。

最后,通过下面的命令,重新加载 Nginx,使上面的配置生效:

sudo systemctl reload nginx
自动更新 Let’s Encrypt SSL 证书

Let’s Encrypt 颁发的 SSL 证书有效时间是 90 天。我们需要在证书过期之前自动续订证书,这里将创建一个每天运行两次的定时任务 ,并在证书到期前 30 天自动续订。

通过运行 crontab 命令,来创建一个定时任务:

sudo crontab -e

上面的命令,会自动创建一个文件,并自动进入编辑状态,所以直接复制下面的内容粘贴到里面即可:

0 */12 * * * root test -x /usr/bin/certbot -a ! -d /run/systemd/system && perl -e "sleep int(rand(3600))" && certbot -q renew --renew-hook "systemctl reload nginx"

保存并关闭文件。

如果要测试是否能够正常更新证书,你可以在 certbot 命令后面添加 --dry-run 这个参数来主动触发更新命令。

sudo certbot renew --dry-run

如果没有输出错误,则表示 SSL 证书更新成功。

总结

通过此教程,你学会了:

如何使用 Let’s Encrypt 客户端 Certbot 为你的域名创建了 SSL 证书;

也通过创建 Nginx 的代码片段,来避免 Nginx 配置文件中的代码冗余,并且将 SSL 证书配置到了 Nginx 服务中;

最后,你还创建了一个定时任务,来自动更新你的 SSL 证书,保证它不会过期。

如果你想了解 Certbot 的更多信息,可以参考它的官方文档。

期待下次与你相见 : )

本文首发:开发指南:如何在 CentOS 7 上安装 Nginx

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40350.html

相关文章

  • nginx+WordPress搭建个人博客全流程

    摘要:正好最近有一台空闲的于是来搭建一个玩玩。因此我们可以申请免费的证书,这个证书不但免费,而且操作非常简单,虽然每次只有天的有效期,但可以通过脚本配置定期更新。这个验证服务以后更新证书还要用到,要一直保留。创建一个并通过赋予执行权限。 0x00 前言         WordPress是世界上最受欢迎的CMS系统,它是基于php和MySQL技术栈的,并且还有很多插件,可扩展性非常强。正好最...

    WilsonLiu95 评论0 收藏0
  • 配置Nginx+Springboot+Qiniu+Https的一点心得

    摘要:通过购买免费的证书购买地址详细操作请点击免费申请阿里云赛门企业级铁克证书在上面配置我们现在这里只讲解在阿里云下购买的证书进行配置,现在都有了证书,现在我们来配置。 最近项目中的网站要设置https,虽然进入软件行业6年了,配置这个还是显得信心不足,还好网上有好多网友分享的文章可以从中学习,但是有优也有劣,凭我自己的一点经验从中甄选出好一点的文章跟大家分享一下。 1、什么是Https? ...

    阿罗 评论0 收藏0
  • 给网站戴上「安全套」

    摘要:为了避免那些杯具,网站需要戴上名为的安全套。我也是经网友提醒才给网站增加了以提高安全性,谢谢他。在谈安全时,从来就没有绝对的安全,就像安全套不能百分百避免中标。要想使自己的网站时刻保持相对安全的状态,站长本身就应该是一名黑客。 本文首发于欧雷流《给网站戴上「安全套」》。由于我会时不时对文章进行补充、修正和润色,为了保证所看到的是最新版本,请阅读原文。 上周六我去一家售后服务点参加了「冬...

    RancherLabs 评论0 收藏0

发表评论

0条评论

xiaoqibTn

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<