XAMPP for WindowsでSSLを有効にする

  • 5
    Like
  • 7
    Comment

(2017-09-30 追記) 最新のXAMPPとChromeでもできることを確認しました。

目標

  1. XAMPPで「https://localhost」を表示可能にします。
  2. 自作の証明書を認証して、警告を表示させないようにします。
    未認証: 002.png
    認証済: 007.png

環境

  • Windows 10 64bit
  • XAMPP 7.1.9
  • Chrome 61.0.3163.100 (Official Build) (64-bit)

XAMPPの設定

PHPでOpenSSLを有効にする

C:\xampp\php\php.iniの下記の行のコメントアウトを外します。

php.ini
- ;extension=php_openssl.dll
+ extension=php_openssl.dll

私の環境ではphp.ini内にextension=php_openssl.dllが2箇所に記述されており、一方はコメントアウトされているものの、もう一方は有効だったので修正する必要はありませんでした。

ApacheのSSL関連の設定を追加する

C:\xampp\apache\conf\extra\httpd-ssl.confの末尾に下記を追加します。

httpd-ssl.conf
<VirtualHost *:443>
    DocumentRoot "C:/xampp/htdocs"
    ServerName localhost
    SSLEngine on
    SSLCertificateFile "conf/ssl.crt/my-server.crt"
    SSLCertificateKeyFile "conf/ssl.key/my-server.key"
</VirtualHost>

my-server.crtmy-server.keyは後で作成します。
DocumentRoot,ServerNameは適宜読み替えてください。
なお、ServerNameをlocalhost以外、例えばwww.example.comなどにしたい場合は、別途バーチャルホストの設定とhostsファイルの修正が必要です。

:link: windows7のXAMPPでバーチャルホストの設定をする – YATのBLOG hatena bookmark

動作確認

Apacheを再起動して、https://localhostへアクセスしてください。
下記のような警告が出るものの、強引に表示させることはできます。
次章では、この警告を表示させないようにします。

003.png

証明書

(修正: 2017-05-02)
Chrome58以降は、以前の方法では認証できません。
非推奨とされてきた「Common Name (CN)」への対応がついに廃止されたので、「Subject Alternative Name (SAN)」という拡張領域が必要です。

:link: Chromeがコモンネームの設定を非推奨化、そのエラー対策としての自己署名証明書のCSRの作り方 hatena bookmark
:link: Support for commonName matching in Certificates - Chrome Platform Status hatena bookmark

以降の手順は下記の記事に従っています。
:link: Fixing Chrome 58 – NET::ERR_CERT_AUTHORITY_INVALID error – Dev Notes hatena bookmark

古い証明書を削除する

認証されなくなった古い証明書がある場合は削除します。

  1. Chromeの設定を開き、「証明書の管理」を検索してクリックします。
  2. 信頼されたルート証明機関からlocalhostを削除します。
    003.png

OpenSSL設定ファイルを編集する

  1. C:\xampp\apache\conf\openssl.cnfをコピーして、ファイル名をopenssl-san.cnfに変更します。
  2. 以下を末尾に追記します。
openssl-san.cnf
[ SAN ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = localhost
DNS.2 = <他に認証したいドメインがあれば>
DNS.3 = <他に認証したいドメインがあれば>

SSLサーバ証明書を作成する

Windowsのコマンドプロンプトでopensslコマンドを実行するには、下記のように追加でインストール作業が必要です。
:link: Tech TIPS:WindowsにOpenSSLをインストールして証明書を取り扱う(基本編) - @IT

Git Bashならばそのままopensslコマンドを使えるので、お使いのPCにすでにGitをインストールしているのならGitBashを使うことをお勧めします。

GitBash
# C:\xampp\apache\conf へ移動
$ cd /c/xampp/apache/conf

# my-server.crt, my-server.key の2つのファイルを生成
$ openssl req \
    -newkey     rsa:4096 \
    -keyout     my-server.key \
    -x509 \
    -nodes \
    -out        my-server.crt \
    -subj       "//CN=localhost" \
    -reqexts    SAN \
    -extensions SAN \
    -config     openssl-san.cnf \
    -days       3650

-subjオプションでの書き方はGitBashのみで有効です。
GitBash以外の端末を使っている場合は-subj "/CN=localhost" \と、スラッシュをひとつ減らしてください。

:link: string - Running Openssl from a bash script on windows - Subject does not start with '/' - Stack Overflow hatena bookmark

opensslコマンドのオプションについては下記をご覧ください。
:link: (日本語)OpenSSL Manual Translation - req(1) hatena bookmark
:link: (英語)/docs/manmaster/man1/req.html hatena bookmark

証明書を設置する

上のコマンドを実行して生成したmy-server.crtmy-server.keyを、それぞれ下記の場所に移動します。

ファイル 設置場所
my-server.crt C:\xampp\apache\conf\ssl.crt
my-server.key C:\xampp\apache\conf\ssl.key

証明書を認証する

my-server.crtをダブルクリックします。

001.png

002.png

「証明書ストア」は、必ず「信頼されたルート証明機関」を選んでください。

003.png

004.png

「はい」を選んでインストールします。

005.png

動作確認

Apacheブラウザを再起動して、https://localhostへアクセスしてください。
一般的なHTTPSのサイトと同じように問題なく表示されるはずです。
ChromeだけでなくIEやEdgeでも同様です。ただしFirefoxだけは違います。

  • 未認証: 002.png
  • 認証済: 007.png

Firefoxでは

Firefoxではどんな自己署名証明書も認証されないようです。
よって、「例外」という形にするほかありません。

:link: 安全なウェブサイトでのエラーコード "SEC_ERROR_UNKNOWN_ISSUER" の問題解決 | Firefox ヘルプ hatena bookmark

例外に追加する

001.png

004.png

例外から削除する

逆に、もう例外扱いする必要がなくなった場合は、下記のように解除します。

005.png

006.png

参考記事

XAMPPの設定

証明書