👥

Laravel Sail環境下でSSLを通す方法

2022/07/28に公開

今回はLaravel Sail(=Docker-compose)環境下でSSL認証を通す方法を書いていきます。
ドメイン設定からConoHaVPSでのSSL取得、https通信ができるというところまで行きます。

備忘録かつ誰かの手助けになれば...

環境

  • ConoHaVPS
    ドメイン取得済み
  • Laravel8
  • Laravel Sailで実行
  • Nginx(ホスト側)

VPSはDockerがインストールされているプリセットで、Nginxをホスト側で事前にインストールしています。
また、Laravel Sailは8000番で立ち上げています。nginxが80番ポートを使うのでLaravelは別のポートを使ってください。

ドメイン設定をしよう!

まずはドメインを取得しましょう!
ドメインを取らないことには進めません。
(ドメイン名を何にするかは小一時間悩みました。)

ドメインを取得したら、ConoHaVPSの管理画面でDNSの設定をします。

右上の「+ドメイン」というボタンを押すと画像のような画面が出るので、取得したドメインを入力します。

追加したらこのように表示されるので、これでドメインの設定は完了です。
簡単ですね。

SSLを取得しよう!

次は本題のSSLを取得します。

ConoHaさんは優しいのでVPS割引きっぷを買うとアルファSSLというのが無料でいっぱい使えます!(枠制限結構多め?)

ここからはVPSでの操作に入ります。
nginxの設定フォルダにSSLの認証上を入れるためのディレクトリを作成します

mkdir /etc/nginx/certs
cd /etc/nginx/certs

次のコマンドでSSL発行に使用する秘密鍵及び署名要求を作成します

openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr

二行目を実行すると下記が表示されます

root@0-0-0-0:/etc/nginx/certs# openssl req -new -key server.key -out server.csr
~~~~
~~~~
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Your-State
Locality Name (eg, city) []:Your-city
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:your.domain
Email Address []:your@email

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

これは、

  • 市区町村
  • あれば、組織名
  • あれば、組織内の部署
  • ドメイン名(ここ重要、サブドメインの場合はサブもしっかり入力すること)
  • メールアドレス
  • あれば、チャレンジパス
  • あれば、会社名

を入力してねということです。

これで、VPSでのSSL発行準備は完了です。

作成したserver.csrの中身をコピーしてSSLの発行をしましょう!!

SSLの発行にはConoHaVPSのコンパネを使います。

今回はwww.も認証できるデュアルアクセスは使用しないので外しています。

ここで先ほどコピーしたcsrの中身をペーストしましょう!

解析するとかんな感じで先ほど入力したものが表示されます。
間違っていなければ次へ進みましょう!
(間違っていたらCSRの発行のみやり直してください)

必要情報を入力して進んでいって6番まで進んだら、次は認証情報をDNSに登録します。
表示された認証IDをコピーします。

先ほど自分のドメインを登録したDNSのタブで、TXTレコードを追加します。
鉛筆マークをクリックするとレコードが1行追加できるので、

タイプ 名称 TTL
TXT @ 3600 コピーした認証ID

で登録しましょう。

登録が完了したら先ほどのSSLの画面に戻ります。
ここで認証を依頼します......が!
DNSの反映は遅いので焦らずに、コーヒーでも飲んで休憩します。

2-3分経って、認証に成功したら完了です。

SSLをVPSに設定

SSLのTOPに戻ったら、発行したものが表示されます。
発行したものを開いて、右上の証明書をクリックすると認証に必要なファイルをダウンロードできます。
今回は証明書(PEM)をダウンロードします。

ダウンロードが完了したら、中身をコピーしてVPSに戻ります。
/etc/nginx/certs/内にserver.crtというファイルを作ります。
server.crtの中身に先ほどコピーした証明書(PEM)をペーストします。

これでVPSにも設定が完了しました。

残す工程はあと1つです!がんばりましょう(がんばります)。

Nginxの設定

/etc/nginx/conf.d/default.confに下記の設定を追記します
(your.domainとなっているところは自分のドメインに書き換えてください。)

/etc/nginx/conf.d/default.conf
server {
    listen 80;
    server_name your.domain;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name your.domain;
    ssl_certificate     /etc/nginx/certs/server.crt;
    ssl_certificate_key /etc/nginx/certs/server.key;

    location / {
        proxy_pass	http://localhost:8000;
    }
}

こちらの設定を解説します。
まず上段のserverの設定は80番ポート(つまり、http)通信をしてきたものをhttpsにurlを書き換えてリダイレクトしています。
そして下段のserverは443番ポート(つまり、https)通信をしてきたものに対して、先ほどがんばって作成した認証情報と認証キーをくっつけています。

今回大事なところはここです。

location / {
    proxy_pass	http://localhost:8000;
}

ここは何をしているかというと、パスが「/」のとき、波かっこ内の設定に従うというものです。つまり、「https://your.domain/」にアクセスされたら、「http://localhost:8000」をプロキシするということです。(*プロキシとは代理で動かすという認識で)

そして、http://localhost:8000とは、そう、今回表示したいLaravel君のことです。

  1. https://your.domainにアクセスする(される)
  2. NginxがSSLの認証を確認する
  3. NginxがDockerで動いているLaravelにパイプをつなげる
  4. Laravelが動く

という流れです。

確認

ここまでくれば、あなたが開発したLaravelのアプリケーションにhttps通信でアクセスできます。httpsでドメインにアクセスしてみましょう!!
表示されますね!!!
表示されなかったら設定を見直すか大人の人に聞きましょう。

おわりに

かなりの乱文でしたが、読みにくい・間違ってるぞ・こっちのほうがいいよ・ちょうどNginx+DockerでSSLしたかったんだよね助かった等のご意見ありましたらバンバンお願いします。
いいものを作りたいです。

また、今回はサブドメインについては長くなりそうだったので省きましたが、またいつか書きます。そんなに設定は大変じゃないですし、やることとか流れは一緒なので、原理がわかれば簡単にできます。

あ、ConoHaの回し者じゃないです。

Discussion