freeradius 0.9.3 & openssl 0.9.7dで802.1x EAP-TLS認証なるものを...(解説編)

前準備

opensslのインストール

インストールぐらいは自力でやってくれたまへ。
(注) Vine Linux 3.0 であれば openssl 0.9.7d がインストールされているため、インストール作業は不要です。

freeradiusのインストール

インストールぐらいは自力でやってくれたまへ。
(注) Vine Linux 3.0 でのfreeradius RPM作成方法をまとめています。(2004.09.19)

無線ルータ(もしくはアクセスポイント)の設定

機種に依るので自力でやってくれたまへ。

接続するクライアントの設定

ネットワーク設定は、LANカードのメーカーによって異なるので自力でやってくれたまへ。

ちなみに、接続するクライアントOSはWindows XPをターゲットとしている。マイクロソフト社のWPAサポート修正プログラムをダウンロードしてインストールしておくと幸せになるかもしれない。

/usr/local/ssl/xpextensions の新規作成

以下の内容でファイルを新規作成する。

[ xpclient_ext ]
extendedKeyUsage = 1.3.6.1.5.5.7.3.2

[ xpserver_ext ]
extendedKeyUsage = 1.3.6.1.5.5.7.3.1

認証機関(CA)の設立

認証機関の秘密鍵および証明書の作成

これからの操作で必要となるディレクトリ、ファイルを作成する。なお、openssl.cnf の[ CA_default ].dir の値を変更した場合、`demoCA' ではなく指定したディレクトリに読み替えること。

# cd /usr/local/ssl
# mkdir demoCA
# mkdir demoCA/certs
# mkdir demoCA/crl
# mkdir demoCA/newcerts
# mkdir demoCA/private
# echo "01" > demoCA/serial
# touch demoCA/index.txt

CAの秘密鍵および証明書を作成する。

# openssl req -new -x509 -keyout demoCA/private/cakey.pem -out demoCA/cacert.pem -days 730

コマンドを実行するとパスフレーズの入力を求められる。このパスフレーズは秘密鍵にアクセスする際に必要となる。

Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:

続いて、署名情報の入力となる。

-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:ORG3.NET
Organizational Unit Name (eg, section) []:ORG3.NET CA
Common Name (eg, your name or your server's hostname) []:ORG3.NET Certification Authority
Email Address []:
#

CAの秘密鍵のパーミッションは 400 に更新しておくこと。

# chmod 400 demoCA/private/cakey.pem

認証機関(CA)のルート証明書の作成

IE等で信頼されたルート証明機関を登録する際に使用するルート証明書を作成する。

# openssl x509 -inform PEM -outform DER -in demoCA/cacert.pem -out root.der

サーバ証明書の作成

freeradiusをdaemonとして起動するサーバの署名済み証明書を作成する。

サーバ証明書(署名リクエスト)の作成

# openssl req -new -keyout srv.pem -out srv-csr.pem -days 730

コマンドを実行するとパスフレーズの入力を求められる。このパスフレーズは秘密鍵にアクセスする際に必要となる。

Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:

続いて、署名情報の入力である。

-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:ORG3.NET
Organizational Unit Name (eg, section) []:ORG3.NET CA
Common Name (eg, your name or your server's hostname) []:ca.org3.net
Email Address []:ca@org3.net

最後にチャレンジパスワードを設定する。これはSSLのCLIENT-CERT認証の際、サーバに対して送られるパスワードとなるが、今回は使用しないため未入力のままでも問題ない。同じく、`An optional company name'も未入力のままでかまわない。

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

認証機関によるサーバ証明書への署名

# openssl ca -policy policy_anything -extensions xpserver_ext -extfile xpextensions -in srv-csr.pem -out srv-cert.pem

コマンドを実行すると、認証機関の秘密鍵へアクセスするためのパスフレーズを求められる。

Enter pass phrase for ./demoCA/private/cakey.pem:

パスフレーズが正しく入力されると、以下のようにクライアントの署名内容が表示され、署名を行うかどうかの確認が求める。yを入力すると、認証機関署名済み証明書が作成される。

Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)

        Validity
            Not Before: Aug 21 10:50:19 2004 GMT
            Not After : Aug 21 10:50:19 2006 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = ORG3.NET
            organizationalUnitName    = ORG3.NET CA
            commonName                = ca.org3.net
            emailAddress              = ca@org3.net
        X509v3 extensions:
            X509v3 Extended Key Usage:
                TLS Web Server Authentication
Certificate is to be certified until Aug 21 10:50:19 2006 GMT (730 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
#

クライアント証明書の作成

この操作は必要となるクライアント証明書毎に行う必要がある。

クライアント証明書(署名リクエスト)の作成

# export user=test
# openssl req -new -keyout ${user}.pem -out ${user}-csr.pem -days 730

コマンドを実行するとパスフレーズの入力を求められる。このパスフレーズは秘密鍵にアクセスする際に必要となる。

Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:

続いて、署名情報の入力である。

-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:ORG3.NET
Organizational Unit Name (eg, section) []:ORG3.NET CA
Common Name (eg, your name or your server's hostname) []:TEST Taro
Email Address []:test@org3.net

最後にチャレンジパスワードを設定する。これはSSLのCLIENT-CERT認証の際、サーバに対して送られるパスワードとなるが、今回は使用しないため未入力のままでも問題ない。同じく、`An optional company name'も未入力のままでかまわない。

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

認証機関によるクライアント証明書への署名

# openssl ca -policy policy_anything -extensions xpclient_ext -extfile xpextensions -in ${user}-csr.pem -out ${user}-cert.pem

コマンドを実行すると、認証機関の秘密鍵へアクセスするためのパスフレーズを求められる。

Enter pass phrase for ./demoCA/private/cakey.pem:

パスフレーズが正しく入力されると、以下のようにクライアントの署名内容が表示され、署名を行うかどうかの確認が求める。yを入力すると、認証機関署名済み証明書が作成される。

Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 4 (0x4)
        Validity
            Not Before: Aug 21 17:01:46 2004 GMT
            Not After : Aug 21 17:01:46 2006 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = ORG3.NET
            organizationalUnitName    = ORG3.NET CA
            commonName                = TEST Taro
            emailAddress              = test@org3.net
        X509v3 extensions:
            X509v3 Extended Key Usage:
                TLS Web Client Authentication
Certificate is to be certified until Aug 21 17:01:46 2006 GMT (730 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
#

認証機関署名済み証明書のフォーマット変換

IE等に読み込み可能なフォーマットである PKCS#12 に変換する。PKCS#12は証明書と秘密鍵の両方を保持するフォーマットである。PKCS#12は複数の証明書を含めることができるため、ここでは認証機関の証明書も含めて作成しておく。こうすることで、認証機関のルート証明書 root.der を作成/インポートせずともこのPKCS#12ファイルのみで認証機関のルート証明書およびクライアント証明書の両証明書をインポートすることが可能となる。

# openssl pkcs12 -export -in ${user}-cert.pem -inkey ${user}.pem -certfile demoCA/cacert.pem -out ${user}.p12

クライアント証明書の秘密鍵にアクセスするために必要となるパスフレーズを求められる。

Enter pass phrase for ${user}.pem:

パスフレーズを入力すると、IE等でインポートする際に必要となるパスワードの入力を求められる。

Enter Export Password:
Verifying - Enter Export Password:

クライアント証明書の作成は以上で完了である。

各種ファイルへの反映

Diffie-Hellmanパラメータの作成

# cd /usr/local/ssl
# openssl dhparam -out dh2048.pem 2048

ファイルができあがるまでに30分程度かかります。

必要最低限のファイルをコピー

# mkdir /etc/802.1x
# cd /etc/802.1x
# cp /usr/local/ssl/demoCA/cacert.pem ./cacert.pem
# cp /usr/local/ssl/srv-cert.pem ./srv-cert.pem
# cp /usr/local/ssl/srv.pem ./srv.pem
# cp /usr/local/ssl/dh2048.pem ./dh2048.pem
# openssl md5 * > ./random
# chown radiusd.radiusd ./*
# chmod 400 ./*

md5ハッシュの出力結果をrandamとして取り扱っています。radiusd.confで /dev/randam を指定すると正常に動作しないためです。あくまでも、暫定対処ですから今後見直さないとダメですね...

/etc/raddb/radiusd.conf の修正

以下のように変更する。

                tls {
                        private_key_password = "${サーバ証明書の秘密鍵のパスフレーズ}"
                        private_key_file = /etc/802.1x/srv.pem
                        certificate_file = /etc/802.1x/srv-cert.pem
                        CA_file = /etc/802.1x/cacert.pem
                        dh_file = /etc/802.1x/dh2048.pem
                        random_file = /etc/802.1x/random

/etc/raddb/clients.conf への追加

ここで指定するIPアドレス、およびsecret に指定する文字列は無線ルータ(もしくは無線アクセスポイント)側での指定と同一とすること。shortname は識別できれば何でもよい。

client 192.168.0.xxx {
        secret          = ${無線ルータに設定したパスワード}
        shortname       = wlbarag
}

/etc/raddb/users への追加

認証を求めてくるクライアント毎にその認証タイプを設定する。ここでは EAP/TLS を使用するので EAP となる。この指定はクライアント毎に必要となる。

"TEST Taro" Auth-Type := EAP

/etc/rc.d/init.d/radiusd への追加

Vine Linux 2.6 に openssl 0.9.7d をインストールしたため、以下を追加する必要がある。
(注) Vine Linux 3.0 であれば この設定は不要です。

export LD_PRELOAD=/usr/local/ssl/lib/libcrypto.so:/usr/local/ssl/lib/libssl.so

freeradius の起動

/etc/rc.d/init.d/radius start

めでたく起動完了。

追記(random_fileについて)

/etc/raddb/radiusd.conf の修正において、'random_file = /etc/802.1x/random'としているが、これを'random_file = /dev/urandom'に変更することでエラーは発生しなくなる。これにより /etc/802.1x/random ファイルは作成不要となる。