Let's Encrypt 泛域名證書申請及配置

file

Let's Encrypt 在今年 3 月份就已經推出泛域名證書支持了,之前我一直是使用的單域名證書,加上站點開啓了 HSTS 支持,當新增網站應用時不得不爲其單獨申請證書,十分不便。

目前比較經常使用的爲 Let's Encrypt 生成證書的工具比較多,如php

這裏咱們將使用 acme.sh 這個工具來安裝 Let's Encrypt 證書。acme.sh 是一個很是優秀的證書生成工具,其 官網 更是有詳細的中文文檔支持 。nginx

安裝

你能夠經過下面的腳原本安裝 acme.shgit

curl  https://get.acme.sh | sh
該操做須要服務器支持 socatcurl 模塊。(apt install socat curl)

安裝成功後,會在當前文件夾下生成 .acme.sh 文件夾。github

生成證書

acme.sh 實現了 acme 協議支持的全部驗證協議,通常有兩種方式驗證: httpdns 驗證。因爲泛域名證書的解析目前僅支持 DNS 方式驗證,下面咱們將經過 DNS 方式來驗證你的域名全部權。
acme.sh  --issue  --dns  -d godruoyi.com -d *.godruoyi.com

這種方式會將相應的解析記錄顯示出來,而後你須要在你的域名管理面板中添加這條 txt 記錄。並等待解析完成以後,從新用下面命令生成證書:web

acme.sh  --renew   -d mydomain.com
注意第二次這裏用的是 --renew,固然咱們並不想這麼麻煩, dns 方式的真正強大之處在於可使用域名解析商提供的 api 自動添加 txt 記錄完成驗證。

根據你的域名服務商類型,選擇對應的 DNS API。如vim

一、騰訊雲api

這裏申請 API Token,獲取到 IDToken 後執行:安全

file

export DP_Id="id"
export DP_Key="token"

二、阿里雲bash

這裏申請阿里雲 Accesskey服務器

file

獲取到 KEYSecret 後執行下面命令:

export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"

三、生成證書

在配置好上述設置後,就可經過

.acme.sh/acme.sh --issue --dns dns_dp -d godruoyi.com -d *.godruoyi.com

來生成證書,注意這裏第一個域名爲頂級域名,後面個爲泛域名。

這種方式將自動爲你的域名添加一條 txt 解析,驗證成功後,這條解析記錄會被刪除,因此對你來講是無感的,就是要等 120秒

證書生成成功後,默認保存在 .acme.sh/你的頂級域名 中。

配置 Nginx

下面咱們來爲 Nginx 配置 SSL 證書支持。

一、移動下列證書到 /etc/nginx/ssl 文件夾,若無該文件夾,自行建立。

cp ~/.acme.sh/godruoyi.com/fullchain.cer /etc/nginx/ssl/fullchain.cer
cp ~/.acme.sh/godruoyi.com/godruoyi.com.key /etc/nginx/ssl/godruoyi.key

二、新建 ssl-params.conf 並把它放到 Nginx 的 snippets 目錄中。

下面的這些配置來自 提升安全性的最佳 Nginx 配置,建議參考。
# /etc/nginx/snippets/ssl-params.conf

server_tokens   off;

ssl_session_cache        shared:SSL:10m;
ssl_session_timeout      60m;

ssl_session_tickets      on;

ssl_stapling             on;
ssl_stapling_verify      on;

resolver                 8.8.4.4 8.8.8.8  valid=300s;
resolver_timeout         10s;
ssl_prefer_server_ciphers on;

# 證書路徑 絕對地址
ssl_certificate          /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key      /etc/nginx/ssl/godruoyi.key;

ssl_protocols            TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload";
add_header  X-Frame-Options  deny;
add_header  X-Content-Type-Options  nosniff;
add_header x-xss-protection "1; mode=block";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https:; connect-src 'self' https:; img-src 'self' data: https: blob:; style-src 'unsafe-inline' https:; font-src https:";

三、接下來在 Nginx 主配置文件中開啓 SSL 支持

# /etc/nginx/nginx.conf

http {
    ....
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}

完整的 Nginx 配置文件請參考 個人 Nginx 配置

四、配置虛擬主機

# /etc/nginx/sites-available/godruoyi.com

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name godruoyi.com www.godruoyi.com;
    return 301 https://$server_name$request_uri;
}

server {
    # 注意咱們設置該站點爲默認站點,並移除了 nginx 默認的 default 配置
    listen 443 ssl http2 fastopen=3 reuseport default_server;
    listen [::]:443 ssl http2 fastopen=3 reuseport default_server;

    server_name www.godruoyi.com godruoyi.com;

    # 引入 SSL 及 PHP 配置
    include snippets/fastcgi-php.conf;
    include snippets/ssl-params.conf;

    root /home/godruoyi/websites/godruoyi.com/public;

    access_log /home/godruoyi/websites/godruoyi.com/storage/logs/nginx-access.log;
    error_log  /home/godruoyi/websites/godruoyi.com/storage/logs/nginx-error.log error;

    index index.php;

    # 當訪問域名是不  godruoyi.com 強制跳轉到 https://godruoyi.com
    if ($host != 'godruoyi.com' ) {
        rewrite ^/(.*)$ https://godruoyi.com/$1 permanent;
    }
}

再來看一個 admin.godruoyi.com 的配置

# /etc/nginx/sites-available/admin.godruoyi.com

server {
    listen 80;
    listen [::]:80;

    server_name admin.godruoyi.com;
    return 301 https://$server_name$request_uri;
}
server {
    # 若是多個域名配置在同一主機,這裏只須要監聽到 433 就能夠了,
    # 不須要再添加 ssl http2 fastopen=3 reuseport default_server 之類的了
    listen 443;      
    listen [::]:443;

    root /home/godruoyi/websites/admin.godruoyi.com/public-admin;

    access_log /home/godruoyi/websites/admin.godruoyi.com/storage/logs/nginx-access.log;
    error_log  /home/godruoyi/websites/admin.godruoyi.com/storage/logs/nginx-error.log error;

    server_name admin.godruoyi.com;

    index index.php;

    client_max_body_size 20M;

    include snippets/fastcgi-php.conf;
    include snippets/ssl-params.conf;

    if ($host != 'admin.godruoyi.com' ) {
        rewrite ^/(.*)$ https://admin.godruoyi.com/$1 permanent;
    }
}

四、虛擬主機配置完成,接下來爲其配置軟鏈接測試成功後就能夠重啓 Nginx 啦。

sudo ln -s /etc/nginx/sites-available/godruoyi.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/admin.godruoyi.com /etc/nginx/sites-enabled/

# 測試配置是否成功
sudo nginx -t

sudo service nginx restart

以上全部配置你均可以在 這裏 找到,別忘了點顆小星星喲

文章首發於 二楞的閒談雜魚


參考連接

相關文章
相關標籤/搜索