libssh2公開鍵認証にはどの公開鍵形式を使用する必要がありますか?

libssh2公開鍵認証にはどの公開鍵形式を使用する必要がありますか?

libssh2ライブラリのsftp_write例の公開鍵(id_rsa.pub)を渡そうとします。

const char *pubkey = "/home/username/.ssh/id_rsa.pub";
const char *privkey = NULL;

if(libssh2_userauth_publickey_fromfile(session, username,

                                       pubkey, privkey,
                                       password)) {
    fprintf(stderr, "\tAuthentication by public key failed\n");
    goto shutdown;
}

以下のようにopenssh形式と標準ssh形式キーを試してみました。

次の 2 つの形式でエラーが発生します。

  • 標準SSHフォーマット、Athentication failed: cannot open the file -16

    ---- BEGIN SSH2 PUBLIC KEY ----
    AAAAB3NzaC1yc2EAAAADAQABAAABAQCjnPF5vKg7NuUXkGbK0Nh5d3GjLNXHB+VozgVn5Ego
    DVSjwezr30YJm8gzGrk5aUAEJKbWSUczVj9vCrn7O54K1/VXOggC1a6pun3+Iqvuv0BINRj3
    YuC+c9s803mYPSpzZpNPFf3Uj49lKrroUIdnEz3qo/Z9kFbpWfClJPlb7xjrZaZkSgolbxih
    8gZ0w3iAuMR5nwnEGQnHkk751jxOtYopzT4w31gFmFYcq/LRbP4S2xJ0r8wl58J8Mm/U/yZx
    EhDARHx/mkqMILofAqFvsFSaaASUuFmB9uUJsgJ69s9FbgXnpGhyGoH0nyVsdM/oqwIXtJji
    IvbVBEomnCrX
    ---- END SSH2 PUBLIC KEY ----
    
  • SSH形式を開く、認証に失敗しました

       LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED \ 
       LIBSSH2_ERROR_AUTHENTICATION_FAILED ,-18
    
    "ssh-rsa" AAAAB3NzaC1yc2EAAAADAQABAAABAQCjnPF5vKg7NuUXkGbK0Nh5d3GjLNXHB+VozgVn5EgoDVSjwezr30YJm8gzGrk5aUAEJKbWSUczVj9vCrn7O54K1/VXOggC1a6pun3+Iqvuv0BINRj3YuC+c9s803mYPSpzZpNPFf3Uj49lKrroUIdnEz3qo/Z9kFbpWfClJPlb7xjrZaZkSgolbxih8gZ0w3iAuMR5nwnEGQnHkk751jxOtYopzT4w31gFmFYcq/LRbP4S2xJ0r8wl58J8Mm/U/yZxEhDARHx/mkqMILofAqFvsFSaaASUuFmB9uUJsgJ69s9FbgXnpGhyGoH0nyVsdM/oqwIXtJjiIvbVBEomnCrX
    

公開鍵形式の問題であるか誰かが提案できますか?

libssh2 クライアントの公開鍵認証をテストするために Windows で Bitvise サーバーを使用しています。

答え1

libssh2に秘密鍵を渡さないようです。

SSH公開鍵認証には、サーバーとクライアントという2つのシステムが必要です。クライアントは秘密鍵と公開鍵のペアを生成し、公開鍵認証を試みる前に、使用可能な方法を使用して公開鍵をサーバーにコピーする必要があります。秘密鍵はクライアントから出てはいけません。

クライアントを使用してサーバーに接続するときは、秘密鍵を使用する必要があります。公開鍵のみを使用した認証は、ネゴシエーションパケットを暗号化するだけで、実際には復号化できないため、機能しません。最後まで読んでください文書また、秘密鍵が必須と指定されていますが、場合によっては公開鍵がNULLに設定されることがあります。

質問が再び現れる

エラーを再現してみましたが、私には効果があるようです。以下で私が何をしたかを説明し、問題に関するいくつかの推測について説明します。

  1. ディレクトリを作成してサンプルsftp_write.cファイルにコピーします。libssh2
  2. 27行目からauth_pwに変更します。10
  3. 私のキーを使用するようにpubkeyとprivkeyを変更し、デバッグを追加しました。
    const char *pubkey = "/home/user/.ssh/id_rsa_PEM.pub";
    const char *privkey = "/home/user/.ssh/id_rsa_PEM";
    int liberr;
    if(liberr = libssh2_userauth_publickey_fromfile(session, username,
                                               pubkey, privkey,
                                               password)) {
        fprintf(stderr, "\tAuthentication by public key failed: %d\n", liberr);
        goto shutdown;
    }
  1. 変更
#include "libssh2_config.h"
#include <libssh2.h>
#include <libssh2_sftp.h>

#ifdef HAVE_WINSOCK2_H
# include <winsock2.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
#ifdef HAVE_NETINET_IN_H
# include <netinet/in.h>
#endif
# ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_ARPA_INET_H
# include <arpa/inet.h>
#endif

到着

#include <libssh2.h>
#include <libssh2_sftp.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>

私の設定に合わせて。

  1. Dockerを使用して画像をコンパイルして実行する
docker run -i --rm \
    -w $(pwd) -v $(pwd):$(pwd) \
    -v /etc/passwd:/etc/passwd:ro  \
    -v /etc/group:/etc/group:ro \
    -u $(id -u):$(id -u) \
    datafr/libssh2:latest \
    gcc -g -I /usr/include/ -L /usr/lib/ -l ssh2 sftp_write.c -o a.out
  1. プログラムの実行
./a.out 127.0.0.1 $USER

結果

このコードを実行すると、エラー-19:が発生しますLIBSSH2_ERROR_PUBLICKEY_UNVERIFIED。これは、Dockerイメージが古いバージョンのlibssh2を使用し、古いPEMキーを必要とするためです。この問題は、新しいキーペアを生成することで解決されました。

ssh-keygen -m PEM -t rsa -P "" -f id_rsa_PEM

新しいキーを使用するようにコードを変更してください。

コードを再実行すると、エラー-18:が発生しますLIBSSH2_ERROR_AUTHENTICATION_FAILED。この問題は、id_rsa_PEM.pubサーバーファイルに新しい公開鍵を追加することでauthorized_keys解決できます。

その後、エラーは発生しなくなり、出力は次のようになります。

$ ./a.out 127.0.0.1 $USER
Fingerprint: XXXXXXX
libssh2_sftp_init()!
libssh2_sftp_open()!
libssh2_sftp_open() is done, now send data!
all done

/tmp/TESTコードを含むファイルが生成されたことを確認できますsftp_write.c

追加の推測

エラー-16:ファイルが存在しないか、権限が正しくない場合に発生するため、LIBSSH2_ERROR_FILEファイル権限を再確認してください。参考のために私の権限を投稿します。

クライアント~/.ssh/ディレクトリ:

$ ls -alh
total 28K
drwx------  2 user user 4,0K Sep 28 15:37 .
drwxr-xr-x 32 user user 4,0K Sep 28 15:36 ..
-rw-rw-r--  1 user user 2,7K Sep 28 15:36 config
-rw-------  1 user user 2,5K Sep 28 15:36 id_rsa_PEM
-rw-r--r--  1 user user  574 Sep 28 15:36 id_rsa_PEM.pub
-rw-------  1 user user 6,3K Sep 28 15:36 known_hosts

サーバー~/.ssh/ディレクトリ:

$ ls -alh
total 20K
drwx------  2 user user 4,0K Sep 28 15:39 .
drwxr-xr-x 32 user user 4,0K Sep 28 15:39 ..
-rw-------  1 user user 3,4K Sep 28 15:39 authorized_keys

関連情報