Ab.の日記: SBS 2008 の enterprise PKI で他 web server のSSL証明書を作った
- Windows7 環境でも subversion を復活させたいな
- svn server は FreeBSD 上にあって前は svn+ssh で叩いていたけど passphrase を ssh agent に入れるその一回が面倒で嫌だったな
- 専用の passphraseless の private key で運用するのも freebsd 側にユーザーを一つ余計に作らないといけないし、いちいち間に ssh が起動するのも癪
- もともと svn の認証パスワードや内容が平文で network に流れるのが(自分しか使ってないLANといえども)嫌で始めた運用だった。最初 IPSec を試したのだがそのときうまく行かなかったので仕方なく svn+ssh にしたのだった
- https で svn 叩いてみる?
という事でちょうど Small Business Server が ADDC 兼 CA として立っている上に group policy で root ca として強制登録されてしまうのでクライアント側は手間いらずという事で FreeBSD の apache に SSL, mod_dav_svn で svn server として立ってもらうことにしました。
以下はその証明書を作った際の行き当たりばったりな戦いの記録である。
まず Small Business Server の「Active Directory 証明書サービス」の役割に「証明機関 Web 登録」を追加します。
次に、証明機関 Web 登録は https を要求するので IIS マネージャで Default Web Site に https のバインドを追加します。
が、SBS Web Aplications サイトの https がすでに 443 は取ってしまって使えません。
他所のポートにするには windows firewall に穴を開けないといけないみたいで面倒なので、とりあえず SBS Web Applications の https には一時的に(アクセスできない)他所のポートに移ってもらって Default Web Site に https/443 を割り当てます。
このとき、証明書はちゃんとバインドした IP アドレスの FQDN に対応するものを使用するように設定します。
で、SBS2008 のサーバーを仮に sbs2008.localnet.localdomain としますと、https://sbs2008.localnet.localdomain/certsrv にアクセスし、「Microsoft Active Directory 証明書サービス -- localnet-SBS2008-CA」のページが出るのを確認します。
次に openssl で FreeBSD の apache 用の証明書の request を作ります。
適当に作業用ディレクトリを掘って、まず private key を作ります。
作るときにパスフレーズを聞かれるので適当に入力します(忘れないように)
set site=svnserver.localnet.localdomain
openssl genrsa -des3 -out $site.key 2048
chown -R www:www .
chmod -R go-rwx .
それから request を作ります。
pass phrase を聞かれるのでさっきのを入れるように。
大体適当でいいですが、Common Name だけは apache のサーバーの FQDN を入れます。
入れ間違えると違うホスト用の証明書を要求していることになるので注意です。
openssl req -new -sha1 -key $site.key -out $site.csr
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Shibuya
Organization Name (eg, company) [Internet Widgits Pty Ltd]:LocalNet
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:svnserver.localnet.localdomain
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
で、csr ができるのでその中身を取り込んでおきます(クリップボードとかに)
cat $site.csr
-----BEGIN CERTIFICATE REQUEST-----
(略)
-----END CERTIFICATE REQUEST-----
それから先ほどの SBS2008 の「Microsoft Active Directory 証明書サービス」ページに戻り、「証明書を要求する」をクリックします。
証明書の種類の選択:では「証明書の要求の詳細設定を送信する。」方を選びます。
さらに「Base 64 エンコード CMC または PKCS #10 ファイルを使用して証明書の要求を送信するか、または Base 64 エンコード PKCS #7 ファイルを使用して更新の要求を送信する。」をクリック
そして「保存された要求:」に先ほどの request をペーストし、「証明書テンプレート:」で「Web サーバーを選びます」。
SBS2008 の default web site の証明書が間違った状態で無理矢理進んでいるとここで「ユーザー」と「基本EFS」しか出てこなくてハマる事になるので、IISマネージャで行ったhttpsへのバインドの操作のSSL証明書は正しいものを選んでおく必要があります。
そうして「送信」を叩くと証明書と証明書チェーンが出てきますので両方保存します。
cer の方はそのまま apache のサーバーに放り込んでしまいます。
p7b の方はそのままだと使えないので PEM 形式に変換します。
また private key ファイルは passphrase を外しておきます(そうしないと apache が起動する度に passphrase を入力しないといけなくなるらしい)
mv newcert.cer svnserver.localnet.localdomain.cer
openssl pkcs7 -inform DER -in newcert.p7b -outform PEM -out $site.crt -print_certs
openssl rsa -in $site.key -out $site.key
apache 方は httpd-ssl.conf とかなんかそういう付属のテンプレを引っ張ってきて証明書関係のファイルを設定。
(メインの httpd.conf から Include するようにするとかそんな感じで)
SSLCertificateFile "/usr/local/etc/apache22/private/svnserver.localnet.localdomain.cer"
SSLCertificateKeyFile "/usr/local/etc/apache22/private/svnserver.localnet.localdomain.key"
SSLCertificateChainFile "/usr/local/etc/apache22/private/svnserver.localnet.localdomain.crt"
後は virtualhost やらなにやら設定すればできあがりです。
って本当にこれでいいのか微妙に自信ありませんが(SSLCertificateFile の所を証明書チェーンのファイル名書いちゃってもちゃんと動いたし…)備忘録的な意味も含めて日記にしたためておきます。
SBS 2008 の enterprise PKI で他 web server のSSL証明書を作った More ログイン