【Zabbix/Openssl】クライアント証明書を利用してZabbixサーバへセキュアなアクセス 

# 前提条件
Zabbixサーバがインストールされていること。

# 環境
CentOS 6.5：Zabbixサーバ
Windows7：クライアント端末

インストール済みパッケージ：
mod_ssl-2.2.15-47.el6.centos.x86_64
openssl-1.0.1e-42.el6.x86_64
openssl-devel-1.0.1e-42.el6.x86_64

入っていない場合は、yumでインストールしておこう。

# サーバ証明書の作成
まずは、サーバ証明書を作成して、httpsでZabbixサーバへアクセスできるようにします。この時点ではクライアント認証はしません。

```

秘密鍵を作成。パスフレーズは任意でＯＫです。

# openssl genrsa -des3 -out server.key.secure 2048
Generating RSA private key, 2048 bit long modulus
........................+++

# openssl rsa -in server.key.secure -out server.key
Enter pass phrase for server.key.secure:
writing RSA key

作成されていることを確認。

# ls -ltr
total 8
-rw-r--r-- 1 root root 1751 Nov  8 22:25 server.key.secure
-rw-r--r-- 1 root root 1679 Nov  8 22:26 server.key

セキュリティ上の理由から、秘密鍵のパーミッションは「400」としておこう。

# chmod 400 server.key

CSR作成

# openssl req -new -key server.key -out server.csr
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) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Shinagawaku
Organization Name (eg, company) [Default Company Ltd]:Test.co.jp
Organizational Unit Name (eg, section) []:Test.col.jp
Common Name (eg, your name or your server's hostname) []:Test.co.jp
Email Address []:

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

サーバ証明書を作成

# openssl x509 -in server.csr -out server.pem -req -sig nkey server.key -days 365
Signature ok
subject=/C=JP/ST=Tokyo/L=Shinagawaku\x08\x08/O=Test.co.jp/OU=Test.col\x08.jp/CN=Test.co.jp
Getting Private key

Apacheの設定ファイルを修正。
※ssl.confがhttpd.conf内でIncludeされていることが前提です。デフォルトでは、Includeされています。

vi /etc/httpd/conf.d/ssl.conf

以下の箇所を、作成したサーバ証明書(CertificateFile)と秘密鍵(CertificateKeyFile)を指定します。

SSLCertificateFile /root/work/server.pem
SSLCertificateKeyFile /root/work/server.key

Apacheを再起動。

# service httpd restart
Stopping httpd: [  OK  ]
Starting httpd: [  OK  ]

```
Zabbixへアクセスしてください。以下の画面が表示されますが、「このサイトの閲覧を続行する(推奨されません)。」を選択して進んでください。

![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/98996/ff88747e-9ddd-bf49-75da-e6d0bcc0d7f1.jpeg)

ログイン画面が表示されます。正規の証明書ではないので、証明書エラーが出ていますが、SSL通信はできています。

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/98996/95449dd6-33c7-db34-9ad6-f1e52df6e023.jpeg)

「証明書をエラー」-「証明書を表示」をクリックすると、証明書が表示されます。

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/98996/493ca8d4-7008-a399-c7b5-5d3f073a6108.jpeg)

作成したサーバ証明書の情報と間違いがないか、確認してください。これでサーバ証明書のインストールは完了です。

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

```

クライアント証明書を作成します。秘密鍵の作成。

# openssl genrsa -out client.key 2048
Generating RSA private key, 2048 bit long modulus
......+++
..........................+

CSRを作成。

[root@v157-7-131-58 client]# openssl req -new -key client.key -cliout client.csr
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) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Shinagawaku
Organization Name (eg, company) [Default Company Ltd]:Test2
Organizational Unit Name (eg, section) []:Test2
Common Name (eg, your name or your server's hostname) []:Test2
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate req

サーバ証明書を作成。

# openssl x509 -in client.scsr -out client-ca.crt -req  -signkey client.key -days 360
Signature ok
subject=/C=JP/ST=Tokyo/L=Shinagawaku/O=T\x08\x1B[C\x08\x1B[Cest2/OU=Test2/CN=Test2
Getting Private key

証明書と秘密鍵のペアをexport。パスワードは任意(インストールするときに入力を求められる)。

# openssl pkcs12 -export -inkey client.key -in client -ca.crt  -out client.p12 -name "test2"
Enter Export Password:
Verifying - Enter Export Password:

作成されていることを確認。

# ls -ltr
total 16
-rw-r--r-- 1 root root 1679 Nov  9 06:25 client.key
-rw-r--r-- 1 root root 1009 Nov  9 06:26 client.csr
-rw-r--r-- 1 root root 1212 Nov  9 06:26 client-ca.crt
-rw-r--r-- 1 root root 2512 Nov  9 06:27 client.p12

Apacheの設定ファイル(ssl.conf)を修正して、再起動します。
クライアント認証を必須(VerifyClient)とするのと、クライアント証明書を指定(SSLCACertificateFile)します。

SSLVerifyClient require
SSLCACertificateFile /root/work/client/client-ca.crt

# service httpd restart

これで、サーバ側の設定は完了です。

```

# 証明書のインポート
ここからは、端末側(Windows7)での設定となります。
IEで証明書のインポートの実施方法を説明します。基本的には流れにそっていくだけで大丈夫です。
まずは、作成したクライアント証明書(client.p12)をダウンロードし、デスクトップにおいて証明書をダブルクリック。

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/98996/ddbe1baa-debe-cf40-d5f9-4f17f3fef5cc.jpeg)

案内に沿ってインストール。

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/98996/51f535a1-8b0e-7f41-fe13-fedb654668dc.jpeg)

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/98996/f97bfc0b-79a5-a18a-ba06-f132c6eb86d3.jpeg)

設定したパスワードを入力。

![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/98996/459d44cd-a985-01ac-02b5-c0710853265a.jpeg)

証明書ストアは、「個人」に置くのがいいでしょう。

![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/98996/d4ae32c3-af61-89cf-9088-aae2a7111c11.jpeg)

![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/98996/a1c20b7c-f66d-c860-81c2-a982c87fd549.jpeg)

完了。IEで「インターネットオプション」-「コンテンツ」-「証明書」を選択すると、証明書がインストールされていることが確認できます。

![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/98996/7c3af176-3691-9a25-910a-1fc4d8beaaae.jpeg)

## Zabbixサーバへのアクセス。
Zabbixサーバへアクセスすると、クライアント証明書の利用が表示されます。
「OK」を押せば次に進み、ログインができるようになります。

![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/98996/22626089-1dcb-15a9-c2ab-0eeb24db7e53.jpeg)

なお、クライアント証明書が入っていないと、以下のような画面が表示されます。

![WS000016.jpg](https://qiita-image-store.s3.amazonaws.com/0/98996/62e56b6e-92ff-5b5f-06e5-fb8dd9a75f3b.jpeg)

# スマホへクライアント証明書を導入（が、うまくいかず）。
スマホにクライアント証明書をインストールします。これはスマホに依存するので、あくまで参考程度にしてください。私のスマホはXperiaです。
「設定」-「セキュリティ」-「内部ストレージかSDカードからインストール」を選択します。

![1447014576123.jpg](https://qiita-image-store.s3.amazonaws.com/0/98996/61ae5b90-c13a-af79-750b-830c481569b1.jpeg)

ダウンロードした証明書ファイルを選択します。

![1447014586180.jpg](https://qiita-image-store.s3.amazonaws.com/0/98996/6c901023-83cd-8a48-43df-f97145b13d9f.jpeg)

パスワードを入力します。

![1447014612482.jpg](https://qiita-image-store.s3.amazonaws.com/0/98996/5f2e0130-7837-05f6-41c9-80315c784213.jpeg)

証明書名を入力します。

![1447014626732.jpg](https://qiita-image-store.s3.amazonaws.com/0/98996/bda654ab-d84c-2050-df4b-31856e84e6cf.jpeg)

が、「信頼できる認証情報」を確認しても、証明書が確認できない。アプリ(AndZabbixLite)でアクセスしても、当然エラーが表示される。

![1447013241023.jpg](https://qiita-image-store.s3.amazonaws.com/0/98996/83ed6449-e7fa-2ebd-4a0c-5bae1994a592.jpeg)

# 今後の課題
スマホへのクライアント証明書の導入し、アプリ(AndZabbixLite)でアクセス。