Opensourcetechブログ

OpensourcetechによるNGINX/Kubernetes/Zabbix/Neo4j/Linuxなどオープンソース技術に関するブログです。

Nginx 1.7.8におけるSSLクライアント認証 & 2014年のNginxを振り返る

こんにちは、鯨井貴博@opensourcetechです。

 

今回は、Qiita nginx advent calenderの12/25を兼ねた記事となります。

 

以下のような構成を作ってみようと思います。

※他の方のように、ソースコードなどバリバリとはいかないので、

 画像等でカバーしていこうと思います。

-------

クライアント(各種ブラウザ)

   ↑

  https&SSLクライアント認証

   ↓

Nginx1.7.8(Webサーバ) on CentOS6.6(64bits)

 

 

CAの構築

OpenSSLのインストール

yumでサクッと関連パッケージも含めてインストールします。

yum install openssl*

f:id:opensourcetech:20141219133323p:plain

f:id:opensourcetech:20141219133334p:plain

 

続いてCAの構築。

CAスクリプト(この例では、/etc/pki/tls/misc配下のCA.pl)を実施し、CAを作成します。

/etc/pki/tls/misc/CA.pl -newca

 

作成した結果、秘密鍵であるcakey.pemと公開鍵(証明書)であるcacert.pemが生成されます。

f:id:opensourcetech:20141219133340p:plain

f:id:opensourcetech:20141219133344p:plain

f:id:opensourcetech:20141219133358p:plain

 

サーバ証明書・秘密鍵の生成

サーバ用の証明書(公開鍵)及び秘密鍵を/usr/local/ssl/selfSSLに作成します。

mkdir /usr/local/ssl/selfSSL

openssl genrsa -out /usr/local/ssl/selfSSL/server.key 2048(秘密鍵生成)

f:id:opensourcetech:20141219133404p:plain

openssl req -new /usr/local/ssl/selfSSL/server.key -out /usr/local/ssl/selfSSL/server.csr

(CSRの生成)

f:id:opensourcetech:20141219133408p:plain

openssl ca -in server.csr -out server.crt -keyfile /etc/pki/CA/private/cakey.pem

(CSRへの署名→公開鍵の生成)

f:id:opensourcetech:20141219133413p:plain

 

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

続いて、クライアント証明書を作成します。

openssl genrsa -out client.key 2048(秘密鍵の生成)

openssl req -new client.key -out client.csr(CSRの生成)

f:id:opensourcetech:20141219133419p:plain

openssl ca -cert /etc/pki/CA/cacert.pem -keyfile /etc/pki/CA/private/cakey.pem -in client.csr -outdir /usr.local/ssl/clientSSL -out client.crt

(CSRへの署名→公開鍵の生成)

f:id:opensourcetech:20141219133423p:plain

続いて、クライアント側で利用出来るように、秘密鍵と公開鍵を合わせたpksc12形式へ変換します。

openssl pksc12 -export -clcerts -inkey client.key -in client.crt -out client.p12

 

なお、ここでクライアントへインポートする際に使用するパスワードを設定しますので、忘れないようにしてください。

f:id:opensourcetech:20141219133431p:plain

 

Nginx1.7.8のインストール

続いて、Nginxのインストールです。

ソースコードは、nginx.orgより取得します。

今回は現時点において最新の1.7.8です。

cd /usr/local/src

wget http://nginx.org/download/nginx-1.7.8.tar.gz

f:id:opensourcetech:20141219133447p:plain

tar zxvf nginx-1.7.8.tar.gz

f:id:opensourcetech:20141219133454p:plain

f:id:opensourcetech:20141219133459p:plain

余談ですが、上記にはロシア語での変更履歴(CHANGES.ru)もあり、

ロシア語の勉強にもなります(笑)

f:id:opensourcetech:20141219133520p:plain

configureを実施する前に、configure時に必要となる各種パッケージを入手しておきます。(SSLやSPDYモジュールを使用する為に必要です)

yum -y install gcc zlib* pcre*

f:id:opensourcetech:20141219133508p:plain

そして、Standart HTTP modules以外のものを使用する場合、

以下のようにオプションを付けてconfigureを実施します。

(SSLやSPDYは、optional HTTP modulesになります)

./configure --with-http_ssl_module --with-http_spdy_module --with-http_auth_request_module

 

その他、モジュールについて知りたい方は、

Modules - Nginx Communityをご参照下さい。

f:id:opensourcetech:20141219133512p:plain

f:id:opensourcetech:20141219133516p:plain

そして、コンパイル&インストール

make

make install

f:id:opensourcetech:20141219133526p:plain

f:id:opensourcetech:20141219133530p:plain

 

続いて、nginxのインストールディレクトリを探して、環境変数PATHに追加します。

find / -name nginx

PATH=$PATH:/usr/local/nginx/sbin

 

また、nginx -VでPATH設定を確認しておきます。

なお、-Vオプションでは、使用されているモジュールに関する情報も確認出来ます。

f:id:opensourcetech:20141219133538p:plain

f:id:opensourcetech:20141219133543p:plain

 

Nginx1.7.8の設定

そして、いよいよNginxの設定です。

vi /usr/local/nginx/conf/nginx.conf

[listen] 使用ポートやSSL・SPDYの使用を定義

[server_name] サーバ名を設定

[ssl_certificate] サーバの証明書を指定

[ssl_certificate_key] サーバの秘密鍵を指定

[ssl_client_certificate] クライアント認証で使用するCAの証明書指定

[ssl_verify_client] クライアント認証の有効化

その他の設定についても知りたい方は、

Alphabetical index of directivesでチェックしてみて下さい。

f:id:opensourcetech:20141219133555p:plain

 

設定ファイルに記載したパスに、

サーバの証明書・秘密鍵、クライアント認証で使用するCAの証明書をコピーします。

f:id:opensourcetech:20141219133600p:plain

f:id:opensourcetech:20141219133604p:plain

f:id:opensourcetech:20141219133610p:plain

 

Nginx1.7.8の起動

nginxで起動。

lsof -i:80、lsof -i:443やnetstat -tanなどでNginxの起動状況を確認します。

使用するポートが「Listen」となって入ればOKです。

f:id:opensourcetech:20141219133615p:plain

 

FW(iptables)の設定

CentOS6の初期状態のiptablesにTCP80とTCP443通信を許可するルールを追加します。

itpables -I INPUT 5 -p tcp --dport 80 -j ACCEPT

itpables -I INPUT 6 -p tcp --dport 443 -j ACCEPT

 

なお、検証などの目的の為、

ルールを完全無効化するならば、iptables -Fでも問題ありません。

f:id:opensourcetech:20141219133623p:plain

 

クライアント認証の準備(ブラウザ)

pksc12形式のクライアント証明書を、

scp等でクライアント側へエクスポートします。

f:id:opensourcetech:20141219133631p:plain

 

エクスポートしたファイルをダブルクリックすることでインポートが開始されます。

※以下は、Windows8によるスクリーンキャプチャー。

f:id:opensourcetech:20141219133645p:plain

f:id:opensourcetech:20141219133650p:plain

 

PKCS12形式のクライアント証明書を生成した際に設定したパスワードを入力します。

f:id:opensourcetech:20141219133653p:plain

f:id:opensourcetech:20141219133657p:plain

f:id:opensourcetech:20141219133701p:plain

f:id:opensourcetech:20141219133705p:plain

 

IEやGoogle chromeなどではインターネットオプションから、

インポートされた証明書情報を確認出来ます。

※Mozilla Firefoxの場合は、手順が異なりますので、

 次の工程をご覧ください。

f:id:opensourcetech:20141219133712p:plain

 

 

クライアント証明書のインポート(Mozilla FireFox)の場合

f:id:opensourcetech:20141219133731p:plain

f:id:opensourcetech:20141219133735p:plain

f:id:opensourcetech:20141219133740p:plain

f:id:opensourcetech:20141219133744p:plain

 

クライアント(ブラウザ)からのアクセス

SSLクライアント認証を使用した場合は、

以下のようにアクセス時に証明書の選択が求められます。

それが正しい証明書であれば、アクセス出来ます。

f:id:opensourcetech:20141219133719p:plain

f:id:opensourcetech:20141219133727p:plain

 

 

 

2014年のNginxを振り返る

 ※あくまでも私個人の視線からとらえたものです。

 

今年のNginxでは、約1か月間隔での新バージョンリリースが行われました。

4月上旬までは、1.4系がstable・1.5系がmainline、

その後は、1.6系がstable・1.7系がmainlineとしてリリースされました。

 

また、6月にはNginxの商用版であるNginx Plusリリースや、

日本におけるユーザー会の設立などの動きがありました。

Nginx開発者であるイゴールがセッションに登場し、

その場でしか得られないようなコアな情報があったり、

私としてもユーザー会というものに初めて参加してみたのですが、

想像していた以上に参加しやすい空間で、とても楽しかったです。

直接開発者の方から話を聞けるのも、いいですね。

f:id:opensourcetech:20140618202108j:plain

 10月にはNginx Conference2014も開催され、

Apache、IISに続くWebサーバ・リバースプロキシとして、

今後も大きく成長していくことを予感させる一年だったかと思います。

 

-------

1/22   Nginx-1.5.9リリース

2/4     Nginx-1.5.10リリース

2/11   Nginx-1.4.5リリース

3/4     Nginx-1.4.6&1.5.11リリース

3/8     Nginx-1.4.7&1.5.12リリース

4/8     Nginx-1.5.13リリース

4/24   Nginx-1.6.0&1.7.0リリース

5/27   Nginx-1.7.1リリース

6/17   Nginx-1.7.2リリース

6/18   日本Nginxユーザー会 第0回開催

   
Nginx ユーザ会 #0 に行ってきました! - インフラエンジニアway - Powered by HEARTBEATS

7/8     Nginx-1.7.3リリース

8/5     Nginx-1.6.1&1.7.4リリース

9/16   Nginx-1.6.2&1.7.5リリース

9/30   Nginx-1.7.6リリース

10/20-22 NGINX Conference 2014 -開催

f:id:opensourcetech:20141222195244p:plain

10/28 Nginx-1.7.7リリース

12/2   Nginx-1.7.8リリース

12/23 Nginx-1.7.9リリース

 

 

 

 

にほんブログ村 IT技術ブログ Linuxへ
Linux

にほんブログ村 IT技術ブログ オープンソースへ
オープンソース

Opensourcetech by Takahiro Kujirai