CyberduckのSFTP接続でInvalid Item Lengthと出たときの対応


macOS上でCyberduckをFTP等のファイル転送クライアントに使っている方も多いかと思います。

先日、新しいチームメンバー(非エンジニア)がSFTPでファイルをアップロードするために設定をしようとしたが、うまく行かない問題にぶつかりました。

その際の調査から、予想外の結果に行き着いたので紹介します。

エラー内容

エラーとしては

Invalid Item Length (-XXXXXXXX)

みたいなものでした( XXXXXXXは適当な数字です)。

まずは疑う鍵ペア

SFTPで鍵ペアを利用した認証なので、当然、最初に疑うのは鍵ペアです。

とりあえず鍵ペアに問題がなければ通常のsshでもログインできるはずなので試してみました。

$ ssh -i 秘密鍵へのパス ホスト名

上記を実行したところ問題なくsshでログインできました。

この時点で鍵に問題がある可能性は(ほぼ)消えます。

Cyberduckのデバッグ出力をONに

とりあえずCyberduckのデバッグ出力をONにしました。

macOSでは以下のコマンドでデバッグログが /var/log/system.log に出力されるようになります。

$ defaults write ~/Library/Preferences/ch.sudo.cyberduck.plist logging debug

こちらでSFTPを試してみましたが、特に目ぼしいものは出てきませんでした…

デバッグ出力が不要になったら

残しておいて特に害があるわけではありませんが、上記設定を戻す場合は defaults deleteで削除するのをお忘れなく。

$ defaults read ~/Library/Preferences/ch.sudo.cyberduck.plist logging    # 設定されているか確認
debug
$ defaults delete ~/Library/Preferences/ch.sudo.cyberduck.plist logging  # 削除する
$ defaults read ~/Library/Preferences/ch.sudo.cyberduck.plist logging    # 設定されていないことを確認
2018-11-10 17:05:07.378 defaults[10390:76555]
The domain/default pair of (/Users/********/Library/Preferences/ch.sudo.cyberduck.plist, logging) does not exist

ssh-agentは使えた

Cyberduckのログを見ていてSSH Agent的な文言が出ていたので調べてみたところ、CyberduckのWiki に以下の記述がありました。

There is support for OpenSSH ssh-agent

どうやら、ssh-agent(macOSではデフォルトで動作しています)に登録してある秘密鍵を自動的に使ってくれるようです。

試す価値はありそうだな、と思い秘密鍵を追加してみました。

$ ssh-add 秘密鍵へのパス

案の定、ログを見ているとssh-agentが使われ、Cyberduckで無事に接続できました。

ただ、これでは ssh-add を毎回ターミナルで入力するか、何かしら設定をしておく必要があることになり、少し面倒です。

また、Cyberduckの設定だけでうまくいかないことの根本解決になっておりません。

もう少し調べてみました。

変わっていたOpenSSHのデフォルト

秘密鍵を試しに見てみました。

$ cat 秘密鍵へのパス
-----BEGIN OPENSSH PRIVATE KEY-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    :
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END OPENSSH PRIVATE KEY-----

で、更にさきほどのCyberduckのWikiを眺めていると、以下のような記述がありました。

Private keys containing a DSA or RSA private key in PEM format are supported (look for -----BEGIN DSA PRIVATE KEY----- or -----BEGIN RSA PRIVATE KEY----- in the file)..

・・・

・・・・・・・

あれ

BEGIN OPENSSH PRIVATE KEY BEGIN RSA PRIVATE KEY

ちょっと違う

そうなんです。どうやら、OpenSSH 7.8以降からssh-keygenで生成される秘密鍵のフォーマットのデフォルトが変更されていたようで、Cyberduckは対応していなかったのです(ログにはそんな風に出てなかったけど…)

OpenSSH 7.8のリリースノートより

ssh-keygen(1): write OpenSSH format private keys by default
instead of using OpenSSL's PEM format. The OpenSSH format,
supported in OpenSSH releases since 2014 and described in the
PROTOCOL.key file in the source distribution, offers substantially
better protection against offline password guessing and supports
key comments in private keys. If necessary, it is possible to write
old PEM-style keys by adding "-m PEM" to ssh-keygen's arguments
when generating or updating a key.

古いフォーマットで生成する場合は-m PEMssh-keygenに渡せば良いらしいです。

$ ssh-keygen -m PEM

中身を確認してみます。

$ cat 秘密鍵へのパス
-----BEGIN RSA PRIVATE KEY-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    :
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END RSA PRIVATE KEY-----

ちゃんと前のフォーマットになってますね

今回はじめて知ったのですが、秘密鍵のRSAとかOPENSSHってフォーマットを表してるんですね。

参考Stackoverflow: https://stackoverflow.com/a/20065522/

とりあえず無事にCyberduckの設定だけでSFTPできるようになりました。