Windows11、Apacheでのオレオレ証明書のやり方メモ
- 掲載日
サービスワーカーやクリップボードなど、localhostやhttpsじゃないと処理できないjsの機能が最近多く、ローカルでの実装が大変なでWindows、Apache環境での警告が出ないオレオレ証明書の入れ方の備忘録を残しておきます。
環境
- Windows11
- Apache2.4
手順
証明書発行
- Apacheの
conf/openssl.confに、以下を追加します。
[ alternate_names ]
DNS.1 = example.com
# example.comの所を任意のドメインに変更。複数ある場合以下のような形で追加できる
DNS.2 = test.test- 同じく
conf/openssl.confで、[ v3_ca ]という段落があるので探して追記します。
[ v3_ca ]
# 省略
subjectAltName=@alternate_names
keyUsage= digitalSignature, keyEncipherment
# 省略
- 同じく
conf/openssl.confで、copy_extensionsという項目があるので、探してコメントアウトします。
# copy_extensions = copy
↓
copy_extensions = copy
- 上記設定完了後にコマンドプロンプト開いて証明書を発行します。
# openssl.confのパスをあらかじめ指定する必要がある。
> set OPENSSL_CONF=C:\XXXXX\XXXXX\conf\openssl.cnf
> openssl genrsa -out private.key 3072
Generating RSA private key, 3072 bit long modulus (2 primes)
# 省略
> openssl req -new -x509 -key private.key -sha256 -out certificate.pem -days 730
You are about to be asked to enter information that will be incorporated
# 省略
-----
# 色々聞かれますが、全てエンターキーでOKです。
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:証明書インストール
上記までの処理を行うと、実行したディレクトリ上に以下の二つのファイルが作成されます。
- private.key
いわずもがな秘密鍵 - certificate.crt
証明書
certificate.crtを信頼できる証明書としてインストールしていきます。
- まず、
certificate.crtをダブルクリックすると、以下のようなウィンドウが開きます。
「証明書のインストール」ボタンをクリックします。 - 証明書のインポートウィザードが開きます。
保存場所の「ローカルコンピューター」をクリックし、「次へ」をクリックします。
- 「証明書をすべて次のストアに配置する」をクリックし、「参照」ボタンをクリックします。

- 「証明書ストアの選択」ウィンドウが開くので、「信頼されたルート証明機関」をクリックし、「OK」ボタンをクリックします。

- インポートウィザードに戻るので、「次へ」ボタンをクリックします。

- 完了画面が表示されるので、「完了」ボタンをクリックします。


Apacheでテスト用サイトをhttpsで表示する
conf/httpd.confを開いて以下を追加します。
<Directory "C:\xxx\xxx"> # C:\xxx\xxxに任意のテストしたいサイトのディレクトリ
AllowOverride All
Require all granted
Options Indexes FollowSymLinks
AddHandler php-script .php .html # この辺は環境に合わせて設定する
AddType application/x-httpd-php .php .html
</Directory>
<VirtualHost *:443>
ServerName test.test:443 # test.testは任意のテスト用ドメイン
DocumentRoot "C:\xxx\xxx"
ErrorLog "logs/ssl-test-error.log"
CustomLog "logs/ssl-test.log" common
SSLEngine on
# 証明書発行手順で発行した鍵のディレクトリとファイル名
SSLCertificateFile "C:\xxx\xxx\xxx.crt"
SSLCertificateKeyFile "C:\xxx\xxx\xxx.key"
</VirtualHost>
hostsに追加します。
(hostsはwindowsなら通常C:\Windows\System32\drivers\etc\にあると思います。)
xxx.xxx.xxx.xxx test.test
# xxx.xxx.xxx.xxx: 自分のローカルIP
# test.test: テスト用ドメイン
- コマンドプロンプトを起動し、
httpdサービスを再起動します。
httpd -k restart
or
httpd -k graceful確認
httpsでテストサイトにアクセスし、警告が表示されないことを確認します。
(chromeで確認しています。EdgeやFireFoxでも同じ手順でいけるのかは不明。)

所感
以下の理由でローカルでhttps入れてテストしたかったので、この方法でしばらくいけそうです。
- ngrok等は一時的とはいえ外部にサービス公開されるので嫌
- サーバー用意してLet's Encrypt入れて開発環境をちゃんとするのは趣味なのにお金かかるので嫌
localhostで使用出来る機能もあるけど、実環境はhttpsでアクセスするし、意外とhttps接続やドメイン由来のエラーも多いのでちゃんとローカルと実機環境を近づけたい- 適当なオレオレ証明書だと都度警告画面が出て来るのが面倒
参考リンク
- Chrome: オレオレ証明書でもセキュリティ警告画面が出ないようにする方法
内容はほぼ上記と同じですが、Windowsだと証明書作成時にsetコマンドで「openssl.cnf」のパスを指定する必要があったのと、証明書のインストール方法が微妙に違っていたので記事を作成しました。
set OPENSSL_CONF=C:\XXXXX\XXXXX\conf\openssl.cnf
この記事を書いた人
- A.W.
- 茨城県在住Webエンジニアです。 PHP、PostgreSQL、Linuxなどを業務で使用しています。 趣味ではGoやNuxt、Flutterをやってます。