Homebrew で入れた Apache を SSL に対応させる

今まで特に暗号化通信を使う局面があまりなかったことや、サーバ上でしかテストもしてなかったので、ローカルには SSL を入れていなかったが、たまたま使うタイミングがあったので構築してみた。奇しくも SSL の脆弱性が発見されてサーバ側も面倒なことになっているので、そっちの話もと思うがとりあえずローカルの話。

とりあえず、OpenSSL を Homebrew でインストールする。

OpenSSL は Mac にもデフォルトで入っているが、そちらは使わず Homebrew で入れたものでセッティングする。もちろんローカルでのテスト環境なので、正式な認証局を通さずオレオレ証明書で簡易作成する。インストールすると、以下のような構成になっている。この時点の OpenSSL は1.0.1f の模様。例の脆弱性は 1.0.1g 以降または heartbeat を切った状態でないといかんらしいが、まぁローカルなんで、この辺は後回し。

● openssl 本体位置
/usr/local/Cellar/openssl/1.0.1f/bin/openssl

● 証明書関連作成スクリプト位置
/usr/local/etc/openssl/misc

PATH を貼り直してもいいが、恐らく一回しか使わないし面倒なのでフルパスで全部セットアップを済ませることにする。

CA (認証局) の作成

まず、CA.shを使って新しい認証局ファイル一式を作成する。対話式で入力を促される。

  • CA certificate filename (or enter to create) - 空 Enter
  • Enter PEM pass phrase: - 任意のパスフレームを入力
  • Verifying – Enter PEM pass phrase: - パスフレームを再入力
  • Country Name - [ ] (空で可)
  • State or Province Name - [ ] (空で可)
  • Locality Name - [ ] (空で可)
  • Organization Name - [ ] (空で可)
  • Organizational Unit Name - localhost (ドメイン名)
  • Common Name - [ ] (空で可)
  • Email Address - [ ] (空で可)
  • A challenge password - [ ] (空で可)
  • An optional company name - [ ] (空で可)

テスト環境なんで、本式でなくても構わないんで、とりあえずこんな感じで入力。作成が完了すると「demoCA」というディレクトリが出来て、一式ファイルが格納される。

秘密鍵の作成

そのままの位置で server.key を作成する。

  • Enter pass phrase for server.key: - 認証局作成で入力したパスフレーズ
  • Verifying – Enter pass phrase for server.key: - 入力したパスフレーズ確認

起動時に毎回パスフレーズを尋ねられるのは面倒なので、作成できたらプロテクトを外す。

  •  Enter pass phrase for server.key: - server.key 作成で入力したパスフレーズ

「/usr/local/etc/openssl/misc」以下に「server.key」ファイルが作成される。

証明書の作成

まずは署名要求ファイル (server.csr) を作成する。認証局の時と同じで対話式で進む。

  • Country Name - [ ] (空で可)
  • State or Province Name - [ ] (空で可)
  • Locality Name - [ ] (空で可)
  • Organization Name - [ ] (空で可)
  • Organizational Unit Name - localhost (ドメイン名)
  • Common Name - [ ] (空で可)
  • Email Address - [ ] (空で可)
  • A challenge password - [ ] (空で可)
  • An optional company name - [ ] (空で可)

認証局で入力した内容と揃える。後は作成した server.csr と認証局の時に作成された cakey.pem を組み合わせて証明書(server.crt)を作成。

  •  Enter pass phrase for demoCA/private/cakey.pem - 認証局作成で入力したパスフレーズ

この時以下のようなエラーが出て作成失敗する場合がある。


認証局で入力した情報と署名要求ファイルの内容が異なる場合に出るようだが、空で入力すると出る模様。その際は「-policy policy_anything」オプションを付けて作成する。

さらに「failed to update database TXT_DB error」というエラーが出てしまう場合(一度作成失敗すると出るっぽい)は、「demoCA」内の「index.txt」を作り直すと上手くいく。

後は、httpd の ssl 設定の位置に併せて移動、もしくは「/usr/local/etc/apache2/extra/httpd-ssl.conf」の「SSLCertificateFile」と「SSLCertificateKeyFile」位置を変更する。

多分、コピーして移動した方が楽。最後に、/usr/local/etc/apache2/httpd.conf」でデフォルトコメントアウトされている「/usr/local/etc/apache2/extra/httpd-ssl.conf」を読み込ませて完了。

ちょっとややこしいけど、これでオレオレ証明書として動作するようになる。当然ブラウザでは「信頼できない接続」云々の警告が出るが例外許可すれば使える。