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;

この転送設定は以下を参考にしました。

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認証設定は完了です。

参考ページ

おわりに

StartComの無料SSL証明書を使ってみようかとも思ったんですが、ドメイン必須のようだったので今回はあきらめました。

blog comments powered by Disqus