質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

Q&A

解決済

1回答

3511閲覧

Let's encryptでSSL証明書を取得した際のアクセス権限

uer03108

総合スコア194

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

0グッド

0クリップ

投稿2021/11/09 06:07

編集2021/11/09 06:12

Let's encryptでSSL証明書を取得して、docker-composenginxでhppts通信を行いました。
参照したサイトは、下記などになります。

Docker+nginxでHTTPSサーバを簡単に構築

Let's Encrypt で Nginx にSSLを設定する

一応、上手く接続できたのですが、フォルダのアクセス権限でハマりました。
環境はamazon linux 2になりますが、Let's encryptで取得したSSL証明書は、/etc/letsencrypt/live/www.example.com/に保存されます。
ここで、liveフォルダのアクセス権限は、

sh

1drwx------ 3 root root 47 Nov 9 02:12 live

となっていまして、ec2-userユーザでは、アクセスできないようでした。
なので、root権限で適当なフォルダにpemファイルをコピーして、上手く接続できたのですが、何か他にも良い方法はあるでしょうか。

今回のpemファイルのコピー先は、/home/ec2-user/sslになります。

sh

1drwxrwxr-x 2 ec2-user ec2-user 93 Nov 9 05:32 ssl

sh

1[ec2-user@ip-***-***-***-*** ssl]$ ls -la 2total 24 3drwxrwxr-x 2 ec2-user ec2-user 93 Nov 9 05:32 . 4drwx------ 7 ec2-user ec2-user 163 Nov 9 05:31 .. 5-rw-r--r-- 1 root root 1854 Nov 9 03:14 cert.pem 6-rw-r--r-- 1 root root 3749 Nov 9 03:14 chain.pem 7-rw-r--r-- 1 root root 5603 Nov 9 05:32 fullchain.pem 8-rw------- 1 root root 1708 Nov 9 03:14 privkey.pem 9-rw-r--r-- 1 ec2-user ec2-user 692 Nov 9 03:14 README

因みに、コピー元/etc/letsencrypt/live/www.example.com/のファイルにアクセスして、docker-compose up -dを行ったところ、下記エラーが表示されました。
恐らく、アクセス権限のエラーだと思います。

[emerg] 1#1: cannot load certificate "/etc/letsencrypt/live/www.example.com/fullchain.pem": BIO_new_file() failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/letsencrypt/live/www.example.com/fullchain.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file)

一応、READMEにはDON'T MOVEと書かれていました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

surface_0

2021/11/09 10:24

> 因みに、コピー元/etc/letsencrypt/live/www.example.com/のファイルにアクセスして、docker-compose up -dを行ったところ、下記エラーが表示されました。 ここの言っていることが良く分からないのですが、コンテナにこのパスをバインドマウントしたということでしょうか?
uer03108

2021/11/09 11:48

仰る通りです。 docker-compose.ymlファイルで、nginxのvolumesに下記を設定しました。 volumes: ... - /etc/letsencrypt/live/www.example.com:/etc/nginx/certs #error # - /home/ec2-user/ssl:/etc/nginx/certs #ok ... --------------------------------------------------------------- default.conf server { server_name www.example.com; listen 443 ssl; ssl_certificate /etc/nginx/certs/fullchain.pem; ssl_certificate_key /etc/nginx/certs/privkey.pem; ... }
guest

回答1

0

ベストアンサー

まず、/etc/letsencrypt/live/www.example.com/の中にあるpemファイルなどは相対パスのシンボリックリンクになっていると思います。
ですので、実体はそこにはありません。

root権限で適当なフォルダにpemファイルをコピーして、上手く接続できたのですが

シンボリックリンクをコピーした場合はリンク先のファイルがコピーされたために、うまくいったものと思いますが、それに対して、

コピー元/etc/letsencrypt/live/www.example.com/のファイルにアクセスして、docker-compose up -dを行ったところ、下記エラーが表示されました。

こちらはシンボリックリンクだけがDockerコンテナにマウントされた状態になるので、コンテナ内にリンク先が存在せずエラーとなります。
やるなら/etc/letsencryptからマウントする必要があります。

本題に戻りまして、

何か他にも良い方法はあるでしょうか。

Dockerコンテナでnginxを運用するならば、Let's Encrypt(certbot)もDockerで完結させるのがベストだと思います。
nginxコンテナとボリュームを共有したcertbotイメージのコンテナでSSL証明書を発行するような形です。
この際、マウントするボリュームはバインドではなく、破棄も簡単な名前付きボリュームで良いと思います。
このやり方ならば、ホスト環境をクリーンな状態にできます。

他の楽な方法としては、リバースプロキシをhttps-portalで構築するというやり方があります。
Let's Encrypt でhttps化してくれるコンテナ (https-portal) - Qiita

また、複数のWebサーバーコンテナを運用する場合は、より高度な機能を持つnginx-proxy + acme-companionなども挙げられます。

投稿2021/11/10 03:25

編集2021/11/10 03:26
surface_0

総合スコア497

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

uer03108

2021/11/10 04:45 編集

詳細にご回答いただきまして、有難うございました。 /etc/letsencryptからマウントしたところ、上手くいきました! その他の方法もご提示いただきまして、有難うございます。 仰る通り、全てdockerで完結させた方が、作業もスムーズで良いですね。 試してみます。 助かりました(T_T)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問