nginxでSSLとBasic認証の設定
nginx+Unicornで構築したRedmine環境について、自宅以外からアクセスする可能性を考えてSSLとBasic認証の設定をしました。
備忘録として手順を書き残しておきます。
nginxのSSL(自己署名証明書)設定
秘密鍵と証明書の準備
証明書等を保存するディレクトリを作成しておきます。
$ sudo mkdir /etc/nginx/certs
$ cd /etc/nginx/certs
サーバ秘密鍵(.key)を生成します。
$ sudo openssl genrsa -out server.key 1024
秘密鍵の生成時に「-des3」オプションを指定している例をよく見かけますが、以下を参考にここでは省きました。
-des3 はあくまで生成された鍵を暗号化して保存するかどうかで、生成される鍵自身の強度にはなんら影響を与えない。 だから、apacheのサーバー鍵などで、apache起動時にパスフレーズを聞かれたくない場合には、最初から -des3 オプションなしでサーバ鍵を作ればよい。
証明書発行要求書(.csr)を作成します。「Country Name」以外すべて空欄で作ってみましたが動作上問題ありませんでした。
$ sudo openssl req -new -key server.key -out server.csr
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:
A challenge password []:
An optional company name []:
サーバ自己署名証明書(.crt)を生成します。
$ sudo openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
nginxのSSL設定
nginxの設定ファイルを編集します。httpとhttpsのどちらでもアクセスできるようにする場合は以下のようにします。
$ sudo vim /etc/nginx/conf.d/default.conf
server {
listen 80;
listen 443 ssl;
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
server_name localhost;
httpでアクセスしたとき、自動的にhttpsに転送する場合は以下のようにします。(今回はこちらの設定を採用。)
$ sudo vim /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name <FQDNまたは固定IP※localhost不可>;
rewrite ^ https://$server_name$request_uri? permanent;
}
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
この転送設定は以下を参考にしました。
- cocoa*life - Redmine を nginx + Unicorn で動かしてみる
- How to force or redirect to SSL in nginx? - Server Fault
nginxを再起動します。
$ sudo service nginx restart
iptablesでSSLのポートを開きます。
$ sudo vim /etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
$ sudo service iptables restart
以上でnginxのSSLの設定は完了です。ブラウザからhttpsでアクセスできるようになったか確認します。
Basic認証の設定
httpsならパスワードが平文で送られることもなくなるので、Basic認証が有効に使えます。
apacheのhtpasswdコマンドで.htpasswdを作成します。
$ cd /etc/nginx
$ sudo htpasswd -c .htpasswd <ユーザ名>
New password: <パスワード>
nginxの設定ファイルを編集します。
$ sudo vim /etc/nginx/conf.d/default.conf
location /redmine/ {
root /var/www/redmine/public;
index index.html index.htm;
auth_basic "basic authentication";
auth_basic_user_file /etc/nginx/.htpasswd;
nginxを再起動します。
$ sudo service nginx restart
以上でnginxのBasic認証設定は完了です。
参考ページ
- nginx で ssl 設定をする | dogmap.jp
- apache のかわりにnginxを使ってみる(12) nginx でSSLを使ってみた | レンタルサーバー・自宅サーバー設定・構築のヒント
- nginx連載6回目: nginxの設定、その4 - TLS/SSLの設定 - インフラエンジニアway - powerd by HEARTBEATS
- [Think IT] 第7回:Apache+SSL環境を構築しよう! (2/3)
おわりに
StartComの無料SSL証明書を使ってみようかとも思ったんですが、ドメイン必須のようだったので今回はあきらめました。