Nginx環境でOpenSSL証明書、Let'sEncrypt署名、およびサイトディレクトリ接続を自動的に生成します。

Nginx環境でOpenSSL証明書、Let'sEncrypt署名、およびサイトディレクトリ接続を自動的に生成します。

Ubuntu Server 16.04 VPSとNginxがあります。今はHTTP1(TLSなし、ポート80を使用)を実装していますが、すべての(Wordpress)サイトに対して「さらに一歩進む」HTTP2(TLSを使用、ポート443を使用)を使用したいと思います。

私の環境を次のように調整するとしましょう。

1. ファイアウォール

ufw app list # Choose Nginx HTTPS

2. サーバーブロック

基本サーバーブロック

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name server_domain_or_IP;
    return 302 https://$server_name$request_uri;
}

server {

    # SSL configuration

    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;
}

サイトサーバーブロックあたり

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    root /var/www/html/example.com;
    index index.php index.html index.htm index.nginx-debian.html;
    example.com www.example.com;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

OpenSSL証明書を作成し、Let'sEncryptを使用して署名し、各サイトディレクトリと個別に接続する必要があります。

私の質問:

端末内でできるだけ自動的にOSSL証明書、LEトークン、およびSDIR接続を作成するにはどうすればよいですか?もちろん、私の電子メールでドメインを確認する必要がある部分もありますが、他にAFAIUはすべてが端末で行われるため、完全自動化が可能です。

makeこれを達成するのに役立つBashスクリプトコード(またはGNUなどの特定のユーティリティの利用)の例を共有できますか?

ノート

  1. 私はドッキングのないソリューションを控えめに好みます(私はここを読んだ実際、これはドッカーを実装しているように見える更新に関連していますが、10個未満の小規模サイトを持つ小規模プライベートサーバーに対して最小限の方法で行うことは決してありません。

  2. 私は、生成、署名、およびサイトディレクトリ接続には更新とは異なるアルゴリズムが必要であることを理解しています。私が求めるのは創作、署名、関連だけです。

私がまだこのような質問をする理由は次のとおりです。

まあ、私は自己管理型最小VPS(カーネル/シェルカスタムなし、コンパイルなし、貢献ユーティリティなし)でHTTP2を使用したいと思います。そして私には、このアルゴリズムを多くのサイトに対して、または毎回手動で追加することが狂っているようです。新しいサイト。

答え1

使用dehydrated(https://github.com/lukas2511/dehydration)。

/.well-known/acme-challenge/Let's Encryptサービスはこの場所の下のチャレンジレスポンスを見て、あなたが証明書を要求したサイトの所有者であることを確認するため、各サイトの場所を追加する必要があります。

location /.well-known/acme-challenge/ { allow all; root /st/hosting/hamilton/htdocs; } 

脱水構成でも同じパスを使用します。

egrep -v "^#|^[[:space:]]*$" config                                          
WELLKNOWN="/st/hosting/hamilton/htdocs/.well-known/acme-challenge"
CONTACT_EMAIL=<you@email>

次に、すべてのドメインをdomain.txtファイルに入れます。各行の最初のドメインはCommonName、別の名前はになりますAlternativeNames。たとえば、次のようになります。

head -n1 domains.txt
hamilton.rinet.ru jenkins.hamilton.rinet.ru munin.hamilton.rinet.ru

次に、cronと入力し、次dehydrated -cのスクリプトを使用して新しく生成された証明書をインストールする必要があります。

#!/bin/sh

CERTS_DIR=/usr/local/etc/dehydrated/certs
NGINX_SSL=/usr/local/etc/nginx/ssl
DOMAINS=$(awk '{ print $1 }' /usr/local/etc/dehydrated/domains.txt)

for d in $DOMAINS; do
  short_d=${d%%.rinet.ru}
  short_d=${short_d%%.ru}
  # short_d=${short_d##www.}
  cp -v ${CERTS_DIR}/$d/fullchain.pem ${NGINX_SSL}/${short_d}.crt
  cp -v ${CERTS_DIR}/$d/privkey.pem ${NGINX_SSL}/${short_d}.key
done

# Also update certs for Dovecot
cp -v ${CERTS_DIR}/hamilton.rinet.ru/fullchain.pem /usr/local/etc/dovecot/certs/certs/server.crt
cp -v ${CERTS_DIR}/hamilton.rinet.ru/privkey.pem /usr/local/etc/dovecot/certs/private/server.key

答え2

まず、いくつか確認してみましょう。LetsEncryptクライアント。特にNginxについてリストされています。最初はLE署名証明書を使用したいので、車輪を再発明する前にここから始めましょう。

代わりにOpenSSLを使用して自己署名証明書を生成したい場合は、ドメイン名のリストを繰り返して、openssl各ドメインに対して次のようなコマンドを実行できます。

openssl req -x509 -newkey rsa:2048 -keyout examplekey.pem -out examplecert.pem -nodes -days 365 -set_serial NNNNN -subj "/C=US/L=Any City/OU=FooBar Inc/CN=*.example.com"

もちろん、変更したい各フィールドについてexamplekey.pem、、、examplecert.pemおよび*.example.com。シーケンス番号に置き換えられ、NNNNNループが繰り返されるたびに増加します。

必要なドメイン名を繰り返し、さまざまなNginx構成ファイルを更新するスクリプトを簡単に作成できるはずです。

答え3

追加しますアクミツールここでクライアントを暗号化するときにパスを提供すると、状況は本当に簡単になります。 acmetool want www.site1.org acmetool want www.site2.netacme要求が正しい場所を指すようにするには、nginxでlocation {}ブロックを使用する必要があります。必要に応じてcronを介してアップデートを処理できます。

答え4

使用するとcertbot --nginx -d your.domain.name問題が解決し、certbotはnginx設定を自動的に更新する必要があります。

仮想ホストの設定が完了したら、使用する各ドメインに対してsslコマンドを実行すると、certbot --nginx -d your.domain.nameいくつかの質問があり、正しい設定ファイルが生成されます。または、certbot --nginxホスト名がすでにnginxにある場合は、直接実行できます。 nginx設定ファイルが自動的に含まれ、古い設定ファイルは.oldとして保存されます。

このチュートリアルを確認することもできます。https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04 certbot --renewを使ってcrontabを追加することを忘れないでください。

関連情報