SVN+SSHの鍵認証セットアップ(Cornerstone編)

Macの高機能SVNクライアントことCornerstoneでの
SVN+SSH鍵認証による環境構築のメモです。

なお、手順1〜4はCUI編と全く一緒です。

1.公開鍵・秘密鍵の作成
認証用の公開鍵・秘密鍵を作成します。
なお、既にSSH認証用の鍵を持っている場合でも一から作成します。(理由は後述)

ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (ホームディレクトリ/.ssh/id_rsa): key.svn
Enter passphrase (empty for no passphrase):パスワード
Enter same passphrase again:パスワード
Your identification has been saved in key.svn.
Your public key has been saved in key.svn.pub.

2.公開鍵の登録
作成した公開鍵をサーバに登録します。
サーバの~/.ssh/authorized_keysに
作成した公開鍵ファイル(上記ではkey.svn)の内容をコピペします。

vi ~/.ssh/authorized_keys
公開鍵データ
公開鍵データ
 ・・・
末尾に新たに作成した公開鍵データをペースト

ここで、ペーストした公開鍵の前に以下command〜を挿入します。

公開鍵データ
公開鍵データ
 ・・・
command="/opt/bin/svnserve -t" 末尾に新たに作成した公開鍵データをペースト

svnserveへのパスはご自身のサーバの環境をご確認ください。
これをしないと、SVN+SSHログインしたときに以下の様にsvnserveコマンドが無いよと
怒られてしまう場合があります。

svn checkout svn+ssh://ホスト名
bash: line 1: svnserve: command not found
svn: To better debug SSH connection problems, remove the -q option from 'ssh' in the [tunnels] section of your Subversion configuration file.
svn: Network connection closed unexpectedly

このcommand〜を挿入することで上記のエラーを回避できます。
しかし、その代償としてSSHで正常にログインできなくなります。
新しく鍵を作成するのはこのためです。

3.SSHデーモン再起動
authorized_keysの設定を有効にするために、SSHデーモンを再起動します。

4.クライアントのSVN+SSH接続設定
SVN(CUI)でSSH接続出来るように、$SVN_SSHに設定情報を追加します。

SVN_SSH="ssh -p ポート番号 -i 秘密鍵のフルパス"
export SVN_SSH

5.既に登録されている秘密鍵の削除
チェックアウト元のサーバの接続で使用する秘密鍵が登録されていると、
svn用に新たに作成した秘密鍵で上手く接続してくれません。
そこで、登録済みの秘密鍵を削除します。

ssh-add -D

6.リポジトリのチェックアウト
CornerstoneにてSSHトンネル+鍵認証を用いてチェックアウトします。

Cornerstoneを起動し、「Add Repository」ボタンをクリックします。

cornerstone_start

「SVN Server」タブを選択します。
SVNサーバの設定画面が表示されたら、「Tunnel」を「SSH」にします。

cornerstone-tunnelselect

「Server」にご自身のサーバホスト名、
「Repository Path」にサーバのリポジトリ絶対パスを入力してください。
入力したら、「Add」ボタンをクリックします。

cornerstone-host-path

チェックアウトが成功すると、リポジトリブラウザ画面が表示されます。

cornerstone-ssh-success

公開鍵・秘密鍵の設定はCUIの時とほぼ同様です。
一度秘密鍵を登録すると、常にその秘密鍵で接続しに行ってしまうので、
一度ssh-addコマンドで登録した鍵を削除する必要がある点に気をつければ
問題無いと思います。

■参考文献
Apache Subversion FAQ
Connecting to an SVN Server via a Tunnel – Cornerstone