やりたいこと
Java6でコンパイルした自作アプリから別マシンに、SSHJライブラリを使用して、SSH接続することです。
以前はJSchライブラリを使用して実現しようとしたのですが、こちらの記事に書いたように上手くいかなかないので、JSchライブラリからSSHJライブラリに変更して実現しようとしています。
環境
接続先
- Ubuntu 16.04 LTS
- OpenSSH 7.2p2
クライアント
- Windows 8.1
- 自作アプリ(Java6で開発)
- SSHJ
サンプルコード
SSH接続時にパスワード認証を行うサンプルはたくさん見つかると思いますが、鍵認証(パスフレーズあり)を行うサンプルが少なかったように思えたので、備忘録をかねて、接続に成功したサンプルコードを記載しておきます。
単にSSH接続するだけではツマらないので、SSH接続後にファイルのダウンロードを行うようなコードにしてみました。
オール大文字の英字は、外部から指定してもらうなり、コード内で定義するなりしておく必要がある部分です。
あと、例外処理はだいぶサボってます。
SSHClient ssh = new SSHClient();
ssh.addHostKeyVerifier(new PromiscuousVerifier());
try {
ssh.connect(HOST, PORT);
ssh.authPublickey(USER, ssh.loadKeys(PRIVATEKEYFILEPATH, PASSPHRASE));
ssh.newSCPFileTransfer().download(SRCDIR, new FileSystemFile(DSTDIR));
ssh.disconnect();
ssh.close();
} catch (UserAuthException e) {
e.printStackTrace();
} catch (TransportException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
鍵認証時の注意点
SSHJで使用可能な秘密鍵ファイルは、PEM形式のファイルのようです。
秘密鍵ファイル・公開鍵ファイルはssh-keygen
コマンドを使用して作成すると思いますが、使用するssh-keygen
コマンドのバージョンによっては、デフォルトで以下の形式の秘密鍵ファイルを生成します。
SSHJライブラリでこの秘密鍵ファイルを使用すると認証に失敗します。
-----BEGIN RSA PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
:
:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END RSA PRIVATE KEY-----
SSHJライブラリで認証するためには、以下のような形式の秘密鍵ファイルを使用します。
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
:
:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END RSA PRIVATE KEY-----
上のようなPEM形式の秘密鍵ファイルを生成するためには、ssh-keygen
コマンドのオプションとして、-m PEM
を指定します。
-- 以上 --