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 형식 키를 사용해 보았습니다.
다음 두 가지 형식에서 오류가 발생합니다.
표준 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 공개 키 인증에는 서버와 클라이언트라는 두 대의 시스템이 필요합니다. 클라이언트는 개인 키와 공개 키 쌍을 생성해야 하며, 공개 키 인증을 시도하기 전에 사용 가능한 방법을 사용하여 공개 키를 서버에 복사해야 합니다. 개인 키는 클라이언트 밖으로 나가서는 안 됩니다.
클라이언트를 사용하여 서버에 연결할 때는 개인 키를 사용해야 합니다. 공개 키만 사용한 인증은 협상 패킷을 암호화할 수만 있고 실제로 해독할 수는 없으므로 작동하지 않습니다. 끝까지 읽어보세요문서또한 개인키가 필수라고 명시되어 있으나, 경우에 따라 공개키가 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