(LetsEncryptで生成された)SSL証明書をnginxに追加しようとしています。 nginxはdocker-composeファイルから構築されており、ホストからコンテナーにボリュームを作成して、コンテナーが証明書と秘密キーにアクセスできるようにします。
volumes:
- /etc/nginx/certs/:/etc/nginx/certs/
Nginxコンテナが起動し、次のエラーで失敗した場合
[emerg] 1#1: BIO_new_file("/etc/nginx/certs/fullchain.pem") failed
(SSL: error:02001002:system library:fopen:No such file or
directory:fopen('/etc/nginx/certs/fullchain.pem','r')
error:2006D080:BIO routines:BIO_new_file:no such file)
私のnginx設定ファイルは次のようになります:
server {
listen 80;
server_name server_blah www.server_blah;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name server_blah;
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
}
何が欠けている/間違っているのですか?
最後にこれをクラックし、私の開発サイトと本番サイトでプロセスを正常に繰り返し、SSL証明書を機能させることができました!
投稿の長さでごめんなさい!
私のセットアップでは、ubuntu 16マシンでdocker docker-composeセットアップを使用しています。
この問題に遭遇している人は誰でも、私が実行した手順を詳しく説明します。
コードが存在するディレクトリに移動します
cd /opt/example_dir/
Letsencryptのディレクトリとそのサイトを作成します。
Sudo mkdir -p /opt/example_dir/letsencrypt/letsencrypt-site
Letsencryptディレクトリからbarebones docker-compose.ymlファイルを作成します。
Sudo nano /opt/example_dir/letsencrypt/docker-compose.yml
以下を追加してください:
version: '2'
services:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- ./letsencrypt-site:/usr/share/nginx/html
networks:
- docker-network
networks:
docker-network:
driver: bridge
* This will pull down the latest nginx version
* Expose port 80
* Mount a config file (that i'll create later)
* Maps the site directory so that we can have a simple test index.html for when
単純なnginxコンテナーを開始します。
/opt/example_dir/letsencrypt
にnginx.confファイルを作成します
Sudo nano /opt/example_dir/letsencrypt/nginx.conf
それに以下を入れてください
server {
listen 80;
listen [::]:80;
server_name example_server.com;
location ~ /.well-known/acme-challenge {
allow all;
root /usr/share/nginx/html;
}
root /usr/share/nginx/html;
index index.html;
}
* This listens for requests on port 80 for the server with name example_server.com
* Gives the Certbot agent access to ./well-known/acme-challenge
* Sets the default root and file
/opt/example_dir/letsencrypt/letsencrypt-site
内にindex.htmlファイルを作成しますSudo nano /opt/example_dir/letsencrypt/letsencrypt-site/index.html
それに以下を追加します
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>LetsEncrypt Setup</title>
</head>
<body>
<p>Test file for our http nginx server</p>
</body>
</html>
次に、nginxコンテナを起動します。
cd /opt/example_dir/letsencrypt
Sudo docker-compose up -d
Nginxコンテナが稼働中であるため、定義したURLにアクセスすると、テストのindex.htmlページが返されます。この時点で、certbotコマンドを実行して証明書を生成する準備が整いました
次のコマンドを実行して、--email
をメールに置き換えて証明書を生成します
Sudo docker run -it --rm \
-v /docker-volumes/etc/letsencrypt:/etc/letsencrypt \
-v /docker-volumes/var/lib/letsencrypt:/var/lib/letsencrypt \
-v /opt/example_dir/letsencrypt/letsencrypt-site:/data/letsencrypt \
-v "/docker-volumes/var/log/letsencrypt:/var/log/letsencrypt" \
certbot/certbot \
certonly --webroot \
--email [email protected] --agree-tos --no-eff-email \
--webroot-path=/data/letsencrypt \
-d example.com
そのコマンドが正常に実行された場合は、このWebサーバーの証明書が生成されています。これで、これらを本番サイトで使用し、sginを使用してこれらの証明書を利用するようにnginxを設定できます。
Nginxコンテナをシャットダウンします
cd /opt/example_dir/letsencrypt/
Sudo docker-compose down
ディレクトリ構造は次のようになります。コード/ Webアプリプロジェクトがあり、次に上記で作成したletsencryptフォルダーがある場所。
/opt/example_dir
/ -> project_folder
/ -> letsencrypt
Dh-paramを呼び出すフォルダーを作成する
Sudo mkdir -p /opt/example_dir/project_folder/dh-param
Dhキーを生成する
Sudo openssl dhparam -out /opt/example_dir/project_folder/dh-param/dhparam-2048.pem 2048
/opt/example_dir/project_folder
内のdocker-compose.ymlおよびnginx.confファイルを更新します
Project_folderは私のソースコードが存在する場所なので、ここでnginxのプロダクション構成ファイルを作成し、Docker-compose.ymlを更新して、nginx構成、dh-pharam交換キー、および以前に作成した証明書自体をマウントします。
docker-composeのnginxサービス
nginx:
image: nginx:1.11.3
restart: always
ports:
- "80:80"
- "443:443"
- "8000:8000"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- ./dh-param/dhparam-2048.pem:/etc/ssl/certs/dhparam-2048.pem
- /docker-volumes/etc/letsencrypt/live/exampleserver.com/fullchain.pem:/etc/letsencrypt/live/exampleserver.com/fullchain.pem
- /docker-volumes/etc/letsencrypt/live/exampleserver.com/privkey.pem:/etc/letsencrypt/live/exampleserver.com/privkey.pem
networks:
- docker-network
volumes_from:
- flask
depends_on:
- flask
- falcon
links:
- datastore
project_folder内のnginx.conf
error_log /var/log/nginx/error.log warn;
server {
listen 80;
listen [::]:80;
server_name exampleserver.com
location / {
rewrite ^ https://$Host$request_uri? permanent;
}
#for certbot challenges (renewal process)
location ~ /.well-known/acme-challenge {
allow all;
root /data/letsencrypt;
}
}
#https://exampleserver.com
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name exampleserver.com;
server_tokens off;
ssl_certificate /etc/letsencrypt/live/exampleserver.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/exampleserver.com/privkey.pem;
ssl_buffer_size 8k;
ssl_dhparam /etc/ssl/certs/dhparam-2048.pem;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
ssl_ecdh_curve secp384r1;
ssl_session_tickets off;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8;
# Define the specified charset to the “Content-Type” response header field
charset utf-8;
}
この時点で、すべてがセットアップされました! (最終的に)
Dockerコンテナーをスピンアップします。
cd /opt/example_dir/project_folder
Sudo docker-compose up -d
# Check the docker log with:
Sudo docker logs -f -t
たくさんのステップがあることはわかっていますが、これは私がやったことであり、私にとってはうまくいき、他の人の役に立つことを願っています。
私は今、まったく同じ問題を抱えています。同じエラーコード。
.pemファイルで別のことを試しました:
悲しいことに、これらの解決策はどれも私にとってうまくいきませんでした。
コンテナーターミナルに接続したときにファイルを一覧表示(ls)できても、nginxがファイルを見つけられないようです。
さらに詳しく説明するために、私はSynology DS918 + NASでDockerを実行しています。
これが解決策を見つけるのに役立つことを願っています!いろいろ試してみますが、なんとか動かせたらまた戻ってきます!