WindowsのApacheサーバーでSSL
Windows10の環境に、ApacheサーバーをインストールしてSSL化します。このごろはXAMPPのインストーラーを使うことにより、Apache+MariaDb+PHP+Perlの総合環境を簡単にインストールすることもできますが、ここでは単独でインストール・起動する方法を紹介します。また同梱のopensslを使って仮の証明書を発行するためのスクリプトを紹介しながら、実際に証明書を適用しています。
また、Debian(Linux)のApacheサーバーの設定はWindowsの場合と少し変わってきますので、その場合はリンク先の記事を参考にしていただければと思います。
VCランタイムのインストール
VCのランタイムがインストールされていない場合は先にインストールしておきます。
これはMicrosoft「サポートされている最新の Visual C++ 再頒布可能パッケージのダウンロード」よりダウンロードできます。
アーキテクチャ別(X86:32bit/X64:64bit/ARM64)にファイルがありますので環境に合わせてダウンロードしてインストールして下さい。筆者の場合はX64用のバイナリ(vc_redist.x64.exe)を選択しました。
Apacheのダウンロードと初期設定
ApacheサーバーのWindows用のバイナリはApache Loungeで配布されています。
執筆時点だとVC(Visual C++)VS16とVC15というバージョンがありましたがデフォルトで表示されるVS16をダウンロードすれば問題ないと思います。
こちらもWindowsのアーキテクチャ(64bit/32bit)別にファイルが別れていますので、環境にあった方をダウンロードします。今回ダウンロードしたのは「httpd-2.4.52-win64-VS16.zip」でした。(バージョン2.4.52)
ダウンロードしたファイルを展開すると「Apache24」というフォルダがありますので、これをcドライブのルートに持っていけば設定は完了です。
cドライブのルート以外に持っていきたい場合は、Apache24¥conf¥httpd.confの「Define SRVROOT "c:/Apache24"」となっている箇所を移動させたフォルダに書き換えます。
Apache24¥conf¥httpd.conf
... Define SRVROOT "c:/Apache24" ...
Apache24¥bin¥httpd.exeをダブルクリックで実行してプロンプトが消えなければ、稼働した状態です。
プロンプトがすぐ消えてしまう原因のひとつに二重起動がありますが、そのほか設定ファイルがおかしいこともあります。ルートフォルダにあるlogsフォルダ内のerror.logを確認すると原因究明に役立ちます。
この時ブラウザからhttp://localhostというアドレスでページを表示させると、次のように「It Works!」と表示されるはずです。
これはApache24¥htdocs¥index.htmlファイルを表示しています。これがあるディレクトリ内に.htmlファイルを置くことで、そのファイル名でブラウザからアクセスすることができるようになります。(https://localhost/example.html等)
本来ならプロンプトには何も表示されないのですが、デフォルトの状態で起動させると、次のようなメッセージが表示されています。サーバーに設定されているドメインから、待機しているIPアドレスを取得できない為に表示されるものです。
サーバーのドメイン設定はServarNameというエントリーになるので、次のようにすることで、表示されなくなります。
Apache24¥conf¥httpd.conf
... ServerName localhost:80 ...
また、IPv4のみで待機させたい場合は、Listenのエントリーに0.0.0.0を付け加えて次のようにします。Listenのエントリーはポート毎に複数設定できます。
Apache24¥conf¥httpd.conf
... # Listen 80 # IPv6を含んだ待機 # IPv4だけ Listen 0.0.0.0:80 Listen 0.0.0.0:443 ...
上記のようにIPv4だけにしたのに、先のCould not reliably determine the server's fully qualified domain nameの後にfe80:...(IPv6アドレス)から始まるメッセージが出ているのはなぜ? と思って調べたらところWindowsの機能紹介・トラブル対応のIT備忘録のページに答えがありました。ありがとうございます。
localhostという名前を探す時デフォルトだとIPv6のアドレスが優先的に返ってくるのが原因のようです。もともとlocalhostで待機するサーバーの場合なら気にする問題ないと思いますが、修正するなら次のようにして優先順をかえます。(エラーを消すだけなら先に紹介したようにServerNameを設定するだけで解決します)
# 優先順位の確認 PS > netsh interface ipv6 show prefixpolicies # IPv4の優先度を最優先(100)に # 管理者権限での実行が必要です。 PS > netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 100 4 # IPv4の優先度をもとに戻す(35) # 戻す場合の優先度は先に確認してメモしておきます。 PS > netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 35 4
SSLの設定
今度はSSLに対応させます。httpd.confファイルの設定と、Apache24¥binフォルダに同梱しているopenssl.exeを使って仮の証明書を発行して利用します。
Apache24¥conf¥httpd.conf
... # 443番ポート追加 Listen 0.0.0.0:443 # SSL有効化 コメントアウトを解除 LoadModule ssl_module modules/mod_ssl.so #<Virtulal Host> definitionというコメントがあるあたりに追加 <VirtualHost *:443> ServerName localhost SSLEngine on SSLCertificateFile "c:/Apache24/certs/server.crt" SSLCertificateKeyFile "c:/Apache24/certs/server.key" </VirtualHost> ...
SSLCertificateFileに証明書へのパス、SSLCertificateKeyFileサーバーの秘密鍵へのパスをセットします。これらのファイルは自作する必要があります。
Debian等でopensslをインストールすると、snakeoilという名前を含んだ仮の証明書が含まれていて、ApacheのデフォルトのSSL設定はそれを参照していますが、Windowsではsnakeoil証明書が存在しません。なので仮の証明書を作成するbatファイルを作成してみました。
一連のコマンドはCAを作って証明書を発行するものですが、詳細はリンク先の記事にも書いていますのでよろしかったら目を通してみて下さい。
日本語のコメントがあるので保存する際は文字コードSJISで保存してください。「c:¥Apache24」の箇所を環境に合わせて設定して下さい。またlocalhost以外の運用の場合は、続くドメイン・IPアドレス設定を修正してください。
【注意】HTML上で¥記号を出すために「¥」記号は「¥」(U+00A5)を利用しています。そのため、このページのコードをそのままコピーすると、¥がフォルダの区切りと認識されずにエラーになります。コピーされる場合は「U+00A5」(¥)を「U+005C」(\)に変換してください。よくわからない場合は、「¥」の部分だけ一度消して手打ちしていただければ解決すると思います。(¥が登場するのは2,5,21行目です)
この問題の詳細はWikipedia:「Unicodeが持つ問題」で解説されています。
コピーしづらい場合はGitHubにもファイルを設けましたので、ご利用ください。
make-snakeoil-cert.bat
REM openssl.exeの場所
SET OPENSSL=c:¥Apache24¥bin¥openssl.exe
REM 証明書用データの出力場所
SET ROOTDIR=c:¥Apache24¥certs
REM サーバーのドメインまたはIPアドレス
SET IPADDRESS=localhost
REM ドメインの場合はDNS IPアドレスの場合はIP
SET TYPE=DNS
REM CA サーバー用の秘密鍵のパスワード
SET PASSWORD_CA=debug
SET PASSWORD_SV=%PASSWORD_CA%
REM 証明書用データフォルダ作成
if not exist %ROOTDIR% mkdir %ROOTDIR%
REM 作業フォルダに移動
cd /d %ROOTDIR%
REM CAのシリアルクリア
if exist ca.srl del ca.srl
REM CA用の秘密鍵作成
%OPENSSL% genrsa -aes256 -out ca.key -passout pass:%PASSWORD_CA% 2048
REM CA用の署名要求を作成
%OPENSSL% req -subj "/C=JP/ST=Tokyo/O=MyCom/CN=MyCA" -new -key ca.key -out ca.csr -passin pass:%PASSWORD_CA%
REM 自己署名
%OPENSSL% x509 -req -in ca.csr -signkey ca.key -days 730 -out ca.crt -passin pass:%PASSWORD_CA%
REM 証明書V3オプション作成
echo basicConstraints=CA:FALSE>option.v3
echo subjectKeyIdentifier=hash>>option.v3
echo authorityKeyIdentifier=keyid,issuer>>option.v3
echo keyUsage= nonRepudiation, digitalSignature, keyEncipherment>>option.v3
echo subjectAltName=%TYPE%:%IPADDRESS%>>option.v3
REM サーバーの秘密鍵作成
%OPENSSL% genrsa -aes256 -out server.key -passout pass:%PASSWORD_SV% 2048
REM サーバー用の署名要求
%OPENSSL% req -subj "/C=JP/ST=Tokyo/O=MyCom/CN=%IPADDRESS%" -new -key server.key -out server.csr -passin pass:%PASSWORD_SV%
REM サーバー用の署名要求を署名
%OPENSSL% x509 -req -in server.csr -CA ca.crt -CAkey ca.key -days 730 -out server.crt -passin pass:%PASSWORD_CA% -extfile option.v3 -CAcreateserial
REM サーバーの秘密鍵はパスワード解除
%OPENSSL% rsa -in server.key -out server.key -passin pass:%PASSWORD_SV%
REM ワークファイルの削除、仮の証明書を作るCAなのでCAの秘密鍵も削除しています
DEL ca.key ca.csr ca.srl option.v3 server.csr
出力されるserver.crtが証明書、server.keyが秘密鍵になります。仮の証明書なのでそのままの状態だと「この接続ではプライバシーが保護されません」などの警告がブラウザで表示されます。
警告を消したい場合は、certsフォルダにあるca.crtを右クリックして「証明書のインストール」→「現在のユーザー」→「証明書をすべて次のストアに配置する」→「参照」→「信頼されたルート証明機関」と選択して進めます。
インストールした証明書を削除したい場合は、コントロールパネルの検索ウィンドウに「証明書」と入力して、「ユーザー証明書の管理」→「信頼されたルート証明機関」→「MyCA右クリックから削除」です。
もし証明書インストール時にローカルコンピューターを選択した場合は、削除は「コンピュータ証明書の管理」から行います。手順はユーザーの場合と同じです。
IP設定をしたらIP、ドメインの設定をしたらドメインでアクセスするようにしてください。証明書発行時にIP指定で、127.0.0.1とした時にブラウザにlocalhostと入力したり、その逆をしたりすると証明書は有効になりません。
このようなオリジナルの証明書の管理が手間だという場合は、DDNSなどを使ってサーバーのIPを取得してLet's Encryptで無料の証明書を発行してもらう方法もあります。
今回設定したWindowsのApacheサーバーにPHPを連携する方法も別記事で書いています。よろしかったらご覧になってください。