はじめに
Windowsの環境に「localhostをXMAPPを利用する事無く構築する記事」は良く発見できますが、最終的に「https」接続が出来るようにという所まで解説されている記事が無くて、少々苦労しましたので記事にしてみます。localhostを構築して「http」で接続してクラウドのアプリを動かし開発する環境はスムーズに出来ますが、その後に「SSL化」する話は「SSLの暗号キー」の作り方までで、実際に暗号化の設定方法は記事が無くて不思議でした。
最初は以下の「@Limitex」さんの記事の抜粋になりますので合わせて読んで頂けますと「SSL化したWindwsのlocalhost」環境が完成します。「@Limitex」さんの記事と同様にフォルダは「C:\Program Files (dev)」
にしております。
設定ファイルの書き換えは最後に記述いたします。最初は各機能(php、Apache、MySQL、OpenSSL、phpMyAdmin)のダウンロードと配置、インストールを行います。
XAMPPを使わないメリット?
これは色々と有るかと思いますが、個人的には以下のような物があります。
1.PHPやApacheのバージョンを環境変数や設置場所の変更で必要に応じて変更出来ます。
2.ローカルの環境を隠蔽しやすい。(社内でローカルアプリとして使用する場合)
※個人的には2番目が特に重要でした。
PHP8
1. Download PHP(ダウンロードして配置します)
https://www.php.net/downloads.php
配置:C:\Program Files (dev)\php-8.4.4
Apache
2. Download Apache(ダウンロードして配置します)
https://www.apachelounge.com/download/
配置:C:\Program Files (dev)\Apache24
MySQL
3. Download MySQL(ダウンロードしてインストールします)
phpMyAdmin
4. Download phpMyAdmin(ダウンロードして配置します)
配置:C:\Program Files (dev)\Apache24\htdocs\phpMyAdmin
https://www.phpmyadmin.net/downloads/
OpenSSL
5. Download OpenSSL(ダウンロードしてインストールします)
以下のページにアクセスして、「Win64 OpenSSL v3.4.1 Light」
をダウンロードしてインストールします。途中で色々と聞いてきますので、最後に整理いたします。
https://slproweb.com/products/Win32OpenSSL.html
設定ファイル(php Apache MySQL OpenSSL)の変更
6.1 PHP8
C:\Program Files (dev)\php-8.4.4
フォルダ内のphp.ini-production
の複製php.ini
を用意してエディタで編集します。
extension_dir = "C:\Program Files (dev)\php-8.4.4\ext"
extension=fileinfo
date.timezone = "Asia/Tokyo"
extension=mbstring
mbstring.language = Japanese
extension=php_mysqli.dll
extension=php_pdo_mysql.dll
6.2 Apache
C:\Program Files (dev)\Apache24\conf\httpd.conf
を編集します。
Define SRVROOT "c:\Program Files (dev)\Apache24"
ServerName localhost:80
6.3 MySQL
C:\ProgramData\MySQL\my.ini
sql_mode の内容が 5.7 から一部変更があり、PHPの記述でエラーが発生する事があります。
sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
6.4 OpenSSL
OpenSSLは動作確認だけ行います。
C:\ProgramData>openssl -version
OpenSSL 3.4.1 11 Feb 2025 (Library: OpenSSL 3.4.1 11 Feb 2025)
環境設定ファイルの設定(システム環境変数)
環境変数のウィンドウを以下のコマンドを管理者権限で実行します。
rundll32 sysdm.cpl,EditEnvironmentVariables
path:
に以下を設定します。OpenSSLは既に設定されているはずです。
C:\Program Files (dev)\php-8.4.4
C:\Program Files\MySQL\MySQL Server 9.2\bin
C:\Program Files\OpenSSL-Win64\bin
ApacheとPHP、OpenSSLの連携
C:\Program Files (dev)\Apache24\conf\httpd.conf
を開いて、以下を最後に追記します。
PHPIniDir "C:\Program Files (dev)\php-8.4.4"
LoadModule php_module "C:\Program Files (dev)\php-8.4.4\php8apache2_4.dll"
AddHandler application/x-httpd-php .php
同じファイルの以下のコメントアウト(#)を外す必要があります。ここを外さないと次に設定するhttpd-ssl.conf
でSSLを起動する設定がエラーになってしまいます。httpd-ssl.conf
を読み込む為にコメントアウトを外します。
#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
#LoadModule ssl_module modules/mod_ssl.so
#Include conf/extra/httpd-ssl.conf
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf
C:\Program Files (dev)\Apache24\conf\extra\httpd-ssl.conf
を開いて、SSLのサーバー名とポートの設定、SSLエンジンの開始、OpenSSLとの連携と証明書、秘密鍵の保存場所を指定します。証明書、秘密鍵は用意されている前提で記述して最後に配置します。
ServerName localhost:443
SSLEngine on
SSLCertificateFile "${SRVROOT}/conf/ssl.crt"
SSLCertificateKeyFile "${SRVROOT}/conf/ssl.key"
自己証明書の用意
ローカルなので表に開放する事も無く、SSLできれば開発で必要な環境になるので組織に証明を貰う必要も無く、シンプルに証明書・秘密鍵
が用意できる記事を選んでご紹介すれば良いと考えましたが、一応のプロセスだけ抜き出してご説明します。参考にさせて頂いた記事は同じQiitaの@taitai22_1さんの記事になります。以下、ほぼコピペです。
〇秘密鍵を作成
- genrsa : RSA秘密鍵を生成する
- -out : 出力ファイル指定
- numbits : 生成する秘密鍵のサイズ。デフォルトで2048。
$ openssl genrsa -out ssl.key 2048
〇証明書署名要求(CSR)の作成
- req : PKCS形式の証明書要求(CSR)を作成する
- -new : 新しい証明書要求を生成する
- -out : 出力ファイル指定
- -key :証明書署名要求(CSR)に署名するための秘密鍵を指定する
$ openssl req -out ssl.csr -key ssl.key -new
Country Name (2 letter code) [XX]: # Enter
State or Province Name (full name) []: # Enter
Locality Name (eg, city) [Default City]: # Enter
Organization Name (eg, company) [Default Company Ltd]: # Enter
Organizational Unit Name (eg, section) []: # Enter
Common Name (eg, your name or your server's hostname) []: # Enter
Email Address []: # Enter
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: #Enter
An optional company name []: # Enter
「# Enter」の部分は、任意で入力のこと。
Chromeは、ドメイン名のチェックをCommon Nameで行わず、SAN(Subject Alternative Name)を参照しているとのこと。従って、SAN.txtに適用するホスト名を指定する。
subjectAltName = DNS:localhost
SAN.txtを自己署名証明書に情報を加えて、証明書署名要求(CSR)から自己署名証明書を作成する。SAN.txtがあるディレクトリで下記コマンドを実行。
$ openssl x509 -req -days 3650 -signkey ssl.key -in ssl.csr -out ssl.crt -extfile SAN.txt
ssl.keyとssl.crtが作成されていることを確認。
ssl.crtをパソコンで認証する
コマンドラインでssl.crt
を実行します。
ここで証明書のインストールを押します。
次へを押します。
参照ボタンで信頼された証明機関
を選んで次へを押します。
完了を押すとセキュリティの警告が出ますのではい(Y)
で完了です。
正しくインポートされました
とメッセージが出ますのでOK
で完了です。
証明書の確認と設置
◯ コマンドラインでcertmgr.msc
を動かすと証明書の一覧が表示されますので、先程の信頼された証明機関
から確認すると発行先に指定した証明書が見えます。
◯ 作成されたssl.keyとssl.crt
をC:\Program Files (dev)\Apache24\conf\extra\httpd-ssl.conf
の中で指定した以下のフォルダにコピーすれば完了です。
C:\Program Files (dev)\Apache24\conf\
最後に「Apache」を起動します。
◯ C:\Program Files (dev)\Apache24\bin\httpd.exe
のフォルダに移動して、ローカルでhttpd.exe -k install
とするとApacheがシステムに認識されますので、次にhtppd
とするとApacheが起動します。
◯ モニターで動作が確認できますので、以下を動かして動作を確認します。
C:\Program Files (dev)\Apache24\bin\ApacheMonitor.exe
PHPとMySQLの動作確認
コマンドプロンプトで以下を実行します。
C:\>php -v
PHP 8.4.4 (cli) (built: Feb 11 2025 16:25:02) (ZTS Visual C++ 2022 x64)
Copyright (c) The PHP Group
Zend Engine v4.4.4, Copyright (c) Zend Technologies
C:\>mysql --version
mysql Ver 9.2.0 for Win64 on x86_64 (MySQL Community Server - GPL)
補足(少々大きなデータデースを読み込む)
クラウドに作成したデータベースをローカルにコピーしたい場合、クラウドのphpMyAdminからデータベースをエクスポート(かなり巨大でもダウンロード出来る)して、コマンドプロンプトでMySQLを起動して、以下のコマンドでスムーズにデータを移行できます。******.sql
はローカルにダウンロードしたSQLのファイルのフルパスになります。予めローカルに移行先のデータベース(localdb)を用意しておきます。私のクラウドはかなり巨大なデータベースで、ローカルのphpMyAdminのインポートは途中で落ちてしまいます。
mysql> use localdb
Database changed
mysql> source ******.sql