hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

Redmine(Apache+passenger) での SSL(自己署名) の設定

ローカル環境にインストールしている「Redmine」について「SSLでの接続」が出来ていなかったので、やってみました。
(タイトルが「Redmine」となっていますが、証明書の発行等については通常の「Apache + SSL」でも変わらないので、そのまま使えると思います。)

Apache + passenger + Redmine」はセットアップ済みの前提です。未セットアップの場合は、過去記事の「CentOSへRedmine1.1.0をインストールCentOSへRedmine1.1.0をインストール(passenger設定編)」を参考にして下さい。

Redmine で「SSLでの接続」するまでの流れは以下のようになります。

  1. 「openssl」と「mod_ssl」のインストール
  2. 秘密鍵(RSA)の生成
  3. 証明書要求(CSR)の生成
  4. 証明書の発行(自己署名)
  5. ApacheへのSSLの組み込み

「openssl」と「mod_ssl」のインストール

SSLに対応するためには、「openssl」と「mod_ssl」が必要になるので、yum からインストールします。

# yum install openssl openssl-devel
# yum install mod_ssl

念のため、インストールされたかどうかを確認します。

# yum list installed | grep ssl
mod_ssl.i386                             1:2.2.3-43.el5.centos.3       installed
openssl.i686                             0.9.8e-12.el5_5.7             installed
openssl-devel.i386                       0.9.8e-12.el5_5.7             installed

ちょっと余談ですが、CentOS で yum からインストールした場合の「openssl」の設定ファイルは以下の場所にあります。

opensslの設定ファイル /etc/pki/tls/openssl.cnf

秘密鍵(RSA)の生成

インストール等の設定が完了したら、最初に「RSA秘密鍵」を生成します。
RSA秘密鍵」生成方法は2パターンありますが、どちらの方法でも違いはありません。
※「make」で生成した秘密鍵をそのまま使用した場合は、Apacheの起動時に都度パスフレーズの入力を要求されます。

(パターンその1)「make + openssl」で生成

「make + openssl」で生成する方法です。
「/etc/pki/tls/certs」以下に「Makefile」があるので、それを使用して秘密鍵を生成します。秘密鍵の生成にはパスフレーズの入力が要求されます。
「make」で生成した秘密鍵をそのまま使用することも出来ますが、その場合は Apache の起動時等でその都度パスフレーズの入力を要求されてしまうので、「opensslコマンド」を使用して「パスフレーズ付きのRSA秘密鍵」を生成します。

# cd /etc/pki/tls/certs
# make server_onpass.key
umask 77 ; \
        /usr/bin/openssl genrsa -des3 1024 > server_onpass.key
Generating RSA private key, 1024 bit long modulus
..............................................++++++
...............................++++++
e is 65537 (0x10001)
Enter pass phRSAe:
Verifying - Enter pass phRSAe:
#
# openssl rsa -in server_onpass.key -out server_nopass.key
Enter pass phRSAe for server_onpass.key:
writing RSA key
#
# ls -l
合計 488
 -rw-r--r-- 1 root root   2240 12月 16 00:30 Makefile
 -rw-r--r-- 1 root root 441017 12月 16 00:31 ca-bundle.crt
 -rw------- 1 root root   1468  1月 26 22:34 localhost.crt
 -rw-r--r-- 1 root root    887  2月  8 22:49 server_nopass.key → パスフレーズ無しの秘密鍵
 -rw------- 1 root root    951  2月  8 22:48 server_onpass.key → パスフレーズ付きの秘密鍵
(パターンその2)「openssl」のみで生成

「make + openssl」を使用せずに「openssl」のみで秘密鍵を生成する方法です。
1つのコマンドで生成出来るので、通常はこちらを使用することが多いと思います。

  • genrsa」は、RSA秘密鍵生成するためのオプションです。
  • -out server.key」は、秘密鍵のファイル名を指定します。
  • 1024」は、RSAの鍵の長さ(ビット)になります。
# openssl genrsa -out server.key 1024
Generating RSA private key, 1024 bit long modulus
..........................++++++
..............++++++
e is 65537 (0x10001)
#
# ls -l
合計 488
 -rw-r--r-- 1 root root   2240 12月 16 00:30 Makefile
 -rw-r--r-- 1 root root 441017 12月 16 00:31 ca-bundle.crt
 -rw------- 1 root root   1468  1月 26 22:34 localhost.crt
 -rwxr-xr-x 1 root root    610 12月 16 00:30 make-dummy-cert
 -rw-r--r-- 1 root root    887  2月  8 22:50 server.key
 -rw-r--r-- 1 root root    887  2月  8 22:49 server_nopass.key
 -rw------- 1 root root    951  2月  8 22:48 server_onpass.key
RSAの内容確認

生成したRSA秘密鍵の内容は「openssl rsa」で確認できます。

  • -in server.key」は中身を確認したいRSA秘密鍵のファイルを指定します。
  • -text」は、テキスト形式で表示するという指定です。
  • -noout」出力ファイルに出力しない、つまり標準出力する、という指定です。
# openssl rsa -in server.key -text -noout
Private-Key: (1024 bit)
modulus:
    00:d2:d3:fa:38:72:75:6b:78:9e:57:be:2e:c9:ea:
    (〜 省略 〜)
publicExponent: 65537 (0x10001)
privateExponent:
    00:89:94:19:12:62:e6:eb:16:10:46:73:ee:36:87:
    (〜 省略 〜)
prime1:
    00:f0:ae:47:b1:09:8b:c5:5c:56:42:ba:29:1e:39:
    (〜 省略 〜)
prime2:
    00:e0:3f:44:b6:86:a6:84:5f:02:09:3d:c3:47:fa:
    (〜 省略 〜)
exponent1:
    34:6d:82:68:6a:2f:ec:3a:05:00:5c:15:00:e4:86:
    (〜 省略 〜)
exponent2:
    2f:59:6c:9a:d5:c7:a7:3f:a0:60:6f:28:22:b4:a5:
    (〜 省略 〜)
coefficient:
    1a:d5:23:85:95:23:13:9e:5e:f4:47:0b:ea:6d:e8:
    (〜 省略 〜)

内容についての詳しい説明は、「SSL TLS の導入 (1)」が参考になるかと思います。

証明書要求(CSR)の生成

RSA秘密鍵」の生成ができたら、次に「証明書要求(CSR)」を生成します。

「openssl req」でCSR生成

「証明書要求(CSR)」の生成には、「openssl req」を使用します。

  • -new」は、新しい証明書要求(CSR)を生成するという指定です。
  • -key server.key」は、先程、生成したRSA秘密鍵のファイルを指定します。
  • -out server.pem」は、証明書要求(CSR)の出力先ファイルを指定します。
  • -sha1」は、ハッシュの形式になります。(SHA1)

「openssl req」を実行すると、対話式インターフェースが起動しますので、必要に応じて情報を入力します。
※今回は自己署名なのでとりあえずは適当で良いと思います。

# openssl req -new -key server.key -out server.pem -sha1
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
 -----
Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:Tokyo
Locality Name (eg, city) [Newbury]:(入力無し)
Organization Name (eg, company) [My Company Ltd]:(入力無し)
Organizational Unit Name (eg, section) :(入力無し)
Common Name (eg, your name or your server's hostname) :localhost
Email Address :(入力無し)

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password :(入力無し)
An optional company name []:(入力無し)
CSR の内容確認

生成したRSA秘密鍵の内容は「openssl req」で確認できます。
各オプションについては、先程の「RSAの内容確認(openssl rsa)」の時と同様になります。

内容見てみると、「openssl req -new」で「証明書要求(CSR)」を生成した際に指定した値が設定されていることが確認できます。

# openssl req -in server.pem -text -noout
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=JP, ST=Tokyo, L=Newbury, O=My Company Ltd, CN=localhost
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:d2:d3:fa:38:72:75:6b:78:9e:57:be:2e:c9:ea:
                    (〜 省略 〜)
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha1WithRSAEncryption
        7b:02:09:ad:c1:a9:73:7a:0b:40:e5:27:a0:00:86:72:2f:5d:
        (〜 省略 〜)

証明書の発行(自己署名)

次に、証明書の発行を行います。証明書の発行には「openssl x509」を使用します。
有料のSSL証明書を使用する場合は「CA - 証明書発行機関(VeriSign等)」でやってもらう形になります。
今回はローカル環境なので「自己署名(オレオレ署名)」で対応します。

  • -in server.pem」は、先程、生成した証明書要求(CSR)のファイルを指定します。
  • -out server.crt」は、証明書(自己署名)の出力ファイル名を指定します。
  • -signkey server.key」は、自己署名用のオプションになります。ここには最初に生成したRSA秘密鍵を指定します。
  • -days 365」は、証明書の有効期限になります。ここでは1年(365日)を指定しています。(指定無しの場合はデフォルトで1ヵ月)
  • -sha1」は、ハッシュの形式になります。
# openssl x509 -in server.pem -out server.crt -req -signkey server.key -days 365 -sha1
Signature ok
subject=/C=JP/ST=Tokyo/L=Newbury/O=My Company Ltd/CN=localhost
Getting Private key

ここまでで、「RSA秘密鍵」「証明書要求(CSR)」「証明書(自己署名)」が生成され、SSL接続に必要なファイルが揃った形になります。

パーミッションの設定/秘密鍵の移動

セキュリティを考慮して「RSA秘密鍵」「証明書要求(CSR)」「証明書(自己署名)」のパーミッションを変更します。

# chmod 400 server.crt server.key server.pem
#
# ls -l
合計 504
 -rw-r--r-- 1 root root   2240 12月 16 00:30 Makefile
 -rw-r--r-- 1 root root 441017 12月 16 00:31 ca-bundle.crt
 -rw------- 1 root root   1468  1月 26 22:34 localhost.crt
 -rwxr-xr-x 1 root root    610 12月 16 00:30 make-dummy-cert
 -r-------- 1 root root    818  2月  8 23:14 server.crt → 証明書(自己署名)
 -r-------- 1 root root    887  2月  8 22:50 server.key → RSA秘密鍵
 -r-------- 1 root root    635  2月  8 22:57 server.pem → 証明書要求(CSR)

RSA秘密鍵」について、格納するディレクトリが用意されているので、移動させておきます。

# mv /etc/pki/tls/certs/server.key /etc/pki/tls/private/server.key

Apache への SSL の組み込み

最後に、ここまでで生成した秘密鍵や証明書をApacheに組み込みます。

redmine.conf」を作成

以下の内容で、「/etc/httpd/conf.d/」以下に「redmine.conf(ファイル名は何でも良いです)」を作成します。

  • SSLCertificateFile」は、生成した証明書(自己署名)を指定します。
  • SSLCertificateKeyFile」は、生成したRSA秘密鍵を指定します。

Header onsuccess append Cache-Control public 〜」については、「FirefoxSafariの場合、SSLページアクセスすると静的ファイルがキャッシュされずに動作が遅くなる」という現象があるため、SSLでも画像やJavaScriptファイルがキャッシュされるように指定しています。こちらについては「でぃべろっぱーってへてむる SSLだとRedmineが遅い件」 を参考にさせて頂きました。

###########
# /etc/httpd/conf.d/redmine.conf
###########
NameVirtualHost *:80
NameVirtualHost *:443

<VirtualHost *:80>

   ServerName centos
   DocumentRoot /var/www/html/redmine/public
   <Directory /var/www/html/redmine/public>
      AllowOverride all
      Options -MultiViews
   </Directory>

</VirtualHost>

<VirtualHost *:443>

   ServerName centos
   DocumentRoot /var/www/html/redmine/public
   RailsBaseURI /app
   CustomLog /var/log/httpd/ssl-access.log combined
   ErrorLog /var/log/httpd/ssl-error.log

   SSLEngine on
   SSLProtocol all -SSLv2
   SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
   SSLCertificateFile /etc/pki/tls/certs/server.crt              # → 証明書(自己署名)を指定
   SSLCertificateKeyFile /etc/pki/tls/private/server.key    # → RSA秘密鍵を指定

   Header onsuccess append Cache-Control public          # ↓ SSLでも画像やJavaScriptファイルがキャッシュされるように指定
   ExpiresActive On 
   ExpiresByType text/css "access plus 3 days" 
   ExpiresByType application/x-javascript "access plus 3 days" 
   ExpiresByType image/jpeg "access plus 3 days" 
   ExpiresByType image/png "access plus 3 days" 
   ExpiresByType image/gif "access plus 3 days"

   <Directory /var/www/html/redmine/public>
      AllowOverride all
      Options -MultiViews
   </Directory>

</VirtualHost>
httpd.conf」「ssl.conf」のコメント化

上記の「redmine.conf」にて「」「」といった設定をしているので、必要に応じて「httpd.conf」「ssl.conf」のコメント化をします。

例えば、「/etc/httpd/conf.d/ssl.conf」の場合は、デフォルトで「」という設定がされているので、「 〜 」 までをコメント化します。

#<VirtualHost _default_:443>
# (全てコメント化)
#</VirtualHost>

また、CentOSへRedmine1.1.0をインストール(passenger設定編) にて「httpd.conf」に「」という設定をしている場合は、こちらもコメント化(または削除)します。

#<VirtualHost *:80>
# (全てコメント化)
#</VirtualHost>
Apache再起動 → ブラウザからアクセスして確認

全ての設定が完了したら、Apacheを再起動します。

# /etc/init.d/httpd restart

正常に再起動が完了したら、「 https://localhost/ 」 へアクセスします。
「自己署名」のため、下記のようなセキュリティの警告が表示されますが、無視して接続してしまいます。
f:id:mrgoofy33:20110209071136p:image:w300

その後は、いつもどおりRedmineのページが表示されればOKです。

補足)パスフレーズ無しの秘密鍵をApacheに組み込んだ場合

パスフレーズ無しの秘密鍵をApacheに組み込んだ場合は以下のように、Apacheの起動時に秘密鍵のパスフレーズを要求されます。
※サーバー起動時にApacheを起動するなどの、自動起動ができなくなります。

# /etc/init.d/httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中: Apache/2.2.3 mod_ssl/2.2.3 (Pass PhRSAe Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phRSAes.

Server centos:443 (RSA)
Enter pass phRSAe:

OK: Pass PhRSAe Dialog successful.
                                                           [  OK  ]

今回参考にしたページ

SSL TLS の導入 (1)
http://x68000.q-e-d.net/~68user/net/ssl-setup-1.html

Kung Noi SSLおれおれ証明書とクライアント認証
http://nai.homelinux.net/ssl.html

passenger でのトラブル
http://blogs.wankuma.com/pinzolo/archive/2009/01/21/166570.aspx

Suzuki Lab wiki - redmine Chapter3_後編
http://www.os.cis.iwate-u.ac.jp/wikky/wikky.cgi?redmine::Chapter3_%E5%BE%8C%E7%B7%A8

でぃべろっぱーってへてむる SSLだとRedmineが遅い件
http://devml.blogspot.com/2009/08/sslredmine.html