2004年02月13日

今日の作業記録。「MovableType の管理画面を SSL にする」

突然とち狂ってモバイルで Blog 更新だだだという気分になってしまった場合にパスワードが平文で流れるのは気分が悪いので管理画面を SSL にするのこと。でも SSL とかさっぱりなのでやっぱりパクっていいとこどりするいやなやつ > mass

あまりに長くなったので「追記」行き。

前提:
FreeBSD 5.X-CURRENT で Ports から apache2 をインストールしていること。
DocumentRoot とか cgi-bin とかの位置はデフォルトのまま。

  1. 秘密鍵とサーバ証明書の作成

    サーバ証明書は本来でしたら正規の認証局に依頼して発行してもらい、「なりすまし」と「盗聴」を防止するものなのですが、ここでは通信経路を暗号化して「盗聴」を防ぎたいだけなので自己認証で発行します。もうちょっと突っ込みたい方は「初めてのSSLサーバ証明書 ガイド サーバIDとは」(日本ベリサイン) をどうぞ。
    apache2 の各種設定ファイルと同じところにいろいろ置きます。秘密鍵とサーバ証明書を置くディレクトリを作りましょう。
    # cd /usr/local/etc/apache2/
    # mkdir ssl.key ssl.crt
    

    ○秘密鍵の作成

    "-rand" には鍵生成のための乱数ファイルを指定します。これは内容がめためたであればあるほど良いようです。 /var/log/messages を使う方が多いようですが、うちは apache2 のアクセスログがいちばん活きが良いのでそちらを使いました。その他のパラメータは VeriSign の手順通りにしましょう。
    # openssl genrsa -des3 -rand /var/log/httpd-access.log -out ssl.key/server.key 1024
    15249751 semi-random bytes loaded
    Generating RSA private key, 1024 bit long modulus
    ...............................................++++++
    ..........++++++
    unable to write 'random state'
    e is 65537 (0x10001)
    Enter pass phrase for ssl.key/server.key:<てきとーなpassphrase>
    Verifying - Enter pass phrase for ssl.key/server.key:<もっかいpassphrase>
    
    途中で妙なメッセージが出てるけど私は気にしません。

    ○ CSR の作成

    証明書発行要求書、と言うらしい。これを認証局に送るとサーバ証明書を送り返してくれるらしい。らしいばっか。
    "-key" とか "-rand" とか "-out" とか紛らわしいので気をつけましょう。
    いろいろと入力を要求されますが、すべてローマ字で回答してください。
    自己認証なので内容は適当でも良いですが、もし本当の認証局に提出するならそれなりにしっかりと回答しましょう。
    # openssl req -new -key ssl.key/server.key -out server.csr
    Enter dpass phrase for ssl.key/server.key:<秘密鍵のpassphrase>
    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) [AU]:JP ← 日本在住の方ならこれで。
    State or Province Name (full name) [Some-State]:[てきとーな都道府県名]
    Locality Name (eg, city) []:[てきとーな市区町村名]
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:[てきとーな組織名] ← サイト名とかで良いかも。
    Organizational Unit Name (eg, section) []:[てきとーな部署名] ← ネタにつまったら空欄でも可
    Common Name (eg, YOUR name) []:[WWWサーバのFQDN]
    Email Address []:[管理者のメールアドレス]
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []: ← 入力不要
    An optional company name []: ← 入力不要
    
    せっかくの自己認証なのでばか正直に答えちゃいけません! ここがあなたのセンスの見せどころなのです!!(なぜだ)

    ○サーバ証明書の作成

    CSR をもとにサーバ証明書を作ります。本来この作業は認証局が行うものですが、自己認証なので自分で行います。
    # openssl x509 -req -in server.csr -signkey ssl.key/server.key -out ssl.crt/server.crt -days <証明書有効日数>
    Signature ok
    subject=/C=JP/ST=[てきとーな都道府県名]/L=[てきとーな市区町村名]/O=[てきとーな組織名]/OU=[てきとーな部署名]
    /CN=[WWWサーバのFQDN]/emailAddress=[管理者のメールアドレス]
    Getting Private key
    Enter pass phrase for ssl.key/server.key:<秘密鍵のpassphrase>
    unable to write 'random state'
    
    また妙なメッセージが出ていますが、また気にしません。
    オプション -days は指定しなければ 30日です。この場合、証明書作成から 30日を経過後にアクセスするとブラウザから証明書が期限切れで云々のメッセージが表示されます。
    それが嫌なら日数を多めにとるとよいでしょう。どうせ自己認証なので期限が切れようが切れまいが信頼性のないことに変わりありませんから。
    以上の作業で必要なものは揃いました。
    CSR/usr/local/etc/apache2/server.csr
    サーバ証明書/usr/local/etc/apache2/ssl.crt/server.crt
    秘密鍵/usr/local/etc/apache2/ssl.key/server.key

  2. apache2 の SSL 設定

    apache2 の ssl.conf を変更します。
    # vim ssl.conf
    ServerName <WWWサーバのFQDN>:443
    ServerAdmin <管理者のメールアドレス>
    
    SSLCertificateFile /usr/local/etc/apache2/ssl.crt/server.crt
    SSLCertificateKeyFile /usr/local/etc/apache2/ssl.key/server.key
      → apache2 のデフォルト設定。
        鍵、証明書ともこれにあわせると手間が減ります。
    

  3. apache2 の動作確認

    起動してみましょう。通常の起動パラメータは "start" ですが、 SSL をロードする場合は "startssl" となります。起動する際に秘密鍵のパスフレーズ入力を要求されます。
    # /usr/local/sbin/apachectl startssl
    Apache/2.0.48 mod_ssl/2.0.48 (Pass Phrase Dialog)
    Some of your private key files are encrypted for security reasons.
    In order to read them you have to provide us with the pass phrases.
    
    Server www.mass.dnsalias.com:443 (RSA)
    Enter pass phrase:<秘密鍵のpassphrase>
    Ok: Pass Phrase Dialog successful.
    
    エラー無く起動したなら、ブラウザで https://<WWWサーバのFQDN>/cgi-bin/mt/mt.cgi にアクセスしてみましょう。
    「Website Certified by an Unknown Authority」やら「セキュリティの警告」やらが出るかと思います。今回作ったサーバ証明書は正規の認証局によって発行されたものではないため、ブラウザが保持しているルート証明書で照合できないためです。(あってるかなぁ?)

  4. MovableType の設定

    MovableType の mt.cfg に以下の記述を追加します。
    AdminCGIPath https://www.mass.dnsalias.com/cgi-bin/mt/
    
    これを追加しないと、ログアウトした後のログイン画面が非 SSL 画面になってしまいます。それ以外にも不都合があるかも...

  5. パスフレーズ入力なしで apache2 with SSL を起動する

    サーバ再起動の度にパスフレーズ入力もあれなんで、入力なしで起動できるようにします。
    # cd /usr/local/etc/apache2/ssl.key/
    # mv server.key server.key.bak 
    # openssl rsa -in server.key.bak -out server.key
    Enter pass phrase for server.key.bak:<秘密鍵のpassphrase>
    writing RSA key
    
    こうすると次回以降、パスフレーズなしで起動できます。本当は望ましくないのかも知れませんが...

  6. その他

    apache2 を Ports からインストールした場合、 /usr/local/etc/rc.d/apache2.sh というシェルスクリプトが置かれます。このスクリプトはサーバ証明書の有り無しによって apachectl に渡すパラメータを加工しているので、わざわざスクリプトをいじる必要がありません。 portupgrade の時も安心です。


    参考リンク(本当に助かりました):
    Apache2+mod_sslによるセキュアなWebサーバ」(日替わり実験室)
    Movable Typeの設置」(What a Wonderful World)

オチ:
全てのページが SSL 対応になってしまったわけだが...



---- 2004/9/17 追記。

月日の経つのは早いもので、半年などあっと言う間です。この記事を書いた当時はゲームやアニメ三昧でのんべんだらりと日々をすごし、周りからは「いい加減働いてください。」「だめ人間ですね。」「何のために生きているのですか。」「いまならひっそりと死ねますよ。」などと言われながら働き口を探していたような気がなんとなくします。(後半 は恐らく被害妄想)
そのときに作ったサーバ証明書も作成時に指定した 180日という期限がやってきました。このままでも個人的に実害はないのですが、「いちいち出るウインドウがうざってぇんだこんちきしょうめぇ」ということで日付だけ更新しました。

# cd /usr/local/etc/apache2
# openssl x509 -req -in server.csr -signkey ssl.key/server.key -out ssl.crt/server.crt -days 180
# /usr/local/etc/rc.d/apache2.sh restart
また 180日に設定したので、また 180日後に更新する必要があります。(や、しなくてもいいんですが。)
まぁ、作業を忘れないように、ということで。あんまり意味ないけど。

---- 2005/3/16 追記。

また更新すた!!

Posted by mass at 2004年02月13日 01:32 [UNIX] | TrackBack
Comments
Post a comment









Remember personal info?