SSH.NET Library で暗号化通信


PuTTY でポートフォワードする際にウィンドウが出て鬱陶しいのでポートフォワード専用アプリでも作ろうかなと思って .NET Framework 向けの SSH ライブラリーを調べたら SSH.NET Library というものを見つけました。リモートコマンドの実行や SFTP といった SSH の基本的な機能をサポートします。

SSH.NET Library が扱える秘密鍵の形式は OpenSSH です。 PuTTY の場合は事前に秘密鍵を PuTTYgen で OpenSSH 形式のファイルに変換しておく必要があります。

私の目的であったポートフォワードの例を次に示します。ホストの 8080 番ポートをクライアントの 58080 番ポートにフォワーディングするという想定です。

using System.Net;
using Renci.SshNet;

using (key = PrivateKeyFile(@"X:\Path\To\PrivateKeyFile", "my secret passphrase"))
using (connection = PrivateKeyConnectionInfo("ssh.example.com", "user", key))
using (client = SshClient(connection))
{
   client.Connect();
   def loopback = IPAddress.Loopback.ToString();
   using (forward = ForwardedPortLocal(loopback, 58080u, loopback, 8080u))
   {
      client.AddForwardedPort(forward);
      forward.Start();
      // Here we can access to localhost:58080
      forward.Stop();
   }
   client.Disconnect();
}

ForwardedPortLocal の第一引数 (boundedHost) がないコンストラクターもあるのですが,省略すると常に ArgumentException が投げられるので実質省略不可です。

サンプルアプリケーション

サンプルアプリケーションを作成しました。タスクトレイに常駐するポートフォワード専用クライアントです。

更新履歴

  • [2012-07-25 21:00 更新] クライアントのポート番号を 80 から 58080 に変更。予約済みでないポート番号にした。
  • [2012-07-26 19:00 更新] サンプルアプリケーションを追加。