HTTPSベースのリポジトリのSSLサーバ証明書を信頼するには。

自分はファイルベースのBasic認証やDigest認証を使ってWebDAVベースのSubversionリポジトリを立てて使うことが多いのだが、SSLを使ってHTTPSリポジトリにアクセスすると、以下のように「証明書を信用していいの」って聞かる。

$ svn update --username hoge --password piyo 
Error validating server certificate for 'https://svn.example.net:443':
 - The certificate is not issued by a trusted authority. Use the
   fingerprint to validate the certificate manually!
Certificate information:
 - Hostname: *.example.net
 - Valid: from Tue, 22 Jan 2008 02:10:42 GMT until Sun, 20 Jul 2008 02:10:42 GMT
 - Issuer: http://www.cacert.org, Root CA
 - Fingerprint: ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:ff:f1:17:be:5e:2f:3e:ff:ff:ff
(R)eject, accept (t)emporarily or accept (p)ermanently? p


一般的には、ここで上記のようにp(永遠に信用)と答えれば次からは同じ質問が出なくなるようだ。

だが自分は、ここでpと答えてもなぜか次からも毎回同じ質問を聞かれるという問題にぶちあたった。

特に、以下のような感じで自動デプロイCGIなんかを使ってサーバに最新を持ってゆく楽チンさが個人的には大事だと思っているので、問題はそこそこ深刻だった。だってこれだとCGIちゃんと動かないんだもん。

http://akio.way-nifty.com/ja/2007/09/subversion_upda_52be.html

これまでは会社の中から社内にあるリポジトリなんかを参照していただけだったので、この問題に対するワークアラウンドとして、とりあえず「まあ社内なんだからいっか」ということでリポジトリをHTTPでも参照できるようにしてごまかしてた。

でも、自宅サーバを立ててそこに自宅外含めてアクセスする場合はやっぱりSSLで通信したい。

そういうわけで、解決策をしらべてみたところ2つ方法が見つかった。

強引な回避策

<<< を使ってしまう。要するに上記で、「(p)永遠に?」と聞かれて「p」って答える部分を含めて、最初からCGIに組み込んでしまう。

$ svn update --username hoge --password piyo <<<"p"

うーん。これでも実用上は困らないけど、明らかにエレガントではない・・

きっとこれが正解

ちゃんと設定してやる。

っていうか、この問題は「永遠によろしく」って答えても、その情報をちゃんと保存できていないことが問題であることは容易に想像がつく。要するに上記でいうところのhogeというユーザが、「証明書を信頼しますよー」と答えても、hogeというユーザ向けの設定情報管理場所がないことが原因と思われる。

hogeunixユーザであれば、 ~/.subversion/以下に設定が保存されるようだが、私の場合、前述のようにリポジトリの認証にファイルベースのBasic認証やらDigest認証を使っているので、上記でいうhogeはただのBasic/Digest認証用ユーザでありunixユーザではない。つまり~が存在しない・・

まあ、そういうからくりで、何度「永遠に信用」っていっても覚えてくれないのだろう。(SVNさんも、pって答えたときに覚えられなかったんなら、せめてそのように一言エラーメッセージ出してくれたっていいじゃんとも思う。)

svn updateコマンドには --config-dirというオプションがあるので、それを使えば解決できそうだ。

$ svn update --username hoge --password piyo --config-dir /srv/svn/config/client

結果、一回目は同じように質問が出てきたが、一度pと答えたら、上記/srv/svn/config/client/ディレクトリに、authなんていうディレクトリが出来て、そこに色んなファイルがが作成され、その後同じコマンドを投げたときは質問がでなくなった。

これでSSLベースリポジトリにアクセスするSVN更新CGIがかける^^

めでたしめでたし。

余談

ちなみに、リポジトリディレクトリって皆さんどこに置いているのかなぁ?
これまで自分は以下のように/srv/svnリポジトリを複数置けるように設定していたんだけど、

SVNParentPath /srv/svn/

今回の件を受けて、以下のようにリポジトリ置き場を一段下げました。

SVNParentPath /srv/svn/repos

というのは、以下のようなディレクトリ構成にして、/srv/svn以下に設定ファイル置き場もつくりたかったからです。

/srv/svn/repos          #リポジトリ用
/srv/svn/config         #設定用
/srv/svn/config/server  #サーバとしての設定用
/srv/svn/config/client  #クライアントとしての設定用

設定ファイル置き場を.subversionみたいに.から始まる名前にしておけばParentPath上にあっても外から見えなくなるんだろうけど、やっぱり設定ファイル置き場が隠れてるのってなんだかか個人的には嫌かなぁ・・。

むしろ、hogeってunixユーザを作るべきっていう話もあるけど、SVNまわりの設定やらファイルは一箇所にまとめたほうが個人的には覚えやすい。

そういうわけです。 /srvとかいいながら clientっていうディレクトリはどうよ?とか、そういう風にも思うけど、そこは「まあいいや」ということで^^