使用Nginx实现虚拟主机/反向代理的Let’s Encrypt证书获取方法等

nginxによるバーチャルホスト/リバースプロキシによる Let’s Encrypt 証明書の取得方法

我想在使用nginx虚拟主机的域名上配置Let’s Encrypt证书。

我家以前为了学习目的,在子域名和多个域名上使用了nginx反向代理来进行服务器分配。碰巧安装了Nextcloud,就想试试安装Let’s Encrypt证书…但是没有成功…所以这次稍微调查了一下。

顺便提一下,我们家的构成如下所示。这里以hoge域名为例,实际场景可能会有所不同。另外,Let’s Encrypt证书的安装步骤是放在.org域名下的。

image.png

关于Let’s Encrypt证书

维基百科引述:“Let’s Encrypt是由非营利组织Internet Security Research Group运营的证书颁发机构,免费提供TLS的X.509证书。证书的有效期为90天,期间内可以随时重新颁发证书。”

顺便提一下,现在真正的SSL服务器证书的最长有效期是397天(即13个月),所以如果个人使用的话,无论选择哪种证书都可以。

域名验证方法

Certbot支持HTTP-01挑战和DNS-01挑战的验证。DNS-01挑战在获取通配符证书时使用,但稍微麻烦一些,所以这次我们想使用HTTP-01挑战。关于HTTP-01挑战的验证方式,可以参考下面的网站,很容易理解。

 

这个HTTP-01挑战是不断摸索的过程。我最终明白了以下内容(稍微改动了原文):
① certbot生成了位于文档根目录/.well-known/acme-challenge/TOKEN的文件。
② certbot向Let’s Encrypt认证机构发送请求。
③ Let’s Encrypt访问了http://YOUR_DOMAIN/.well-known/acme-challenge/TOKEN。
④ 如果certbot在第3步的访问中没有问题,它将颁发证书。

Nginx的配置

如果选择使用HTTP-01挑战,前提是如上所述,必须开放HTTP(80)端口。如果要将hoge.org作为Let’s Encrypt证书获得,则应按照以下方式进行nginx配置。
在执行certbot之前,为了确保certbot在文档根目录下生成/.well-known/acme-challenge/TOKEN,需要先进行一些魔法操作。

$ sudo mkdir /usr/share/nginx/html/ssl-proof
$ sudo chmod 755 ssl-proof

我也会进行nginx的配置。

server {
    listen 80;
    server_name .hoge.org;

    location ^~ /.well-known/acme-challenge/ {
        root   /usr/share/nginx/html/ssl-proof;
    }

    location = /.well-known/acme-challenge/ {
        return 404;
    }
}

执行certbot客户端

certbotクライアント は、OS毎にインストール方法が若干異なるのでここでは割愛しインストール済みとします。また certbot のコマンドオプションでは、複数サブドメインの指定もできます。
当然ですが、ここで指定するFQDNはインターネット側から引けるようにDNS設定済みであることが前提となります(A/CNAME どっちでもいいです)。

$ sudo certbot certonly --webroot -w /usr/share/nginx/html/ssl-proof -d hoge.org -d www.hoge.org

当certbot成功时的结果。

/etc/letsencrypt
├── /archive
│   └── /hoge.org
│     └── /cert1.pem  ※サーバ証明書
│     └── /chain1.pem  ※中間証明書
│     └── /fullchain1.pem  ※(中間証明書+サーバ証明書)連結証明書
│     └── /privkey1.pem  ※秘密鍵
└─── live/
   └── hoge.org
       ├── cert.pem -> ../../archive/hoge.org/cert1.pem
       ├── chain.pem -> ../../archive/hoge.org/chain1.pem
       ├── fullchain.pem -> ../../archive/hoge.org/fullchain1.pem
       └── privkey.pem -> ../../archive/hoge.org/privkey1.pem

archive 以下にあるファイルが本体となります。ただ見てわかるようにファイル末尾に番号があります。これは更新などにより加算されていく仕様のため直接参照すると都度修正が発生し面倒です。
そんなわけで通常は、live 以下にあるシンボリックリンクされたファイルを使用するのが普通だそうです。ちなみに live は、certbot が成功するたびに シンボリックリンク先が更新される仕組みとなっています。

将证书配置到nginx上

上記にも記載しましたが、nginx で指定する証明書ファイルは、シンボリックリンクの live 先を指定します。そのため ssl_certificate_key には、サーバ証明書を指定するのですが nginx は、連結ファイルと言われる(中間証明書+サーバ証明書)を指定するのがよいみたいですね。

server {
    listen         443 ssl;
    server_name    *.hoge.org;

    ssl on;
    ssl_certificate     /etc/letsencrypt/live/hoge.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/hoge.org/privkey.pem;
}

HTTPS反向代理的设置

最後の目的である、httpsリバースプロキシの設定をしていきます。といっても普通にSSL証明書の設定するのと同じとなるため面白味にかけると思うので、SSL Server Test で怒られないぐらいの評価とれるっていうぐらいには設定してみます。

ちなみリバースプロキシ先も、SSL化しています。なんでもオーバーヘッドがあるからおすすめしないとかあるようですが勉強用だからよしとしてます。100.100.0.2 先・・・apache ですが、SSL証明書の設定は・・・割愛しますね。

server {
    listen         443 ssl;
    server_name    *.hoge.org;

    ssl on;
    access_log  /var/log/nginx/https.access.log;

    ssl_certificate     /etc/letsencrypt/live/hoge.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/hoge.org/privkey.pem;

    add_header X-XSS-Protection "1; mode=block";
    add_header X-Frame-Options SAMEORIGIN;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'HIGH !aNULL !eNULL !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED !RSA !AES128 !ARIA128';

    server_tokens off;

    ssl_session_cache shared:SSL:10m;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    proxy_set_header    X-Real-IP       $remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header    Host            $host;
    proxy_redirect      off;
    proxy_max_temp_file_size    0;

    location / {
        proxy_pass https://100.100.0.2;
    }
}

Let’s Encrypt を導入するにあたって

自分が食わず嫌いだけだったのかもしれませんが、比較的割と簡単に Let’s Encrypt を導入できると感じました。しかも有効期限が短いとはいえ本物の証明書のため開発時には「Let’s Encrypt を使用」し本番には、「本物の証明書」を切り替えるにもよいかなと。

あとここまで自分で設定する必要もない Cerbot-Docker 使用すれば、より開発者は環境回りを気にせず開発に専念できるのかなーとも思いました。

ともかくオレオレ証明書作成する手間ぐらいで作成できる、というのは大きいですね。

我参考了您的网站。

 

广告
将在 10 秒后关闭
bannerAds