VPSやクラウドでいろいろ遊ぼうのblog

地方でITやってます。IT全般を勉強しつつ、いろいろ遊んでみます。 情報セキュリティスペシャリスト。twitterは @hogefuga123

ネットワーク勉強14 Nginxでクライアント認証

表題どおり。

とりあえずここを参考にさせてもらった。

opensourcetech.hatenablog.jp



まず、CAの構築。

Ubuntu は、
/usr/lib/ssl/misc/CA.sh -newca

でいいらしい。

国名は"JP"を入力、他はすべて"hoge"を入れた。

writing new private key to './demoCA/private/./cakey.pem'

と出て、
Write out database with 1 new entries
Data Base Updated
とでた。OKだと思う。


/root/demoCA
に、各種ファイルができている。

.certと.keyが大事なファイル。

ここまでで、認証局が構築できた。

        • -

サーバ用の公開鍵・秘密鍵を作成。
場所は
/usr/local/ssl/server
にしてみよう。

秘密鍵:
openssl genrsa -out /usr/local/ssl/server/server.key 2048

公開鍵:
csrは、sha-2にしてみた。
openssl req -new -sha256 -key /usr/local/ssl/server/server.key -out /usr/local/ssl/server/server.csr

国名は"JP",あとはすべて"fuga"を入れた。
これでサーバ側はOK.

        • -

CAとしての署名。サーバのCSRに対して、CAの秘密鍵で署名。

openssl ca -in /usr/local/ssl/server/server.csr -out /usr/local/ssl/server/server.crt -keyfile /root/demoCA/private/cakey.pem

してみると、
The stateOrProvinceName field needed to be the same in the~
のエラーがでる。
これは、CA側とサーバ側のstateOrProvinceNameが一致していないと
いけない、というエラーらしい。

参考:
http://hack.aipo.com/archives/319/


これを無視するオプションをつける。

openssl ca -policy policy_anything -in /usr/local/ssl/server/server.csr -out /usr/local/ssl/server/server.crt -keyfile /root/demoCA/private/cakey.pem

これでサーバの証明書(=サーバの公開鍵にCAがデジタル署名をする)ができた。

ここで復習:
デジタル署名とは、平文を署名者の秘密鍵で暗号化すること。復号化は署名者の公開鍵で行う。
つまり、公開鍵暗号とは逆の概念だ。

        • -

クライアントの公開鍵・秘密鍵の作成

openssl genrsa -out /usr/local/ssl/client/client.key 2048

openssl req -new -sha256 -key /usr/local/ssl/client/client.key -out /usr/local/ssl/client/client.csr


国名は"JP"、その他は"foo"、パスワードは適当なものを入れた。


同様にCAとして署名。
openssl ca -policy policy_anything -cert /root/demoCA/cacert.pem -keyfile /root/demoCA/private/cakey.pem -in /usr/local/ssl/client/client.csr -out /usr/local/ssl/client/client.crt


pksc12形式へ変換:(たぶんサイトは誤植.pkcs12が正解では?)

openssl pkcs12 -export -clcerts -inkey /usr/local/ssl/client/client.key -in /usr/local/ssl/client/client.crt -out /usr/local/ssl/client/client.p12


ここまでで、SSL関係の準備はOK.

      • -


nginxは、普通にapt-getでインストールしておいた。
htmlへのパスは
/usr/share/nginx/html
だ。

nginx.confはこんな感じ。

user www-data;
worker_processes 4;
pid /run/nginx.pid;

events {
	worker_connections 768;
	# multi_accept on;
}

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	keepalive_timeout 65;
	types_hash_max_size 2048;
	# server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;

	##
	# Gzip Settings
	##

	gzip on;
	gzip_disable "msie6";

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# nginx-naxsi config
	##
	# Uncomment it if you installed nginx-naxsi
	##

	#include /etc/nginx/naxsi_core.rules;

	##
	# nginx-passenger config
	##
	# Uncomment it if you installed nginx-passenger
	##
	
	#passenger_root /usr;
	#passenger_ruby /usr/bin/ruby;

	##
	# Virtual Host Configs
	##

	server {
	
	     listen 443 ssl default_server;
	     server_name hoge.com;
	     ssl_certificate /usr/local/ssl/server/server.crt;
	     ssl_certificate_key /usr/local/ssl/server/server.key;
	
	     ssl_session_cache    shared:SSL:1m;
	     ssl_session_timeout    5m;
	
	     ssl_ciphers HIGH:!aNULL:!MD5;
	
	     ssl_prefer_server_ciphers on;
	
	     ssl_client_certificate /root/demoCA/cacert.pem;
	     ssl_verify_client on;
	     ssl_verify_depth 1;
	
	     location / {
	         root html;
	         index index.html index.htm;
	
	     }

	}

	include /etc/nginx/conf.d/*.conf;
	include /etc/nginx/sites-enabled/*;

	

}

シンタックスのチェックは
nginx -t -c /etc/nginx/nginx.conf



んで
/etc/init.d/nginx restart
してみると...起動しない。

error_logみると、

98: Address already in use だと。。。


ここをチェック。

easyramble.com


今回の場合、aolserver っていうプロセスが80ポートをつかんでいたようなので
(これは何なの?)

kill [PID] して、

/etc/init.d/nginx restart
すると、無事動いた(^^)

lsof -i:443

すると、やっぱり動いてるよ(^^)

あとは.p12ファイルをクライアントPC(Windows)にコピーして、
ダブルクリックでインポートされる。

ブラウザには、注意書きが表示されるが、無事httpsでアクセスできた!