ローカルWebサーバーのhttps対応(XAMPP編)

投稿日:  更新日:

2000年の初め頃、https(HTTPのSSLによる暗号化通信)は、Webサイトの一部のページやECサイトなど、機密情報を扱う部分のみで使われていました。

「ネット決済をするときは、URL横の鍵マークを確認しましょう!」と、注意喚起されていたのを覚えています。

現在は、機密情報を扱う・扱わないに関係なく、ほとんどのWebサイトがhttpsを採用しています。安全なサイトであることを証明するためです。

日本(2025年)におけるWebサイトのhttps使用率は95%に達しているそうです。ですから、httpsは必須と言えます。

ローカルWebサーバーのhttps化は不要ですが、アプリ開発環境であれば、実環境(一般ユーザにアプリを使ってもらう環境)に合わせて導入した方が良いでしょう!

※環境:XAMPP 8.2.12
     XAMPP Control Panel Version 3.3.0.
     Apache 2.4.58
     OpenSSL 1.1.1p
    Chrome バージョン 142.0.7444.163 (Windows版)

スポンサーリンク

XAMPPの初期状態

XAMPPはインストール直後の初期状態で、httpsによるアクセスへ対応しています。

しかし…

Httpsでアクセス

SSLによる接続が確立できない(ERR_CERT_AUTHORITY_INVALID)ため、Webパージは表示されません。

接続が確立できない理由は、証明書が「自己署名証明書」である事と、証明書が期限切れである事です。

また、WebページがXAMPP用に準備されたデフォルトのページであったり、証明書の証明対象のホスト名がlocalhostであったり、実用的とは言えません。

Webサーバーとやり取りするアプリ開発で使用できるように、httpsの設定を見直したいと思います。

スポンサーリンク

ホスト名の設定

任意のホスト名でhttpsアクセス出来るように、/etc/hostsへホスト名とIPアドレスのペアを追加します。
※hostsの書き換えについては「Windowsの/etc/hosts書き換え」を参照

PS C:\Users\ユーザー名> cd /Windows/System32/drivers/etc
PS C:\Windows\System32\drivers\etc> cat hosts
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
#       127.0.0.1       localhost
#       ::1             localhost
        192.168.0.2    mysite.example.com
スポンサーリンク

自己署名証明書の作成

opensslコマンドを使って証明書を作成します。以下の手順に従って下さい。

  • (1)秘密鍵の作成
  • (2)証明書署名要求(CSR)の作成
  • (3)自己署名証明書の作成

opnesslコマンドはXAMPP内にあります。所在は「XAMPPのインストール先\apache\bin」です。このopensslを使っても良いし、別途用意したopensslでも構いません。

XAMPPからShellを起動すれば、コマンド検索パスの設定されたターミナル(昔ながらのcmd.exe)が起動します。そのまま、ターミナル上でopensslが利用可能です。

XAMPPでShellを開く

# openssl version
OpenSSL 3.1.3 19 Sep 2023 (Library: OpenSSL 3.1.3 19 Sep 2023)
スポンサーリンク

(1)秘密鍵の作成

秘密鍵を作成します。

# openssl genrsa -out server.key 2048
# type server.key  ... 作成された秘密鍵
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD6FeEyM/XFpJJU
FKSA/kRRZeLVUZwKjsB6/Plp4mgpkqlOMCDKdrb2YTD1iwuLhn+FnoeP53Y1edJ0
...
BZy8zRR+tOFoSis4UtfbYYrNACvTgsG1N/w7nZJyeN7aOPxz1P4y0VFD1fdMHG1B
LQm8a1Vajjd9EmmjUVNQ0kE=
-----END PRIVATE KEY-----

(2)証明書署名要求(CSR)の作成

CSRを作成します。

Common NameはWebサーバーのホスト名にしてください。それ以外は、Webサーバーに適した文字列を入れてください。

また、公開鍵は、引数で指定した秘密鍵(server.key)から内部で自動生成されます。

# openssl req -out server.csr -key server.key -new
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:SampleKen
Locality Name (eg, city) []:SampleShi
Organization Name (eg, company) [Internet Widgits Pty Ltd]:SampleCorp
Organizational Unit Name (eg, section) []:SampleSect
Common Name (e.g. server FQDN or YOUR name) []:mysite.example.com
Email Address []:SampleAddr

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:[RET]
An optional company name []:[RET]
# type server.csr  ... 作成されたCSR
-----BEGIN CERTIFICATE REQUEST-----
MIIC3TCCAcUCAQAwgZcxCzAJBgNVBAYTAkpQMRIwEAYDVQQIDAlTYW1wbGVLZW4x
EjAQBgNVBAcMCVNhbXBsZVNoaTETMBEGA1UECgwKU2FtcGxlQ29ycDETMBEGA1UE
...
CpjTpvkWsuh9N5pXlDD09mIZDgE/+4aPjb45GsFIKRH7E1LqgaIHhWiLkmafzb2I
r0AvSX9vb8bNt9pWw3tBIuQ=
-----END CERTIFICATE REQUEST-----
スポンサーリンク

(3)自己署名証明書(CRT)の作成

証明書を作成します。

署名に用いるキーが自身の秘密鍵(server.key)なので、自己署名証明書になります。

# echo subjectAltName=DNS:mysite.example.com > server.ext
# echo basicConstraints=CA:TRUE >> server.ext
# openssl x509 -req -days 365 -key server.key -in server.csr -out server.crt -extfile server.ext
Certificate request self-signature ok
subject=C = JP, ST = SampleKen, L = SampleShi, O = SampleCorp, OU = SampleSect, CN = mysite.example.com, emailAddress = SampleAddr
# type server.crt  ... 作成されたCRT
-----BEGIN CERTIFICATE-----
MIIDtzCCAp8CFBZ+7cHCkIrqpnBd2+Vzfdj40AIrMA0GCSqGSIb3DQEBCwUAMIGX
MQswCQYDVQQGEwJKUDESMBAGA1UECAwJU2FtcGxlS2VuMRIwEAYDVQQHDAlTYW1w
...
pckuvzhIWF57ayeogOzbhRg9s7wMjPthmBgj942NgLAdarhdteOUkqL4I4p48TQu
M9SVr3lu2g0ii0odgsFflwyd6FzsMKZOK1KBTPKUnZ7N4mTm3ghzzu2ksQ==
-----END CERTIFICATE-----
スポンサーリンク

Chrome対応

最新のChromeは、証明対象のホストをSAN(Subject Alternative Name)で評価するようになりました。CN(Common Name)は使われません。

ですので、Chromeへ取り込む証明書は、SANを持つ必要があります。

また、Androidの証明書マネージャーは、取り込む証明書にCA証明書を期待します。「basicConstraints=CA:TRUE」を指定するとCA証明書になります。

以下は、証明書のダンプです。Chrome対応は赤字の部分が必要です。

# openssl x509 -text -in server.crt -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            76:8d:03:60:fa:d7:9c:0e:f0:cb:f9:df:a0:fd:bf:ba:9d:b4:19:34
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = JP, ST = SampleKen, L = SampleShi, O = SampleCorp, OU = SampleSect, CN = mysite.example.com, emailAddress = SampleAddr
        Validity
            Not Before: Nov 20 13:53:37 2025 GMT
            Not After : Nov 20 13:53:37 2026 GMT
        Subject: C = JP, ST = SampleKen, L = SampleShi, O = SampleCorp, OU = SampleSect, CN = mysite.example.com, emailAddress = SampleAddr
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:fa:15:e1:32:33:f5:c5:a4:92:54:14:a4:80:fe:
                    44:51:65:e2:d5:51:9c:0a:8e:c0:7a:fc:f9:69:e2:
                    ...
                    15:07:91:b8:8a:5b:cc:fe:8d:c6:22:d8:8a:15:94:
                    7c:3b
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Alternative Name:
                DNS:mysite.example.com
            X509v3 Basic Constraints:
                CA:TRUE
            X509v3 Subject Key Identifier:
                2A:53:5F:8A:D6:87:36:C7:69:44:1B:30:34:38:CB:77:63:91:57:EB
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        ac:26:d6:d3:77:7b:69:52:75:df:f8:9b:48:de:ab:9d:f2:da:
        3c:ce:16:25:42:e6:62:e9:ea:4e:e4:1e:ed:b1:1d:47:dd:92:
        ...
        fb:ba:a3:b7:82:9d:4f:17:c5:1f:ab:e6:a2:4d:a1:d1:1c:2e:
        b3:73:93:a8
スポンサーリンク

httpsの設定

サーバー設定をhttpd-ssl.confに行います。所在は「XAMPPのインストール先\apache\conf\extra」です。

XAMPPからhttp-ssl.confをNotePadで開くことが出来ます。

XAMPPでhttpd-ssl.confを開く

ファイルの最後に次の記述を追加して下さい。

<VirtualHost *:443>								... すべてのIPに対応
DocumentRoot "G:/MyContent/"					... トップページのソースの所在
ServerName mysite.example.com					... 要求に応じたサーバ名
SSLEngine on									... SSL有効
SSLCertificateFile "conf/ssl.crt/server.crt"	... 証明書
SSLCertificateKeyFile "conf/ssl.key/server.key"	... 秘密鍵
</VirtualHost>

「自己署名証明書の作成」で作成した証明書ファイル(server.crt)をSSLCertificateFileへ、秘密鍵ファイル(server.key)をSSLCertificateKeyFileへ置きます。

# copy server.crt x:\XAMPP\apache\conf\ssl.crt\
x:\XAMPP\apache\conf\ssl.crt\server.crt を上書きしますか? (Yes/No/All): Y
        1 個のファイルをコピーしました。

# copy server.key x:\XAMPP\apache\conf\ssl.key\
x:\XAMPP\apache\conf\ssl.key\server.key を上書きしますか? (Yes/No/All): Y
        1 個のファイルをコピーしました。

最後に、httpdを再起動してください。再起動で設定が反映されます。

スポンサーリンク

コンテンツの配置

DocumentRootに指定したフォルダへ、トップページのソース(html)を配置します。

今回はサンプルなので、簡素なトップページになっています。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1"/>
    <title>MyContent</title>
</head>
<body>
    <p id="text"></p>
    <script>
        const text = document.getElementById('text');
        const mesg = 'このパージのURLは「'+location.href+'」です。';
        text.innerHTML = mesg;
    </script>
    <center><p>【 My Content 】</p></center>
    <center><img src="./Droid.png" alt="Droid-Kun"></center>
</body>
</html>

Droid.png

スポンサーリンク

httpsでアクセス

WindowsのChromeを使ってhttpsでアクセスした結果です。

Chromeでhttpsアクセス

通常、Chromeは自己署名証明書を「信頼できない証明書」と判断します。その結果、httpsによる接続は拒否されます。

上記の結果は、自己署名証明書を「信頼できる証明書」として、Chromeへ意図的に取り込んでいます。

httpsで接続が出来ているのは、そのためです。

Chromeの信頼できる証明書
※詳細は「自己署名証明書を取り込む(Windows Chrome編)」を参照

スポンサーリンク

関連記事:

WindowsもLinux(Unix)と同じように「/etc/hostsファイル」を持っています。 役割も同じで「ホスト名とIPアドレスの変換テーブル」です。ホスト名からIPアドレスへ変換する際に、DNSに先立って参照されます。 ですので、hostsファイルにホスト名とIPアドレスの対を登録すれば、任意のホスト名でネットアクセスが可能になります。 ただし、Windowsの一般ユーザ向けの機能というよりも、ヘビーユーザー向けの隠し機能のような存在です。 このような機能はトラブルの火種に成りかねないので、一時的な利用に止め、不要になったら設定を削除することをお勧めします。 ※環境:Windows 11 Pro Version 25H2 ...
開発マシンへローカルWebサーバー(Apache)を構築します。 これにより、Webサーバーと通信するアプリのテストが容易になります。 外部にWebサーバーを調達する必要がなく、机上のパソコン(開発マシン)内でテスト環境が完結します。 Webサーバーの構築にXAMPPを使いました。 XAMPPは、ファストフードならぬ、ファストツールです。インストールして直ぐに使える点が、いいですね! ※環境:XAMPP 8.2.12      XAMPP Control Panel Version 3.3.0.      Apache 2.4.58      OpenSSL 1.1.1p     Chrome バージョン 142.0.7444.163 ...
通常、Chromeは自己署名証明書を「信頼できない証明書」と判断します。その結果、httpsによる接続は拒否されます。 しかし、自己署名証明書を「信頼できる証明書」として、Chromeへ意図的に取り込むことで、httpsによる接続が可能になります。 ただし、自己署名証明書が信頼できない点は変わりません。 ですので、パブリックなWebサーバーで、この方法を用いる事は危険です。プライベートなローカルWebサーバーのみで用いるようにして下さい。 ※環境:XAMPP 8.2.12      XAMPP Control Panel Version 3.3.0.      Apache 2.4.58      OpenSSL 1.1.1p     Chrome バージョン 142.0.7444.163 (Windows版) ...
スポンサーリンク