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に設定されることがあります。
質問が再び現れる
エラーを再現してみましたが、私には効果があるようです。以下で私が何をしたかを説明し、問題に関するいくつかの推測について説明します。
- ディレクトリを作成してサンプル
sftp_write.c
ファイルにコピーします。libssh2。 - 27行目から
auth_pw
に変更します。1
0
- 私のキーを使用するように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;
}
- 変更
#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>
私の設定に合わせて。
- 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
- プログラムの実行
./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