LAN内で構築したWebサーバーでSSLを有効にしChromeでも警告を出さない
ブラウザでSSL以外のページへアクセスするとアドレス欄にデカデカと「保護されていない通信」などと表示されるようになったこともあり、すっかりWeb構築もSSLが前提ですよね。
レンタルサーバーでもLet's EncryptなどのフリーのSSL証明書が使えるようになり、ワンクリックでSSL化できてしまうのだから便利な時代です。
…がしかし。
ローカルネットワークでテスト用、あるいは社内用のWebサーバーを構築しているとワンクリックでSSL化…とはいきません。
そんなわけで今回はWindows環境で自己証明書(いわゆるオレオレ証明書)を発行する手順と、Chromeで開いたときにSSL警告が出ないようにする手順について解説したいと思います。
WindowsでOpenSSLを使いSSL証明書を作る
なにはともあれOpenSSLの公式ページ…と行きたいところですが、OpenSSLの公式ページではソースファイルしか配布されておらず、Windows環境で使うためにはコンパイルが必要となって面倒くさいので、コンパイル済のバイナリが配布されているページからインストーラーをダウンロードします。
https://slproweb.com/products/Win32OpenSSL.html64ビット版Windowsをお使いなら、一番上の「Win64 OpenSSL v1.1.1g Light」あたりをダウンロードすればOKです。
OpenSSLのインストール画面
わざわざ画面貼るほどではなかった気もしますが、せっかくSS撮ったので貼っておきます。
- ライセンスの同意書画面
I accept the agreement(同意)を選んで[Next]をクリック。
- インストール場所の確認
特にこだわりがなければそのまま[Next]。後でコマンドプロンプトから起動するのでわかりやすいディレクトリ名にしても良い。
- スタートメニューに作るフォルダの選択画面
え、なんでスタートメニューに?!と思いましたが、「Open SSL Command Prompt」というopensslコマンドにパスが通った状態で使えるコンソールを起動できたりするのでけっこう便利。
- DLLをインストールするディレクトリの選択画面
特にこだわりがなければそのまま(WindowsのSystemディレクトリ)で良いかと。
- インストールオプションの確認画面。
これで良ければ[Install]をクリック。
無駄に丁寧に説明してしまいましたが、「OpenSSLをダウンロードして実行して次へ次へで完了」の一言で十分な気がします。
コマンドプロンプトでopensslを使ってSSL証明書を発行する
nginxはc:\nginxにインストールされていて、Webサーバーのホスト名はexample.comとして話を進めます。
パターン1 (警告が出ようがSSL通信できれば良いケース)
■実行するコマンド
set PATH=%PATH%;"C:\Program Files\OpenSSL-Win64\bin" cd c:\nginx mkdir ssl cd ssl openssl genrsa -out server.key openssl req -new -key server.key -out server.csr openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365
これで終わりです。server.csrを作る際にCountry Nameやら何やら聞かれますが、テスト用なら無視してENTERキー連打でOK(雑)
ちなみにOpenSSLのインストールの項でも書きましたが、スタートメニューに「Win64 OpenSSL Command Prompt」というのが登録されるため、そこから起動した場合は最初の「set PATH=%PATH%;"C:\Program Files\OpenSSL-Win64\bin"」といったパスを通す作業も必要ありません。べんり!
パターン2 (Chromeで警告が出ないようSANを設定する例)
Chromeで開いたときに「NET::ERR_CERT_AUTHORITY_INVALID」が出ないようにするにはSAN(=subjectAltName)の設定が必要です。最近知ったばかりなのですが、このSANってマルチドメインの設定する際に使う項目らしく、Chromeのバージョン58以降だったかな? そのあたりからSANが設定されていないとエラーが表示されるらしい。
とりあえず途中まではやること一緒なので、共通部分をもう一度書いておきます。
set PATH=%PATH%;"C:\Program Files\OpenSSL-Win64\bin" cd c:\nginx mkdir ssl cd ssl openssl genrsa -out server.key
ここまで実行したら(実行前でもいいけど)、SANの設定用にテキストファイルを用意します。
下記のように1行だけ書いたテキストファイルをsan.txtとでも命名して同じディレクトリに保存します。
(example.comとIPアドレスは適宜書き換えてください。)
subjectAltName=DNS:example.com,IP:192.168.0.1
あとは引き続き、下記のコマンドを実行するだけ。
openssl req -new -key server.key -out server.csr -subj "/CN=example.com" openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365 -extfile san.txt
赤字で書いた部分が今回の変更点です。
これでSANが設定されたSSL証明書が発行できたため、server.crtとserver.keyをWebサーバーに設定し、クライアントのChromeにはserver.crtを入れて信頼させることで、LAN内でオレオレ証明書(自己証明)が使えるようになります。
nginxのSSL設定
nginx.confの中にSSL設定もコメントアウトで書いてあるため説明不要かも知れませんが、一応サンプルを掲載しておきます。
server {
listen 443 ssl;
ssl_certificate c:/nginx/ssl/server.crt;
ssl_certificate_key c:/nginx/ssl/server.key;
server_name example.com;
}
ssl_certificateとssl_certificate_keyに先程作ったサーバー証明書(.crt)と秘密鍵(.key)を指定しています。
Chromeにサーバー証明書をインポートする
これだけでも(警告は出るものの)SSL通信自体は出来るのですが、毎回警告画面を見て「それでもぼくは開くよ!」と言ってクリックするのも面倒ですし、社内用のサーバーなどの場合はそもそも警告画面自体が困るかも知れません。
そんなわけで、Chromeに先程作ったサーバー証明書をインポートして、信頼させましょう。
- Chromeの設定画面を開き、「証明書」で検索し、「証明書の管理」をクリック。
- 証明書ダイアログで「信頼されたルート証明機関」を選び、左下の「インポート」ボタンをクリック。
- インポートウィザードの開始画面が表示されるため「次へ」をクリック。
- インポートする証明書ファイルを要求されるため、「参照」ボタンから先程作ったserver.crtを選び、「次へ」をクリック。
- 配置する場所を聞かれるため、「信頼されたルート証明機関」を選び「次へ」をクリック。
- 完了画面が表示されるので「完了」をクリック。
- 最後にセキュリティ警告が表示されるため、内容を確認の上、「はい」をクリック。
※特に黒塗りした部分には設定したホスト名が入っているため要確認。
これでChromeでLAN内のWebサーバーへSSLでアクセスしても警告が表示されることはないでしょう。
(場合によっては一度Chromeを再起動しないと反映されないかも知れません)
おつかれさまでした。