FreeradiusとHostapdでWi-Fi接続端末の証明書認証を行う。

FreeradiusとHostapdでWi-Fi接続端末の証明書認証を行う。

オレオレの証明書を使って簡易的にwi-fiの端末認証機能を作る。

参考にしたサイト
http://yasu-2.blogspot.jp/2010/02/debian-lennyhostapdfreeradiuseap-tls.html http://www.freesoftwaremagazine.com/articles/howto_incremental_setup_freeradius_server_eap_authentications

証明書の発行にはOpenSSLを使用する。OpenSSLはコマンドオプションが多くて覚えるのは大変だが、キーペアや証明書を簡単に作成してくれるので非常に便利でだった。
証明書を作成する前にまずはFreeRadiusとHostapdの環境構築をする。本来ならば、Radiusサーバ、CA認証局、APは別々のサーバで動くが、今回は面倒なのですべて一緒のサーバで動かす。

各種インストール

FreeRadiusもhostapdもapt-getやyumでインストール可能。今回はついでにfreeradius-mysqlもインストールし、mysqlによるユーザ管理を可能にする。

# apt-get install freeradius freeradius-mysql hostapd openssl

これで完了。

証明書の作成

まずは認証局の準備をする。
以下のようにCA.shのスクリプトを回す。現在のディレクトリの配下に、勝手にdemoCAというディレクトリが作成され、証明書作成に必要なファイルを生成してくれる。途中で何回か個人情報を聞かれるので、下の例を参考に適当に入力する。

root@ubuntu:# /usr/lib/ssl/misc/CA.sh -newca
CA certificate filename (or enter to create) ← Enterのみ入力

Making CA certificate ...
Generating a 2048 bit RSA private key
...................................+++
....................................+++
writing new private key to './demoCA/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) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Meguro
Organization Name (eg, company) [Internet Widgits Pty Ltd]:PPP
Organizational Unit Name (eg, section) []:test

Common Name (e.g. server FQDN or YOUR name) []:nametes
Email Address []:ppp@gmail.com

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 /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/./cakey.pem: [先ほどのパスワードを入力]
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 12891016871502196922 (0xb2e6178b8b74b0ba)
        Validity
            Not Before: Jul 11 05:04:36 2016 GMT
            Not After : Jul 11 05:04:36 2019 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Tokyo
            organizationName          = PPP
            organizationalUnitName    = testuser
            commonName                = nametes
            emailAddress              = ppp@gmail.com
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                79:3E:D8:65:08:CE:48:1F:FB:E4:64:AD:12:48:E7:A9:59:F4:AD:74
            X509v3 Authority Key Identifier:
                keyid:79:3E:D8:65:08:CE:48:1F:FB:E4:64:AD:12:48:E7:A9:59:F4:AD:74

            X509v3 Basic Constraints:
                CA:TRUE
Certificate is to be certified until Jul 11 05:04:36 2019 GMT (1095 days)

Write out database with 1 new entries
Data Base Updated

root@ubuntu:~# ls
demoCA

サーバ用の鍵の作成

以下のコマンドでサーバ用の鍵の作成を行う。

root@ubuntu:~# openssl req -new -nodes -keyout newkey.pem -out newreq.pem -days 365
root@ubuntu:~# openssl ca -policy policy_anything -out newcert.pem  -infiles newreq.pem

他のサイトによると、WindowsXPをclientとして使う場合は追加のオプションがいるらしい。(今回はやらない)
詳しくはこちらhttp://yasu-2.blogspot.jp/2010/02/debian-lennyhostapdfreeradiuseap-tls.html
これでサーバ用のnewkey.pem(秘密鍵)とnewcert.pem(公開鍵)のペアが作成できる。
この鍵は後に作成するクライアント用のキーペアとごっちゃにならないよう、別のディレクトリに保管しておく。

root@ubuntu:~# mkdir wireless_server_keys
root@ubuntu:~# mv newcert.pem newkey.pem wireless_server_keys/
root@ubuntu:~# cp demoCA/cacert.pem wireless_server_keys/

さらに、freeradiusの設定をする際に、このサーバ用の鍵を使うので、/etc/freeradius/certs/フォルダの下にファイルをコピーしておく。

root@ubuntu:~# cp newcert.pem newkey.pem /etc/freeradius/certs/
root@ubuntu:~# cp demoCA/cacert.pem /etc/freeradius/certs/

残った"newreq.pem"(認証要求用のファイル)はいらないので削除しておく。

root@ubuntu:~# rm newreq.pem

クライアント用の鍵の作成

クライアント用の鍵を作成する。

root@ubuntu:~# openssl req -new -nodes -keyout newkey.pem -out newreq.pem -days 365
root@ubuntu:~# openssl ca -policy policy_anything -out newcert.pem  -infiles newreq.pem
root@ubuntu:~# openssl pkcs12 -in newcert.pem -inkey newkey.pem -certfile ./demoCA/cacert.pem -out newcert.p12 -export -name "My Certificate"

※CA.shを回したときと同様に、何回か情報を入力するが、このときに"Organizational Unit Name"はそのままcliantのユーザ名になるため、クライアントごとに固有のものを入力しておくのがよい。 最後のコマンドでは作成したclient用キーペアからwindowsに埋め込むための証明書を作っている。 このときに

Certificate Details:
(略)
Sign the certificate? [y/n]:y
failed to update database
TXT_DB error number 2

などのエラーが出たら、以下のコマンドでCAに対する証明書要求を一旦無効化することで解決する。

root@ubuntu:~# openssl ca -revoke demoCA/newcerts/XXXXXXXXXXXXX.pem

FreeRadiusの設定

freeradiusの設定ファイルの中でも今回はusers,eap.confの設定を変更する。 usersファイルの最終行にアクセスを許可するユーザ(testuser)とパスワード(password)を追加する。

# cd /etc/freeradius
# cat users
     ......
     ......
     ......
     testuser Cleartext-Password := "password"

また、今回はEAP-TLSによる認証を行うので、さらにeap.confの設定を追加する。
以下の項目が設定を変更した箇所である。

default_eap_type = tls
certdir = ${confdir}/certs
cadir = ${confdir}/certs
private_key_password = [サーバ用キーペア作成時に入力したパスワード]
private_key_file = ${certdir}/newkey.pem
certificate_file = ${certdir}/newcert.pem
CA_file = ${cadir}/cacert.pem
dh_file = ${certdir}/dh

Hostapdの設定

hostapdではhostapd.confの設定を変更する。 認証に関係しているのは以下の部分なので、これらを変更する。

ieee8021x=1
eapol_version=1
eapol_key_index_workaround=1
eap_reauth_period=3600
use_pae_group_addr=0
eap_server=0
own_ip_addr=127.0.0.1
radius_client_addr=127.0.0.1
auth_server_addr=127.0.0.1
auth_server_port=1812
auth_server_shared_secret=testing123
acct_server_addr=127.0.0.1
acct_server_port=1813
acct_server_shared_secret=testing123
radius_retry_primary_interval=600
radius_acct_interim_interval=600
wpa=1
wpa_key_mgmt=WPA-EAP
wpa_pairwise=TKIP

今回はhostapdもfreeradiusも同じサーバで動いているため、アドレスはすべてローカルIPである。
暗号化方式等は自由に選択してよい。