2025年8月29日

OpenSSL/Win11/WSL2の自己認証局(CA)構築とCA証明書のClient-Install


大竹市下瀬美術館から見る宮島
大竹市下瀬美術館から見る宮島     


ローカルネットワーク内にプライベートドメインを作成すると,次はそのドメインのSSL証明書をどうするかという課題に直面します。

例えば,Windows/WSL2を使って,ローカル用にWebサーバを立ち上げた場合,そのドメインのSSL証明書がないとブラウザが「信頼できない通信」と警告を発します。

それを防ぐ方法としては,SSL証明書を正式に取得するか,独自に作成するかのどちらかになります。

正式に取得した方がいいのですが有料になりますし,ローカルネットワーク内だけで使うのであれば,独自に認証局を立ち上げてSSLサーバ証明書を作成するのも一つの方法です。

そこで,今回はWSL2環境における自己認証局の作成とSSLサーバ証明書の作成を学習してみたいと思います。

学習内容が長いため,自己認証局(CA)構築~CA証明書のクライアントインストールまでを今回記述し,独自SSLサーバ証明書の作成~Webサーバの設定までを次回記述します。

【実証前提条件】
・パソコン : 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認証の仕組み

まず,自己認証方式について学習します。

自己認証方式とは自己認証局を自局サーバに作成し、自局のCA証明書をクライアントにインストールするとともに、自己認証局によって証明されたSSLサーバ証明書(ドメイン認証)をサーバ側にセットすることで、クライアントとサーバのやり取りを暗号化する仕組みです。

この方式では,クライアントとサーバが安全にSSL暗号化通信のための共通鍵(セッションキー)を交換するための方法として公開鍵暗号が利用されています。

  • 認証局 (CA、Certificate Authority、Certification Authority) は、他の当事者にデジタル 公開鍵証明書 (SSLサーバ証明書【ドメイン認証】)を発行する実体です。
  • 公開鍵暗号とは,暗号と復号に異なる鍵(公開鍵と秘密鍵)を使用する暗号方式です。公開鍵で暗号化したものは秘密鍵で復号でき,秘密鍵で暗号化したものは公開鍵で復号できます。公開鍵は誰でも入手できますが、秘密鍵は所有者のみが管理します。この方式により、安全な鍵交換やデジタル署名が可能になります。

以下に,公開鍵暗号による鍵交換を利用したSSL暗号化通信のフローを示します。

①接続要求

クライアント側からSSL通信のリクエストをサーバ側へ送信します。

②SSLサーバ証明書と公開鍵をクライアント側へ送付

サーバ側から、公開鍵付きのSSLサーバ証明書がクライアント側に送付されます。
クライアント側のブラウザに搭載されているCA証明書(ルート証明書ともいう)でSSLサーバ証明書の署名を検証します。

※正規認証局「信頼のある認証局」のCA証明書(ルート証明書ともいう)は、既に主要PCブラウザや携帯端末に搭載されており、ユーザ側で新たにインストールする必要がありませんが,自己認証局のCA証明書は新たにインストールする必要があります。

③共通鍵(セッションキー)を暗号化しサーバ側へ送付

クライアント側で生成された暗号用の「共通鍵(セッションキー)」を、サーバ側から送られてきた公開鍵を用いて暗号化し、サーバ側へ送信します。

サーバ側に送信された「共通鍵(セッションキー)」は、サーバ側で保持している秘密鍵で復号され、「共通鍵(セッションキー)」が取り出されます。

④SSL暗号化通信開始

個人情報などの機密性の高いデータを、クライアント側で保持している共通鍵で暗号化しサーバ側へ送信します。

サーバ側は、受け取った暗号データをサーバ側で保持している共通鍵で復号してデータを取得します。

※「共通鍵(セッションキー)」は、サーバとクライアントブラウザで対応する、最も強度の高い暗号方式・鍵長が使用されます。




  2.自己認証局(CA)構築環境の準備

SSL通信の仕組みを独自構築するには,最初に自己認証局(CA)を構築する環境を準備します。

OpenSSLツールをWSL2のLinuxディストリビューションにインストールします。

①「apt」パッケージ管理コマンドのアップデート

次のコマンドをLinuxプロンプトに入力します。

Linuxコード

sudo apt update
sudo apt upgrade


【注意点】
WSL2からインターネットに繋がらないことがあります。

WSL2は,通常,起動と同時に名前解決のための「/etc/resolv.conf」ファイルを書き換えますが,その中の「nameserver」設定が,「127.0.0.53」になっている場合があるからです。

WSL2では,通常,「/etc/resolv.conf」は「/mnt/wsl/resolv.conf」ファイルへのシンボリックリンクになりますが,「/run/systemd/resolve/resolv.conf」へのシンボリックリンクになっている場合があります。

一般的なLinuxではこれでも良いのですが,WSL2の場合はどうも上手く動きませんので,その場合は元にもどします。

戻し方は「/etc/wsl.conf」ファイルの中に,次の項目を記述して,PCを立ち上げ直して下さい。

[network]
generateResolvConf = true

これで,「/etc/resolv.conf」のシンボリックリンクが「/mnt/wsl/resolv.conf」になると思います。これで戻らない場合は重症ですので,インターネットをググッてさらに調査するしかありません。

元に戻れば,「/etc/resolv.conf」の中の「nameserver」が「10.255.255.254」になっているはずです。これは,本来,内部ネットワークのデフォルトゲートウェイを示します。


②OpenSSLのインストール

WSL2からインターネットにつながったとして,OpenSSLのインストールのためのコマンドを入力します。

Linuxコード

sudo apt install openssl


続いて,インストール確認のためバージョン情報を次のコマンドで取得します。


Linuxコード

openssl version



【注意点】
ここでインストールされる「openssl」は,Linuxディストリビューションに予めインストールされているライブラリで,最新バージョンでない可能性があります。セキュリティ上問題があれば,最新バージョンにアップデートする必要があります。

アップデートの手順は,以下のとおりです。

【手順1】OpenSSL のソースファイルをダウンロードするフォルダに遷移します。

Linuxコード

cd /usr/local/src

【手順2】OpenSSL のホームページから最新ソースをダウンロードします。最新ファイル名は確認してください。

Linuxコード

sudo wget https://www.openssl.org/source/openssl-3.5.2.tar.gz

【手順3】圧縮ファイルを解凍します。

Linuxコード

sudo tar xvf openssl-3.5.2.tar.gz

【手順4】解凍したフォルダに遷移します。

Linuxコード

cd openssl-3.5.2

【手順5】パッケージソースをbuildするための依存ライブラリをインストールします。

Linuxコード

sudo apt install build-essential

【手順6】ソースコードをコンパイルしインストールします。

Linuxコード

sudo ./config
sudo make
sudo make install


【手順7】バージョンの確認と依存関係の確認

opensslのバージョンを確認します

Linuxコード

openssl version


バージョンが正常に出力されない場合は,次のコマンドで依存関係を確認します。

Linuxコード

ldd /usr/local/bin/openssl


【出力メッセージの中に以下のメッセージがある場合】
libssl.so.3 => not found
libcrypto.so.3 => not found

見つからないライブラリの存在場所を探します。

Linuxコード

sudo find /usr/local/ -name libssl.so.3

【出力例】
/usr/local/src/openssl-3.2.5/libssl.so.3
/usr/local/lib64/libssl.so.3

Linuxコード

sudo find /usr/local/ -name libcrypto.so.3

【出力例】
/usr/local/src/openssl-3.2.5/libcrypto.so.3
/usr/local/lib64/libcrypto.so.3


「libssl.so.3」と「libcrypto.so.3」のどちらも「/usr/local/lib64」フォルダ下にあることが分かりました,


【手順8】ライブラリのパスを通します

共有ライブラリ検索のための設定ファイルは「/etc/ld.so.conf」ですが,「/etc/ld.so.conf.d」フォルダ下に該当ライブラリの検索パスファイルを書くと取り入れられます。

スーパーユーザ権限「#」で次のコマンドを実行してください。

Linuxコード「スーパユーザ権限」

echo "/usr/local/lib64" > /etc/ld.so.conf.d/lib64.conf

「/etc/ld.so.conf」の中身をPCが使う「/etc/ld.so.cache」に反映するため「ldconfig」コマンドを入力します。

Linuxコード

sudo ldconfig


【手順9】バージョンを確認し最新版のインストール完了確認

opensslのバージョンを確認します。

Linuxコード

openssl version

【出力メッセージ例】
OpenSSL 3.5.2 5 Apr 2025 (Library: OpenSSL 3.5.2 5 Apr 2025)

これで,最新バージョンへのアップデートは終わりです。



③OpenSSLの設定ファイル編集

続いて,OpenSSLの設定ファイルがある場所を次のコマンドで調べます。


Linuxコード

openssl version -d


【出力メッセージ例】
  OPENSSLDIR: "/usr/local/ssl" 

これで設定ファイルが「/usr/local/ssl」フォルダ下にあることが分かりますので遷移します。

Linuxコード

cd /usr/local/ssl

OpenSSLの設定ファイル内を編集します。ここではエディターに「vim」を使っています。

Linuxコード

sudo vim openssl.cnf


以下の[ CA_default ]項目の内容を修正します。自己認証局(CA)を置くディレクトリを指定します「ここではmyCAにしています。」

[ CA_default ]
dir             = /etc/ssl/myCA



④その他のOpenSSL構築環境の準備

自己認証局(CA)を置くディレクトリを作成します。

Linuxコード

sudo mkdir /etc/ssl/myCA


作成したディレクトリに移動します。

Linuxコード

cd /etc/ssl/myCA


「/etc/ssl/myCA」フォルダの下に「certs」,「private」,「crl」,「newcerts」の各ディレクトリを作成します。

Linuxコード

sudo mkdir certs
sudo mkdir private
sudo mkdir crl
sudo mkdir newcerts


秘密鍵が置かれる「private」ディレクトリのパーミッションを変更します

Linuxコード

sudo chmod 700 private


シリアルファイルを初期化します

Linuxコード

sudo sh -c "echo '01' > /etc/ssl/myCA/serial"


空の証明書データファイルを作成します。

Linuxコード

sudo touch /etc/ssl/myCA/index.txt





  3.自己認証局(CA)証明書と秘密鍵の作成

いよいよ,ここで自己認証局(CA)として自己認証局(CA)証明書を作成します。

最初に,自己認証局(CA)を置くディレクトリに移動します。

Linuxコード

cd /etc/ssl/myCA

自己認証局(CA)証明書と秘密鍵を作成します。「-days」は自己認証局(CA)証明書の有効期限なので適当に変えても良いです。ここでは,2年間「730日」にしています。

また,例として県:Hiroshima,市:Hatukaichi,国:jp,認証機関名:SGITL,認証局の名前:SGITL_CAをダミー的に実証入力してみました。(SGITLは研究会の別名)

なお,認証局の名称はクライアントにインストールした時に証明書情報として表示されますので分かりやすい名前がいいです。

Linuxコード

sudo openssl req -new -x509 -newkey rsa:2048 -out server-cert.pem -keyout private/server-key.pem -days 730

以下,いろいろと聞かれますので回答します。

  • Enter PEM pass phrase:  XXXXXXXX         #CA認証局のパスワードです。忘れないでください。
  • Verifying - Enter PEM pass phrase: XXXXXXXX             #確認のためもう一度 
  • Country Name (2 letter code) [AU]:JP        #国を2桁のアルファベットで入力 日本ならJP
  • State or Province Name (full name) [Some-State]: Hiroshima         #都道府県を入力
  • Locality Name (eg, city) []: Hatukaichi          #市区町村を入力
  • Organization Name (eg, company) [Internet Widgits Pty Ltd]: SGITL  #認証局機関名を入力
  • Organizational Unit Name (eg, section) []:.         #空欄として「.(ピリオド)」Enter 
  • Common Name (e.g. server FQDN or YOUR name) []:SGITL_CA      #認証局の名前を入力
  • Email Address []:XXXXX@XXX.XX.XX          #連絡が取れるメールアドレスを入力

作成が終わると以下のファイルが作られます。
  • /etc/ssl/myCA/server-cert.pem                        #自己認証局(CA)証明書
  • /etc/ssl/myCA/private/server-key.pem         #自己認証局(CA)証明書の秘密鍵

自己認証局(CA)証明書の秘密鍵はセキュリティ上、パーミッションを変更します。

Linuxコード

sudo chown root:root /etc/ssl/myCA/private/server-key.pem
sudo chmod 600 /etc/ssl/myCA/private/server-key.pem





  4.クライアントPCへのCA証明書のインストール

PCにインストールできるDER形式に変換します。

Linuxコード

sudo openssl x509 -inform PEM -outform DER -in /etc/ssl/myCA/server-cert.pem -out /etc/ssl/myCA/server-cert.der

変換して出来た”server-cert.der”をクライアントPCの任意のフォルダにダウンロードします。このダウンロード方法はいろいろあるのでリモートログインツールを使ってもいいです。

今回はWSL2なので,PCのエクスプローラの左欄から「Linux」→「Ubuntu」→「SSL」→「myCA」と検索して取り出します。

次にWindowsPCへのインストール方法ですが,任意のPCフォルダにダウンロードした”server-cert.der”をダブルクリックします。以後、以下の手順でインストールします。

【注意】
なお,Windowsのセキュリティ対応により,他のコンピュータから取得されたファイルはロックされる場合があります。
その場合はファイルを右クリックして,ファイルの「プロパティ」から「全般」タブ→最下段のセキュリティの「許可する」を選択→「適用」→「OK」をクリックします。

  • 証明書画面が開きますので,下段の「証明書のインストール」ボタンをクリックします。
  • 続いて証明書のインポートウィザード画面が開きますので,「ローカルコンピューター」にマークして「次へ」をクリックします。
  • 「このアプリがデバイスに変更を加えることを許可しますか」を聞いてきますので,「はい」をクリックします。
  • 「証明書のインポートウィザード画面」が開きますので,「証明書をすべて次のストアに配置する」を選択して,参照(R)から証明書ストアに「信頼されたルート証明機関」を選びます。「次へ」をクリックします。
  • 「証明書のインポートウィザートの完了」と出力されますので「完了」をクリックします。
  • 「正しくインポートされました。」画面が出たらインストール完了です。




  5.まとめ

ここまでで,自己認証局(CA)構築とCA証明書のクライアントPCへのインストール実証は終了です。

あとは,共通鍵(セッションキー)をサーバとPCで交換するためのSSLサーバ証明書(ドメイン認証)の作成が必要になります。

そのためには,先ほどの自己認証局でSSLサーバ証明書の署名が必要になります。結構説明が長くなったのでSSLサーバ証明書の作成は次回に回します。

Web技術において,認証局による認証と公開鍵暗号方式による鍵交換方法を考えるのは凄いことですね。

大変複雑なので,改めて整理するのに時間がかかりましたが参考になれば幸いです。

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



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

0 件のコメント: