SSLの鍵を打ち出す単純な方法

  1. 今日は新サーバーの調整をしていた。まぁ部のなんだけどね。
    そこで毎度難しいと思わせる問題、SSLの件について取り組んでました。
    実はLibserverは未だにSSLに対応させてない。
    まぁあった方がいいんだけど、ほぼLAN内での利用なのであまり気にしてない。
    将来的にはやりたいが。
    で、手順について、二度目にして体系化できた。
    非常にわかりにくい説明で困るのだが、まぁなんとかつなぎ合わせれば簡単に作れますぞと。
    ところで、今回作るのはオレオレ証明書と呼ばれるもの。
    はてなに詳しい定義が載っている。
    http://d.hatena.ne.jp/keyword/%A5%AA%A5%EC%A5%AA%A5%EC%BE%DA%CC%C0%BD%F1
    これによると、僕が作ろうとしてるのは第四種オレオレ証明書とあるもの。
    特定の人が利用するための証明書。
    そのため真贋は実際に管理者にフィンガープリントを教えてもらってそれと比べればよい。
    そういう考えなのであまり深く考える必要はない。
    一応体面を考えて自分で認証局をたてて、それが鍵に署名をして証明するようにしましたが、
    まぁ自己署名証明書でも事は足りるのだけどね。
    まず自分で認証局をたてると
    ところでCentOS 5.1の上での話をするが、当然だがRHEL、Fedoraでも通じる話。
    他でもディレクトリが違うかもしれないだけ。
    まず、/etc/pki/tls/certsに移動する。
    それで、/etc/pki/tls/openssl.cnfを次のを参考に変更する。
    [usr_cert]
    nsCertType = sslCA, emailCA
    basicConstraints = CA:TRUE
    keyUsage = cRLSign, keyCertSign
    参考にしろというのも変な書き方だが、まぁコメントアウト、コメントアウトの解除とかで調整してください。
    それで、便利なコマンドがありまして、
    # /etc/pki/tls/misc/CA -newca
    これで適当に設定していけば完了。CA certificate filenameとかchallenge passwordはそのままEnterで。
    これで/etc/pki/CA/以下にCA証明書が出来る。
    で、ここから配るのに便利な形にCA証明書を加工する。
    まずCA証明書は無駄な文言が多いので、いらない部分をカットしたスマートな証明書を作る。
    openssl x509 -in /etc/pki/CA/cacert.pem -out /tmp/ca.crt
    次にメールクライアントなどでよくつかわれるDER形式の証明書を作る。
    openssl x509 -in /etc/pki/CA/cacert.pem -outform der -out /tmp/ca.der
    最後にフィンガープリントを確認しておく。
    openssl x509 -sha1 -in /etc/pki/CA/cacert.pem -noout -fingerprint
    フィンガープリントというと意味は指紋だが、証明書のSHA1ハッシュですね。
    この値をメモしておいて、この値を配って、証明書を登録するときに確かに正しい証明書か確認してもらう。
    ただ、この値はネットワークで配信するのもいいのだが、アナログな手段で伝えられるようにするべきだと思う。
    なぜかというとその公開するページがなりすまされては意味がないから。
    それこそ政府とかの証明書は官報とかでフィンガープリントを発表するのだろうが。
    で、とりあえずこれで認証局は完成。
    この鍵を持って帰って、Firefoxとかに登録させてみる。
    それで証明書を表示させてみて、認証局の中から探して、プロパティーで見てみると、「SSL 認証局」と出ているはず。
    次に実際に使う鍵を作成。
    また、/etc/pki/tls/openssl.cnfを次のを参考に変更する。
    [usr_cert]
    nsCertType = server
    basicConstraints = CA:FALSE
    で、次のコマンドを叩く。
    # /etc/pki/tls/misc/CA -newreq
    これで鍵ができた。この状態では署名されてない。
    次に署名だが、非常に便利なもので、
    # /etc/pki/tls/misc/CA -sign
    とすれば完了。
    これでnewkey.pem、newcert.pem、newreq.pemの3つがあるはず。
    このうち、newreq.pemは署名の作業のために実は使われている。
    newkey.pemはサーバー側で専ら使うもの、newcert.pemはユーザーに配るもの。
    こちらはあまり気にしなくていい。Apache・Dovecot・Postfixが自分で配ってくれるから。
    今回は1つのマシンの上でやったから何にもないが、認証局が別のマシンのときは
    newreq.pemを認証局に持って行って、認証してもらってnewcert.pemを持って帰ってくるというやり方になる。
    ところで、この状態ではnewkey.pemにはパスワードの暗号化がかかってるのだが、
    この状態では自動起動で手間になるので、危険を覚悟で暗号化を解除しておく。
    # openssl rsa -in newkey.pem -out newkey2.pem
    このnewkey2.pemをApache・Dovecot・Postfixに鍵として読み込ませて使うということね。
    まず手始めにApacheに登録させた。
    さすがにCentOSはすばらしいもので標準でmod_sslが入ってる。
    余談だがmod_deflateも入ってた、ちょこちょこ設定するだけで圧縮がかかるようになった。
    それで設定は/etc/httpd/conf.d/ssl.confなのだが、
    特に設定すべきことはこの三行だけ。
    SSLCertificateFile /etc/pki/tls/certs/newcert.pem
    SSLCertificateKeyFile /etc/pki/tls/certs/newkey2.pem
    SSLCACertificateFile /etc/pki/CA/cacert.pem
    これだけでOK、これでCA証明書を登録しておけば特に何も言われずにhttpsでアクセスできるはず。
    CA証明書を登録したと言うことはその認証局を信用したということ、その認証局の信用した証明書は当然に信用する。
    まぁこんな調子でDovecot・Postfixにも登録するかな。
    そういえばPostfixの話だが、なんかうまくつながらんなぁと思ったら、こんな設定ミスがあった。
    main.cfの中にだが
     inet_interfaces = localhost
    これでは外部からの接続をすべてはねることになるから、ここにはallを入れないとだめだよと。
    今まで気づかなかった。こんなのがあったんだな。
    Hidemaro ◆3rRY3LJ8tc 2008/03/21(Fri) 22:19 ID:Z1yCC0bQ

read.php ver2 (2004/1/26) + riaf web