如何在 CentOS 7 上生成 SSL 證書爲 Nginx 加密

Nginx SSl

本文首發: 開發指南:如何在 CentOS 7 上安裝 Nginx

Let’s Encrypt 是由 Internet Security Research Group (ISRG) 開發的一個自由、自動化和開放的證書頒發機構。目前幾乎全部的現代瀏覽器都信任由 Let’s Encrypt 頒發的證書。nginx

這個教程,將會一步一步的教你如何在 CentOS 7 上經過 Certbot 來生成 SSL 安全證書,並配置到 Nginx 上。git

開始前的準備

在繼續此教程以前,請確保你已經知足瞭如下兩個條件:github

  • 請確保你已經擁有了一個屬於你的域名,而且已經解析到了你的服務器 IP 上,在接下來的教程中,我將會用 kaifazhinan.com 做爲本教程的域名。
  • 請確保你已經啓用了 EPEL 倉庫,而且已經安裝了 Nginx,若是你尚未安裝 Nginx,你能夠先閱讀 如何在 CentOS 7 上安裝 Nginx 這篇文章來安裝 Nginx。

安裝 Certbot

Certbot 是一個很是簡單方便的工具,它能夠幫助咱們生成 SSL 證書,自動更新 SSL 證書,而且將證書配置到 Web 服務上。web

能夠運行如下命令,從 EPEL 倉庫中安裝 Certbot:centos

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 這個目錄中。session

下面的命令將會建立這個目錄,而且使 Nginx 對它擁有讀寫的權限。dom

sudo mkdir -p /var/lib/letsencrypt/.well-known
sudo chgrp nginx /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt

建立代碼片斷

爲了不 Nginx 配置文件中存在重複的代碼,請建立如下兩個代碼片斷(裏面是 Nginx 的配置代碼),咱們將在相關的 Nginx 配置文件中包含這些片斷:

一、首先,建立一個目錄,用於存放 Nginx 配置的代碼片斷文件:

sudo mkdir /etc/nginx/snippets

二、建立第一個片斷文件, 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;
}

三、建立第二個片斷文件,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
相關文章
相關標籤/搜索