XAMPP無しで「Windows・localhost」を構築「SSL化」+「少々大きなデータベースを読み込む」

# はじめに
Windowsの環境に「localhostをXMAPPを利用する事無く構築する記事」は良く発見できますが、最終的に「https」接続が出来るようにという所まで解説されている記事が無くて、少々苦労しましたので記事にしてみます。localhostを構築して「http」で接続してクラウドのアプリを動かし開発する環境はスムーズに出来ますが、その後に「SSL化」する話は「SSLの暗号キー」の作り方までで、実際に暗号化の設定方法は記事が無くて不思議でした。

最初は以下の「@Limitex」さんの記事の抜粋になりますので合わせて読んで頂けますと「SSL化したWindwsのlocalhost」環境が完成します。「@Limitex」さんの記事と同様にフォルダは`「C:\Program Files (dev)」`にしております。

https://qiita.com/Limitex/items/098d2be431f1f031b1b9


設定ファイルの書き換えは最後に記述いたします。最初は各機能（php、Apache、MySQL、OpenSSL、phpMyAdmin）のダウンロードと配置、インストールを行います。
# XAMPPを使わないメリット？
これは色々と有るかと思いますが、個人的には以下のような物があります。
１．PHPやApacheのバージョンを環境変数や設置場所の変更で必要に応じて変更出来ます。
２．ローカルの環境を隠蔽しやすい。（社内でローカルアプリとして使用する場合）
※個人的には２番目が特に重要でした。
# 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（ダウンロードしてインストールします）
https://dev.mysql.com/downloads/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`を用意してエディタで編集します。
``` 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`を編集します。
``` ini:以下に変更します
Define SRVROOT "c:\Program Files (dev)\Apache24"
ServerName localhost:80
```
### 6.3 MySQL
`C:\ProgramData\MySQL\my.ini`
sql_mode の内容が 5.7 から一部変更があり、PHPの記述でエラーが発生する事があります。
``` ini:以下（sql_mode）の変更をお薦めします
sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
```
### 6.4 OpenSSL
OpenSSLは動作確認だけ行います。
``` ini:コマンドプロンプトで以下を実行
C:\ProgramData>openssl -version
OpenSSL 3.4.1 11 Feb 2025 (Library: OpenSSL 3.4.1 11 Feb 2025)
```
# 環境設定ファイルの設定（システム環境変数）
環境変数のウィンドウを以下のコマンドを管理者権限で実行します。
``` ini:環境変数のウィンドウを開く
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`を開いて、以下を最後に追記します。

``` ini:最後に以下を書き込みます。
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`を読み込む為にコメントアウトを外します。
```ini:変更前
#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
#LoadModule ssl_module modules/mod_ssl.so
#Include conf/extra/httpd-ssl.conf
```
```ini:変更後
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との連携と証明書、秘密鍵の保存場所を指定します。証明書、秘密鍵は用意されている前提で記述して最後に配置します。
```imi:順にサーバー名とポート番号・SSLの開始・証明書・秘密鍵
ServerName localhost:443
SSLEngine on
SSLCertificateFile "${SRVROOT}/conf/ssl.crt"
SSLCertificateKeyFile "${SRVROOT}/conf/ssl.key"
```
# 自己証明書の用意
ローカルなので表に開放する事も無く、SSLできれば開発で必要な環境になるので組織に証明を貰う必要も無く、シンプルに`証明書・秘密鍵`が用意できる記事を選んでご紹介すれば良いと考えましたが、一応のプロセスだけ抜き出してご説明します。参考にさせて頂いた記事は同じQiitaの@taitai22_1さんの記事になります。以下、ほぼコピペです。

https://qiita.com/taitai22_1/items/019845da881733d522c2

〇秘密鍵を作成
* genrsa : RSA秘密鍵を生成する
* -out : 出力ファイル指定
* numbits : 生成する秘密鍵のサイズ。デフォルトで2048。
```bash
$ openssl genrsa -out ssl.key 2048
```
〇証明書署名要求（CSR）の作成
* req : PKCS形式の証明書要求（CSR）を作成する
* -new : 新しい証明書要求を生成する
* -out : 出力ファイル指定
* -key :証明書署名要求（CSR）に署名するための秘密鍵を指定する
```bash
$ 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に適用するホスト名を指定する。
```SAN.txt
subjectAltName = DNS:localhost
```
SAN.txtを自己署名証明書に情報を加えて、証明書署名要求（CSR）から自己署名証明書を作成する。SAN.txtがあるディレクトリで下記コマンドを実行。
```bash
$ 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`を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296178/d5abb93a-8f77-48ca-ba14-c06d0bd4264b.png)
ここで証明書のインストールを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296178/8d26112c-02ac-4e34-9a8d-137c554350d0.png)
次へを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296178/7fdbe217-ab8a-4243-a446-675cdd189662.png)
参照ボタンで`信頼された証明機関`を選んで次へを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296178/1f47fa94-0812-4f79-b8dc-89c92bd38021.png)
完了を押すとセキュリティの警告が出ますので`はい（Y）`で完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296178/8a72903e-b800-4db8-ab65-e2e68982509d.png)
`正しくインポートされました`とメッセージが出ますので`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の動作確認
コマンドプロンプトで以下を実行します。
``` ini:以下のコマンドで確認
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のインポートは途中で落ちてしまいます。
``` ini:MySQLにログインして以下を実行
mysql> use localdb
Database changed
mysql> source ******.sql
```