ネットワーク勉強14 Nginxでクライアント認証
表題どおり。
とりあえずここを参考にさせてもらった。
まず、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 だと。。。
ここをチェック。
今回の場合、aolserver っていうプロセスが80ポートをつかんでいたようなので
(これは何なの?)
kill [PID] して、
/etc/init.d/nginx restart
すると、無事動いた(^^)
lsof -i:443
すると、やっぱり動いてるよ(^^)
あとは.p12ファイルをクライアントPC(Windows)にコピーして、
ダブルクリックでインポートされる。
ブラウザには、注意書きが表示されるが、無事httpsでアクセスできた!