2021年5月11日火曜日

Linuxでオレオレ認証局を構築する & ESXiのSSLサーバ証明書入れ替え手順

SSLサーバ証明書を作る場合、証明書を必要とする機器にてCSR (証明書署名要求) を作成し、それを第三者機関の正式な認証局にて署名してもらう必要がある。正式な認証局による署名は各種申請や審査があり、費用も発生することから、検証目的などで使用することは現実的ではない。

そこで、正式な第三者の認証局を使うのではなく、自分で認証局を作り、自分でSSLサーバ証明書を作成する。このような認証局、証明書はオレオレ認証局オレオレ証明書と呼ばれる (正式には自己署名証明書と呼ぶ)。

今回、Linuxサーバをオレオレ認証局として構築し、CSRに署名を行うことで、以下のような「保護されていない通信」といったブラウザの証明書に関する警告を表示させないように設定する。例として、ESXiのWeb管理画面となる「VMware Host Client」に使うSSLサーバ証明書を作成して入れ替えを行う。

環境

Cent OS 8をオレオレ認証局として構築し、ESXiにて生成したCSRに署名をすることで、SSLサーバ証明書を作成する。なお、動作確認にはChromeのみで確認しているが、ChromiumベースのMicrosoft Edgeでも同様の動作となると想定される。

  • 認証局Linux OS : CentOS 8
  • 動作確認ブラウザ : Google Chrome
  • ESXi : 6.7 Update 3

SSLサーバ証明書作成の一覧の流れを以下に図示する。

オレオレ認証局を作成

1. opensslのパッケージをインストール

Linuxをオレオレ認証局として構築する場合は、opensslのパッケージが必要となる。ただし、CentOSの場合は、最小インストールの場合でもデフォルトでインストールされているので、確認だけしておく。

# rpm -qa | grep openssl
openssl-1.1.1c-2.el8_1.1.x86_64
openssl-libs-1.1.1c-2.el8_1.1.x86_64
xmlsec1-openssl-1.2.25-4.el8.x86_64
openssl-pkcs11-0.4.8-2.el8.x86_64

2. openssl.cnfを修正

証明書を発行する際の設定は/etc/pki/tls/openssl.cnfで実施する。デフォルトでは有効期限が1年と短いなど使い勝手が悪いので、以下の通りviなどを使って修正を行う。

設定項目 設定値 説明
default_days 3650 証明書の有効期限を約10年に設定。
countryName_default JP デフォルトでJP (日本) を設定。
stateOrProvinceName_default Tokyo デフォルトでTokyoを設定。
basicConstraints CA:TRUE 認証局となるため、CA:TRUEに設定。

3. CAスクリプトを入手

CentOS 7以前のopensslでは、/etc/pki/tls/misc/CAというスクリプトが用意されており、認証局作成や署名などを簡単に実施できるようになっていた。残念ながら、CentOS 8のopensslには含まれなくなってしまったようなので、CentOS 7の環境からCAスクリプトを入手し、同様に/etc/pki/tls/misc/に配置する。

4. CAスクリプトを修正

CAスクリプトに対して以下修正を行う。SAN (Subject Alternative Name) の設定理由は後述する。

行数 設定項目 設定値 説明
64 CADAYS="-days 1095" CADAYS="-days 3650" 3年→10年に修正。
156 $CA -policy policy_anything -out newcert.pem -infiles newreq.pem $CA -policy policy_anything -extfile san.txt -out newcert.pem -infiles newreq.pem SANを設定するため、-extfile san.txtを追記。

5. 認証局を作成

./CA -newcaを実行し、認証局として必要な秘密鍵と公開鍵の作成を行う。対話式で入力が必要となるので、以下の通り必要項目を入力する。

# cd /etc/pki/tls/misc/
# ./CA -newca
CA certificate filename (or enter to create)

Making CA certificate ...
Generating a RSA private key
.........................................+++++
............................................+++++
writing new private key to '/etc/pki/CA/private/./cakey.pem'
Enter PEM pass phrase: ←★パスワードを入力
Verifying - Enter PEM pass phrase: ←★再度パスワードを入力
-----
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) [JP]: ←★そのままEnter
State or Province Name (full name) [Tokyo]: ←★そのまま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) []:My Private CA
 ↑★認証局の名称などを記載。任意の名前でもFQDNでも区別がつけばOK
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
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/./cakey.pem:
 ↑★最初に設定したパスワードを再入力
Check that the request matches the signature
Signature ok

~(中略)~

Write out database with 1 new entries
Data Base Updated

作成された秘密鍵、公開鍵の保存先は以下の通りとなる。

保存先
秘密鍵 /etc/pki/CA/private/cakey.pem
公開鍵 /etc/pki/CA/cacert.pem

Windows OSの「信頼されたルート証明機関」として認証局の公開鍵をインポート

1. 認証局の公開鍵をダウンロード

先ほど認証局作成時に生成された公開鍵cacert.pemを端末にダウンロードする。

Windowsでは拡張子がpemの場合、証明書ファイルとして認識しないため、拡張子をcerに変更し、ファイル名をcacert.cerとして保存する。

2. 公開鍵を「信頼されたルート証明機関」としてインポート

非ドメイン環境 (Workgroup環境) の場合は、タスクバーの検索から「証明書」を入力し、「コンピューター証明書の管理」にて証明書をインポートする。

「信頼されたルート証明機関」
 →「証明書」

一方、ドメイン環境 (Active Directory環境) では、グループポリシーエディターを使って証明書をインポートすると便利である。グループポリシーの設定箇所は以下となる。

「コンピューターの管理」
 →「ポリシー」
  →「Windowsの設定」
   →「セキュリティの設定」
    →「公開キーのポリシー」
     →「信頼されたルート証明機関」

インポート手順自体は、ドメイン有無に関わらず同じとなる。

まず、「信頼されたルート証明機関」を右クリックし、「インポート」を選択する (選択箇所は「すべてのタスク」→「インポート」の場合もある)。

「保存場所」は「ローカルコンピューター」を選択する。

「インポートする証明書ファイル」は、先ほど認証局からダウンロードしたcacert.cerを選択する。

「証明書ストア」は「信頼されたルート証明機関」を選択する。

最後に「正しくインポートされました。」と表示されればOKとなる。

CSRを作成し、認証局にて署名

1. ESXiにてCSRを作成

ESXiのVMware Host Clientにログインし、「管理」→「セキュリティとユーザー」タブ→「証明書」→「新しい証明書をインポート」を選択する。

「FQDNの署名要求を作成」または「IPアドレスの署名要求を作成」のどちらかを選択する。私の環境ではIPアドレスによる直接アクセスであることから、後者を選択した。

「証明書署名要求の結果」にてCSRがテキストで出力されるので、「クリップボードにコピー」を押してコピーし、先ほど作成したオレオレ認証局の/etc/pki/tls/misc/newreq.pemファイルとして保存する。

# ls -l /etc/pki/tls/misc/
合計 12
-rwxr-xr-x 1 root root 5178  4月 29 16:04 CA
-rw-r--r-- 1 root root 1240  4月 29 16:44 newreq.pem

2. SAN設定用のテキストファイルを作成

SSLサーバ証明書では、以下を3点を確認することで、アクセス先のサーバが正当なものであることを確認している。

  1. SSLサーバ証明書に記載のCommon Name (CN)がブラウザに入力したURLのドメインと一致すること
  2. SSLサーバ証明書が信頼されるルート証明書機関による署名がされていること
  3. SSLサーバ証明書の有効期限が切れていないこと

しかし、Google Chromeでは、CNによるドメイン確認は廃止され、SAN (Subject Alternative Name) による確認を行うよう仕様が変更されている。そのため、作成するオレオレ証明書についても、SANの情報を埋め込む必要がある。

具体的には、SANの情報を記載するsan.txtというファイルをCAスクリプトと同じディレクトリに作成し、CAスクリプトで署名する際にその情報の埋め込みを行う (CAスクリプトは前述の手順にて修正済み)。

SANには、対象となるドメインやIPアドレスをカンマ区切りで複数記載することができ、ドメインの場合はサブドメインにワイルドカード (*) も使用可能である。ドメインの場合は頭にDNS:を付与し、IPアドレスの場合はIP:を付与する。

今回は、自宅ドメインすべてを含む*.intrat.localという設定とIPアドレスとなる192.168.33.10の両方を記載した。

# cat san.txt
subjectAltName = DNS:*.intrat.local, IP:192.168.33.10

3. CSRに署名しSSLサーバ証明書を作成

以上でようやく準備は整った。./CA -signを実行し、CSRに署名を行う。

# ./CA -sign
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem: ←★CA作成時に設定したパスワードを入力
Check that the request matches the signature
Signature ok

~(中略)~

Certificate is to be certified until Apr 27 07:54:39 2031 GMT (3650 days)
Sign the certificate? [y/n]:y ←★yを入力


1 out of 1 certificate requests certified, commit? [y/n]y
 ↑★yを入力
Write out database with 1 new entries
Data Base Updated

~(中略)~

Signed certificate is in newcert.pem

問題なく完了すると、SSLサーバ証明書としてnewcert.pemが生成されているはずだ。

# ls -l
合計 32
-rwxr-xr-x 1 root root 5195  4月 29 18:09 CA
-rw-r--r-- 1 root root 4482  4月 29 19:23 newcert.pem
-rw-r--r-- 1 root root 1172  4月 29 19:23 newreq.pem
-rw-r--r-- 1 root root   72  4月 29 18:16 san.txt

4. SSLサーバ証明書をESXiにインポート

作成されたSSLサーバ証明書はテキストファイルとなっているため、catを使うことで証明書情報を出力させることができる。必要情報は、BEGIN CERTIFICATEからEND CERTIFICATEまでとなるので、テキストで表示させコピーしておく。

# cat newcert.pem | grep -A 100 BEGIN
-----BEGIN CERTIFICATE-----
MIID9TCCAt2gAwIBAgIUTeRKOvluYWQQIfSA0z6d5dj8UggwDQYJKoZIhvcNAQEL

~(中略)~

BxTM2w+vx0CcT2vO7IjUQo3+zGBSQVHl+7QTZm6O8k0/NDMLr9WS1Bh0ZMykXit/
JoKBnz+NRLl2
-----END CERTIFICATE-----

コピーした証明書情報をESXiの「証明書」欄に貼り付けて、「インポート」ボタンを押す。

問題なければ、「証明書は正常に更新されました。ブラウザを更新する必要があります」と表示される。

5. 動作確認

ブラウザはF5による画面更新では効果がない場合がある。その際は、一度ブラウザをすべて閉じたのち起動させることで、新しい証明書情報でアクセスできることを確認することができる。

問題なく設定ができていれば、証明書の警告画面やアドレスバーの「保護されていない通信」の警告は表示されることなく、ESXiのVMware Host Clientの画面が表示されるはずだ。

なお前述した通り、Chromeでは証明書のSANの値にてドメインやIPアドレスの正当性を確認する。今回の設定ではドメインとしてワイルドカードで設定をしていることから、FQDNによるアクセスをした場合でも、警告メッセージは表示されることはなく、正常にアクセスをすることができる。

参考

0 件のコメント:

コメントを投稿

人気の投稿