オレオレ認証局でクライアント認証 ~ ウェブの Basic 認証をリプレース

JINS PC を使い始めました。普段はメガネをかけていないため、レンズに照明がうつり込むのが気になる、耳が痛い、と気になって気になってしかたがない yone です。効果があればよいのですが。

1. オレオレ認証局の活用

前回の記事で、オレオレ認証局 (プライベート認証局) の構築と、それを使ったウェブサーバ証明書の発行を紹介しました。記事の最後に、その他の証明書活用を紹介しましたが、今回はそのなかから「クライアント証明書」の事例を解説します。

2. クライアント証明書

一般公開しているウェブページではなく、特定の人だけに見せたいページを作る場合、Basic 認証を使うことが多いでしょう。ほぼ全てのブラウザが対応しており、広く使われています。

Basic 認証ダイアログ

Basic 認証ダイアログ

お手軽でよいのですが、盗聴・改竄に弱いという弱点があります。弱点を改善した Digest 認証というものがありますが、Basic 認証ほど普及していないようです。Basic 認証 + HTTPS の合わせ技である程度の防御力は付きますが、しょせん手で入力できる量の秘密情報なので、重要情報のガードとして使うのには心許ありません。

HTTPS の証明書はウェブサーバの証明書が有名ですが、実は PC にも証明書をいれることができます。そのうちの一つが、クライアント証明書です。ウェブサーバ証明書は、ウェブサーバが本物かどうかを証明しますが、クライアント証明書は接続元 (ユーザ) が本物かどうかを証明します (SSL クライアント認証)。これは、Basic 認証の代替となります。

Basic 認証と SSL クライアント認証の違いを乱暴に例えると、テンキーで暗証番号入力をしていたものを、IC カードで解錠するようにする、ということに近いイメージでしょう。

3. 認証局の準備

認証局側で準備が必要になります。この作業は、一度だけ行うものです。

  1. 前回の記事のルートCAを構築します。
  2. openssl.cnf を修正し、クライアント証明書を発行できるようにします。下記を openssl.cnf へ追加してください。
[ client_cert ]
basicConstraints=CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer

4. ウェブサーバの認証設定

HTTPS ウェブサーバの設定を変更し、クライアント証明書による認証をするよう設定します。以下は、Apache httpd の設定方法になります。

Basic 認証の設定は下記のようになります。

<Directory /var/www/html/secret>
    SSLRequireSSL
    AuthType Basic
    AuthName ByPasswd
    AuthUserFile /etc/secret.passwd
    Require user yone foo bar
    Order allow,deny
    Allow from all
</Directory>

SSL クライアント認証を使う場合は、下記のようになります。この設定は、Common Name が yone, foo, bar のいずれかの場合のみアクセスを許可します。

SSLCACertificateFile /etc/pki/exampleCA/cacert.pem
SSLCARevocationFile /etc/pki/exampleCA/crl.pem
<Directory /var/www/html/secret>
    SSLRequireSSL
    SSLVerifyClient require
    SSLUserName SSL_CLIENT_S_DN_CN
    Satisfy Any
    Allow from All
    SSLRequire %{SSL_CLIENT_S_DN_CN} in {"yone", "foo", "bar"}
</Directory>

5. クライアント証明書の発行

いよいよ、クライアント証明書を発行します。

本来はユーザが自分で証明書を作り、認証局はそれに対して署名をするというのがスジですが、今回はすべて認証局上で作業してしまいます。ユーザは出来上がった証明書ファイルをいきなりもらう形になります。

認証局上で下記のように実行します。第一段階は、証明書の生成です。Common Name にユーザ名を入力してください。

# cd /etc/pki/exampleCA
# openssl req -config openssl.cnf -new -keyout yone.key.pem -out yone.req.pem -days 365 -extensions client_cert
Generating a 1024 bit RSA private key
......++++++
....++++++
writing new private key to 'yone.key.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 &#39;.&#39;, the field will be left blank.
-----
Country Name (2 letter code) [JP]:
State or Province Name (full name) [Tokyo]:
Locality Name (eg, city) [Toshima-ku]:
Organization Name (eg, company) [Example Corp.]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:yone
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

次に、生成した証明書に認証局が署名します。

# openssl ca -config openssl.cnf -policy policy_anything -out yone.cert.pem -extensions client_cert -infiles yone.req.pem
Using configuration from openssl.cnf
Enter pass phrase for /etc/pki/exampleCA/private/cakey.pem:CAパスフレーズを入力
(略)
            X509v3 Extended Key Usage:
                TLS Web Client Authentication
(略)
Certificate is to be certified until Feb 17 07:52:25 2013 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
# ls newcerts
01.pem  02.pem  03.pem  04.pem  (← 一番大きな値のファイルを探す)
# rm yone.cert.pem
# mv yone.req.pem certs/04.pem  (← 探したファイル名を入れる)
# mv yone.key.pem private/04.pem  (← 探したファイル名を入れる)

最後に、ユーザへ配布する .p12 ファイルを作ります。

# openssl pkcs12 -export -in newcerts/04.pem -inkey private/04.pem -certfile cacert.pem -out yone.p12
Enter pass phrase for private/04.pem:クライアント証明書のプライベートキー用のパスフレーズを入力
Enter Export Password:ユーザが証明書を取り込む時のパスワード
Verifying - Enter Export Password:ユーザが証明書を取り込む時のパスワード

6. PC へクライアント証明書をインストール

Internet Explorer へ登録する方法を紹介します。Mozilla Firefox 等の場合は、それぞれのソフトウェア内で証明書を登録してください。

  1. コントロールパネル の インターネットオプション を開きます
    • Internet Explorer から、ツール – インターネットオプション を選択しても同じです
  2. コンテンツ タブを開きます
  3. [証明書] ボタンを押下します
  4. [インポート(I)…] ボタンを押下します。ウィザード画面になります。
  5. インポートする証明書ファイル名は、yone.p12 を指定します
    • ファイルの種類は、Personal Information Exchange (*.pfx; *.p12) または 全てのファイル (*.*) を選んでください
  6. パスワードは、ユーザが証明書を取り込む時のパスワード を入力してください
  7. 証明書ストアは、個人 へ登録します
    • 証明書の種類に基づいて、自動的に証明書ストアを選択する にすれば OK です
  8. クライアント証明書と同時に、プライベート認証局の証明書もインストールします。前回の記事の PC へオレオレ認証局証明書をインポート をよぉく読んでインストールしてください。
  9. インポートが成功すると、下記の2つの証明書が追加されています。
    • 信頼されたルート証明機関タブ: example CA
    • 個人タブ: yone
個人の証明書

個人の証明書

7. 秘密のウェブページへアクセスしてみよう

実際に、ウェブサーバの認証設定を行ったページへアクセスしてみましょう。

Basic 認証ダイアログの代わりに、証明書の確認ダイアログが出ます。先ほどインポートしたクライアント証明書であることを確認して、OK を押下します。認証をパスすると、Basic 認証と同様、ブラウザを閉じるまでは証明書を再度選択することなく秘密のページへアクセスできます。

クライアント証明書の確認

クライアント証明書の確認

8. 証明書の破棄

クライアント証明書をインストールしたノートPCを紛失した、PCがウィルスに感染してPC内のファイルを抜かれているかもしれない、などなど、クライアント証明書を信用できなくなった場合はその証明書を破棄・無効にします。使う人は同じだけど、デスクトップPC・ノートPC・スマートフォンなどへ別々のクライアント証明書を発行している場合は、信頼できなくなった証明書のみを破棄すれば、他の証明書を使ったアクセスはそのまま使い続けられます。

  1. 破棄したい証明書のシリアルを探します
    • /etc/pki/exampleCA/index.txt を見ると、発行済み証明書の一覧を見られます
  2. 証明書を破棄します
# cd /etc/pki/exampleCA
# openssl ca -config openssl.cnf -revoke newcerts/(シリアル値).pem
  1. 証明書失効リストを更新します
# openssl ca -config openssl.cnf -gencrl -out crl.pem
# service httpd reload
  1. これで該当証明書は使えなくなりました

9. クライアント証明書の更新

クライアント証明書は有効期限を持っています。今回は 365日間有効で生成しているので、1年後に使えなくなります。

有効期限を更新する時は、下記のようにしてください。

  1. 新規にクライアント証明書を発行する
    • Common Name 等は、前回の証明書と同じ内容を入力してください
  2. ユーザは新しいクライアント証明書をインストールし、古いクライアント証明書を削除してください
  3. 古いクライアント証明書を破棄してください

10. SSL クライアント認証のすゝめ

駆け足ですが、SSL クライアント認証の構築方法を説明しました。SSL クライアント認証を使うと、Basic 認証 + HTTPS よりもセキュリティを高めることができます。すこぅし管理が面倒ですが、大事な大事な情報を外部からアクセスするページには、導入を是非検討してみてください。

(yone)

タグ: , , , , | 2016/08/26 更新 |

コメント

2件のコメント

  • ジート
    2015年8月11日 17:15

    ① どうやってクライアント証明書の確認ダイアログはできますか。
    ② 4番にSSL クライアント認証を使う場合は、どこにそのコードを書きますか。

    • webtech01
      2015年8月12日 14:18

      ジート様
      コメントありがとうございます。

      > クライアント証明書の確認ダイアログは どのように表示されますか

      「7. 秘密のウェブページへアクセスしてみよう」の画像が、ダイアログの表示例です。
      利用するブラウザにより、ダイアログの形式は異なりますが、おおむね同じような選択ダイアログになると思います。

      > 4番にSSL クライアント認証を使う場合は、どこにそのコードを書きますか。

      「4. ウェブサーバの認証設定」の説明は、既に Basic 認証 を利用しているものを SSL クライアント認証 へ置き換える場合の説明になります。’Require user’ 等、Basic 認証 の設定を行なっている個所をそれぞれ置き換えてください。
      新規に認証を行ないたい場合は、/etc/httpd/conf.d/ 内に任意のファイル名 (ただし、拡張子は .conf) で新規作成し、例示したような設定を記載してください。

2件のトラックバック

コメントはこちら