OpenVPN1(証明書)

Virtual Private Network(VPN)はクライアントPC(Windows)と自宅のUbuntuサーバ間に
暗号化されたトンネルを作成し、ファイル共有(Samba)、FTP、WebDAV、自宅のWebカメラの制御と監視、
VNC(リモートディスクトップ)など外から安全に遠隔操作できるようになります。
【VPN】
VPNの種類としてPPTP、Ipsec、SSL-VPNなどがあります。
今回は手軽で無料でできるOpenVPNを構築します。
秘密鍵、公開鍵証明書、ユーザ名、パスワードを使ってクライアントとサーバの相互認証を行います。

【通信方式】
●ルーティング方式とブリッジ方式があります。
ブリッジ方式は仮想ブリッジを作成してあたかも自宅のLAN内にいる状態になり、ホスト間で直接通信が可能になります。
tapデバイスを使用します。
●ルーティング方式は自宅のUbuntuサーバとは別のネットワークを構築して接続できるのはUbuntサーバで
ホスト間の直接通信はできません。
(ホスト間の通信はOpenVPNサーバでルーティングを設定する必要がある。)
tunデバイスを使用します。

ブリッジ方式のが便利なのですが仮想ブリッジの作成が面倒ではあります。
実際にブリッジ方式も確認しましたがある不具合?を確認しました。
ブリッジ方式だと自宅LAN内で映像などのコンテンツを再生しますと音声がとぎれたり、音ヅレが発生してしまいました。
(特にTV REGZAの地デジコンテンツの再生は無理そうです。)
ルーティング方式を選択します。

【仮想デバイス】
ネットワークインターフェイス(LANアダプタ、LANカード)を仮想的に構築します。
2種類のtun/tap仮想ネットワークインターフェイスがあり、
tunデバイスはレイヤー3でトンネリング(カプセル化)を行う。
tapデバイスはレイヤー2でトンネリング(カプセル化)を行う。

【OpenVPN JP日本語情報サイト】 http://www.openvpn.jp/
【OpenVPN公式サイト】 http://openvpn.net/
【参考サイト】
・OpenVPNで手軽にVPN構築
http://www.atmarkit.co.jp/flinux/special/openvpn/openvpna.html
・OpenVPNでハブ直結
http://nai.homelinux.net/openvpn.html
・OpenVPNで構築するリモートアクセス環境
http://www.stackasterisk.jp/tech/systemConstruction/openVpn01_01.jsp

【使用環境】
サーバー   Ubuntu9.10
通信方式   ルーティング方式
仮想デバイス tun
プロトコル   UDP
port 1194     任意(30000~50000~代)に変更してもよい。
サブネット 192.168.0.0 / 255.255.255.0 (←適宜、自分のネットワーク環境に合わせます。)
クライアントPC ネットブック(WindowsXP home SP3)
通信端末はWillcomのPHSやイー・モバイルで問題ありませんでした。
速度はなるべく速いほうがいいのでしょうが、、、

インストール
OpenVPNのアプリは一つでありサーバ、クライアントの区別はなく設定によってモードが変わる。
端末より管理者になる。
# apt-get update
# apt-get install openvpn

【各証明書・秘密鍵の作成】(※以下の作業はいっきに行います。)
varsファイルを編集する。
【/usr/share/doc/openvpn/examples/easy-rsa】
easy-rsaのフォルダを/etc/openvpn へコピーする。

# cp -R /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn

# cd /etc/openvpn/easy-rsa

1.0と2.0がありましたのでVer2.0の方を使用します。
# cd 2.0

【/etc/openvpn/easy-rsa/2.0/vars】ファイルを編集する。

【53行目】export KEY_SIZE=1024   【確認】暗号深度をあげたい場合は2048へ変更 RSA鍵を強化する。 >その分処理時間がかかる
DH(Diffie-Hellman)パラメーターの作成時間もかかるので1024 ディフォルト値1024で十分かなぁ

【64行目】export KEY_COUNTRY=”JP” 【変更】 例 “JP” 日本
【65行目】export KEY_PROVINCE=”Tokyo” 【変更】 例 “Tokyo” 東京
【66行目】export KEY_CITY=”Minatoku” 【変更】 例 “Minatoku” 港区
【67行目】export KEY_ORG=”Monta ” 【変更】 例 “Monta“ 団体名もんた
【68行目】export KEY_EMAIL=”root@abc.com” 【変更】 例 “ root@abc.com”  メールアドレス

認証局(Ca)証明書の作成
# cd /etc/openvpn/easy-rsa/2.0
# . ./vars

# ./clean-all

# ./build-ca

Generating a 1024 bit RSA private key
…………+++
……………………………………………………………………………………….+++
writing new private key to ‘ca.key’
—–
途中省略
—–
Country Name (2 letter code) [JP]: Enterキー
State or Province Name (full name) [Tokyo]: Enterキー
Locality Name (eg, city) [Minatoku]: Enterキー
Organization Name (eg, company) [Monta]:   Enterキー
Organizational Unit Name (eg, section) []: Enterキー
Common Name (eg, your name or your server’s hostname) [Phantom CA]:OPEN_VPN-CA 【←任意に入力】
Email Address [root@abc.com]: Enterキー

# cd keys
Ca証明書と秘密鍵が生成されている。
-rw-r–r– 1 root root 1545 2009-09-22 16:04 ca.crt 【Ca証明書】
-rw——- 1 root root 1675 2009-09-22 16:04 ca.key 【Ca秘密鍵】

サーバ証明書の作成
/etc/openvpn/easy-rsa/2.0# ./build-key-server server 【パラメータはserverを使用する。】
Generating a 1024 bit RSA private key
………………………………………………………………………………………………………………………+++
………..+++
writing new private key to ‘server.key’
—–
途中省略
—–
Country Name (2 letter code) [JP]:          Enterキー
State or Province Name (full name) [Tokyo]:    Enterキー
Locality Name (eg, city) [Minatoku]:          Enterキー
Organization Name (eg, company) [Monta]:     Enterキー
Organizational Unit Name (eg, section) []:      Enterキー
Common Name (eg, your name or your server’s hostname) [server]:VPN-SERVER 【←任意に入力】
Email Address [root@abc.com]: 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/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
countryName :PRINTABLE:’JP’
stateOrProvinceName :PRINTABLE:’Tokyo’
localityName :PRINTABLE:’Minatoku’
organizationName :PRINTABLE:’Phantom’
commonName :PRINTABLE:’VPN-SERVER’
emailAddress :IA5STRING:’root@abc.com’
Certificate is to be certified until Sep 20 07:28:58 2019 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

# cd keys
-rw-r–r– 1 root root 5209 2009-09-22 16:29 server.crt 【サーバー証明書】
-rw-r–r– 1 root root 1021 2009-09-22 16:28 server.csr
-rw——- 1 root root 1675 2009-09-22 16:28 server.key 【サーバー秘密鍵】

DH(Diffie-Hellman)パラメーターの作成
(RFC2539準拠)
安全でない通信経路上で、鍵交換を行うためのアルゴリズム

/etc/openvpn/easy-rsa/2.0# ./build-dh
しばらく待ちます。
(Atom CPU 330 で数分かかります。)

# cd keys
-rw-r–r– 1 root root 424 2009-09-22 18:36 dh1024.pem 【DHパラメータ】

クライアント証明書の作成
クライアント(clientA)の数だけ作成する必要があります。

/etc/openvpn/easy-rsa/2.0# ./build-key-pass clientA
Generating a 1024 bit RSA private key
………….+++
.+++
writing new private key to ‘clientA.key’
Enter PEM pass phrase: 【****** パスフレーズを入力】
Verifying – Enter PEM pass phrase: 【****** パスフレーズを入力】
—–
途中省略
—–
Country Name (2 letter code) [JP]:            Enterキー
State or Province Name (full name) [Tokyo]:      Enterキー
Locality Name (eg, city) [Minatoku]:            Enterキー
Organization Name (eg, company) [Monta]:       Enterキー
Organizational Unit Name (eg, section) []:        Enterキー
Common Name (eg, your name or your server’s hostname) [clientA]: Enterキー
Email Address [root@abc.com]:              Enterキー

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:                Enterキー 【クライアントPCでVPN起動時にパスワードをかけたい時】
An optional company name []:             Enterキー
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
countryName :PRINTABLE:’JP’
stateOrProvinceName :PRINTABLE:’Tokyo’
localityName :PRINTABLE:’Minatoku’
organizationName :PRINTABLE:’Monta’
commonName :PRINTABLE:’clientA’
emailAddress :IA5STRING:’root@abc.com’
Certificate is to be certified until Sep 20 10:47:07 2019 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

# cd keys
-rw-r–r– 1 root root 5079 2009-09-22 19:47 clientA.crt 【クライアント証明書】
-rw-r–r– 1 root root 1013 2009-09-22 19:47 clientA.csr
-rw——- 1 root root 1751 2009-09-22 19:47 clientA.key 【クライアント秘密鍵】

生成物の一覧 設置先 重要度
【サーバ】
Ca証明書 ca.crt サーバ/クライアント なし
Ca秘密鍵 ca.key サーバ 秘密
サーバー証明書 server.crt サーバ なし
サーバー秘密鍵 server.key サーバ 秘密
Dhパラメータ dh1024.pem サーバ なし
【クライアント】
クライアント証明書 clientA.crt クライアント なし
クライアント秘密鍵 clientA.key クライアント 秘密

※ca.crt、 clientA.crt、 clientA.key はクライアントへコピーする。
clientA.keyが権限でコピーできないので

# chmod +r clientA.key

WinSCPやUSBメモリでクライアントPCへ安全にコピーする。

クライアントの証明書を廃止する
クライアントPCの証明書の情報が漏れた場合
すぐにその証明書をリボーク(無効)する。
Linuxの場合
# cd /etc/openvpn/easy-rsa/2.0
# . ./vars
# ./revoke-full クライアント名(例ClientB)

/etc/openvpn/easy-rsa/2.0/keysにcrl.pem 証明書廃止リストができる。

server.confと同じ場所にcrl.pemをコピーする。
# cp /etc/openvpn/easy-rsa/2.0/keys/crl.pem /etc/openvpn

証明書廃止リストを監視するようにserver.conf に一行追加する。

Crl-verify crl.pem  【追加】