2025年9月4日

OpenSSL/Win11/WSL2の独自SSLサーバ証明書作成とWebサーバの設定


大竹市下瀬美術館の庭園
大竹市下瀬美術館の庭園       


前回はWin11/WSL2上に自己認証(CA)局を構築しました。今回はこれを使ってSSLサーバ証明書を作成しWebサーバに設定してみます。

これにより,クライアントPCのWebブラウザとWebサーバ間でSSL通信できることを実証します。

正規のSSL証明書ではありませんが、ファイアーウォールで守られたローカルネットワーク内で廉価に使うことが出来、小規模事業所内で独自ドメインが扱えるので内部セキュリティの強化にもつながると考えます。

【実証前提条件】
・パソコン : Windows11 pro 24H2 (IPアドレス:IPv4固定値)
・Linux ディストリビューション : Ubuntu-24.04 LTS(lsb_release -a)
・WSL2        バーション   :   2.4.12.0 (wsl --version)
・OpenSSL バージョン : 3.5.2(openssl version)

それでは,学習を始めます。






  1.SSLサーバ証明書署名要求ファイル(CSR)の作成

自己証明書を発行するドメイン毎にディレクトリをつくります。マルチドメインの場合は,代表的なドメインを一つ作ります。ここでは,代表ドメイン名を「mydomain.home」としました。


Linuxコード

sudo mkdir /etc/ssl/mydomain.home


サーバドメインの秘密鍵とSSL証明書署名要求ファイル(CSR)を作成します。

例として「国:JP」,「県:Hiroshima」,「市:Hatukaichi」,「認証機関名:SGITL」,「証明書を発行したいFQDN:mydomain.home」を実証入力してみました。(SGITLは研究会の別名)


Linuxコード

sudo openssl req -new -keyout /etc/ssl/mydomain.home/mydomain-key.pem -out /etc/ssl/mydomain.home/mydomain-csr.pem


いろいろと聞かれますので回答します。
  • Enter PEM pass phrase:XXXXXXXXXX      #秘密鍵にパスワード設定 忘れないように。
  • Verifying - Enter PEM pass phrase: XXXXXXXXXX       #確認のためもう一度
  • Country Name (2 letter code) [AU]:JP      #国を2桁のアルファベット入力 日本:JP
  • State or Province Name (full name) [Some-State]:Hiroshima      #都道府県を入力
  • Locality Name (eg, city) []:Hatsukaichi      #市区町村を入力
  • Organization Name (eg, company) [Internet Widgits Pty Ltd]:SGITL      #認証機関名入力 
  • Organizational Unit Name (eg, section) []:.      #空欄を「.」でEnter
  • Common Name (e.g. server FQDN or YOUR name) []:www.mydomain.home      #証明書を発行したいFQDNを入力
  • Email Address []:XXXXX@XXX.XX.XX      #連絡が取れるメールアドレスを入力
  • A challenge password []:.      #パスワードを空欄「.」で入力
  • An optional company name []:.     #空欄「.」でEnter 


作成が終わると以下のファイルが作られます。

/etc/ssl/mydomain.home/mydomain-csr.pem #サーバ証明書要求ファイル(CSR)
/etc/ssl/mydomain.home/mydomain-key.pem #サーバ秘密鍵




  2.SubjectAltName(SAN)対応のためのファイル作成

Chrome 58 以降、Common Name(CN)が無視されてSubjectAltName(SAN)が必須になっています。

そのため,「SubjectAltName(SAN)」を定義しなければならないのですが,この方法には,「openssl」の設定ファイルに定義する方法と,コマンドパラメータとして与える方法があります。

今回は,手軽なコマンドパラメータとして与えるやり方を試します。

【DNSの場合のコマンドパラメータの作り方】

Linuxコード

cd /etc/ssl/mydomain.home
sudo sh -c "echo subjectAltName=DNS:mydomain.home,DNS:www.mydomain.home > san.ext"


【参考:IPアドレスの場合のコマンドパラメータの作り方】

cd /etc/ssl/XXX.XXX.XXX.XXX
sudo sh -c "echo subjectAltName=IP:XXX.XXX.XXX.XXX > san.ext"




  3.自己認証局(CA)で署名する

rootユーザで行うため,スーパーユーザになります。

Linuxコード

sudo su


自己認証局(CA)で署名します。

【主なパラメータ】
  • -days はサーバ証明書の有効期限,今回は365日にしています。
  • -cert 自己署名CA証明書のパス
  • -keyfile CA証明書の秘密鍵のパス
  • -in サーバSSL証明書要求ファイル(CSR)のパス
  • > サーバSSL証明書(署名済)の保存先パス
  • -extfile SubjectAltName(SAN)対応のために作ったファイルのパス

Linuxコード

openssl ca -days 365 -cert /etc/ssl/myCA/server-cert.pem -keyfile /etc/ssl/myCA/private/server-key.pem -in /etc/ssl/mydomain.home/mydomain-csr.pem > /etc/ssl/mydomain.home/mydomain-cert.crt -extfile /etc/ssl/mydomain.home/san.ext


いろいろ聞いてきますので答えます。

  • Enter pass phrase for /etc/ssl/myCA/private/server-key.pem:XXXXXX      #前回の自己認証局(CA)のパスワードを入力
  • Sign the certificate? [y/n]:y      #署名していいか聞いてくるので「y」
  • 1 out of 1 certificate requests certified, commit? [y/n] y      #管理するか「y」
  • exit      #rootユーザーから抜ける


作成が終わると以下のファイルが作られます。

/etc/ssl/mydomain.home/mydomain-cert.crt  #サーバ証明書(署名済)のパス
/etc/ssl/mydomain.home/mydomain-key.pem  #サーバ秘密鍵のパス




  4.秘密鍵パスワードの解除

秘密鍵にパスワードが設定されていると、Webサーバ起動時に毎回フレーズを入力しなければならないのでパスフレーズが無くても動作できるようにします


ディレクトリを移動します。

Linuxコード

cd /etc/ssl/mydomain.home

続いてパスフレーズ除去コマンドを

Linuxコード

sudo openssl rsa -in mydomain-key.pem -out mydomain-key.nopass.pem



1項でサーバ秘密鍵に設定したパスワードを入力します。

Enter pass phrase for mydomain-key.pem:XXXXXX     


なお,パスフレーズを除いた後の秘密鍵は,安全のためパーミッションの確認をお願いします。「root」権限のみ読みで書きできるようにして下さい。





  5.Webサーバへの設定

あとは,これらの証明書類をWebサーバに設定するのですが,今回は「Apache2」のみ記述します。「Nginx」については,インターネット上に沢山事例がありますのでご参照下さい。

【Apache2の場合】

Apache2の設定ファイルのフォルダに遷移します。

Linuxコード

cd /etc/apache2/sites-available


続いて,設定ファイルを修正します。今回はエディターに「vim」を利用しています。


Linuxコード

sudo vim default-ssl.conf


なお,ここでは「default-ssl.conf」にしていますが,複数ドメインがある場合は,ドメイン毎に設定ファイルがありますので,それぞれ設定してください。


「VirtualHost _default_:443;」の項で修正を行います。

①「ssl_certificate サーバ証明書(署名済)のパスの修正」

サーバ証明書修正事項

ssl_certificate /etc/ssl/mydomain.home/mydomain-cert.crt

②「ssl_certificate_key サーバ秘密鍵(パスワード削除済)のパスの修正」

サーバ秘密鍵修正事項

ssl_certificate_key /etc/ssl/mydomain.home/mydomain-key.nopass.pem


「以下記入例」

<IfModule mod_ssl.c>
           <VirtualHost _default_:443>
                ServerName mydomain.home
                ServerAlias www.mydomain.home
                ServerAdmin webmaster@localhost
                DocumentRoot /var/www/html
                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined
                sslEngine on
                SSLCertificateFile   /etc/ssl/mydomain.home/mydomain-cert.crt
                SSLCertificatekeyFile   /etc/ssl/mydomain.home/mydomain-key.nopass.pem
             </VirtualHost>

          なお,その他の「VirtualHost 」も設定するかは,Web管理者の判断です。


修正後、Apache2を再起動します。

Linuxコード

sudo service apache2 restart


最終的にクライアントPCでブラウザを立ち上げ,「https://www.mydomain.home」でSSL通信が出来ればOKです。

実際には,DNS環境を作ったりホームページを立ち上げたり,環境を整える必要があると思います。そこは適宜ご対応ください。

【注意点】
今回のドメインは「mydomain.home」で実証しましたが,前にお示しした「UnboundによるDNSキャッシュサーバ」の構築例では,「local-domain.home」で実証していました。

そのため,今回の「mydomain.home」をDNSキャッシュサーバに新たに登録するか,名前を変更するかはローカルネットワーク管理者の判断でお願いします。

参考までに,前のサイトのLinkカードを貼付します。

RaspberryPiとUnboundを使ったローカルDNSキャッシュサーバの構築

RaspberryPiとUnboundを使ったローカルDNSキャッシュサーバの構築

UnboundとRaspberryPiを利用して,ローカルDNSキャッシュサーバの構築を実証しました。DNSSECやDNSoverTLSなど,セキュリティにも配慮し,事業所内でも使えるDNSキャッシュサーバが構築できました。




  6.まとめ

以上で,独自SSLサーバ証明書作成とWebサーバの設定は終了です。独自SSLに対応したドメイン環境を作るのは結構大変ですね。

でも,こんなことがWSL2環境で構築できるのですから,昔から見れば大変な進歩です。

インターネットの環境では,正規のインターネットサービス事業者がサービスを提供してくれているので,それを利用した方が安全で確実です。

今回の実証は,あくまでセキュリティに守られたローカルネットワーク内で行うものとご理解ください。

でも,いろいろと勉強になります。

それでは,楽しいITリテラシーライフをお過ごしください。



(ご注意)情報の正確性を期していますが,実施される場合には自己責任でお願いします。

0 件のコメント: