개요
Jenkins 파이프라인에서 ssh-agent를 사용해 원격 서버로 접속하는 작업을 구상하던 중에,
Permission denied (publickey) 와 error in libcrypto 에러를 연달아 마주쳤습니다.
문제 자체는 단순했지만, SSH 키 인증에 대한 착각 때문에 원인을 파악하는 데 조금 시간이 걸렸네요..
이 글을 통해서
- 내가 어떤 부분을 착각했는지
- SSH 키 인증이 실제로 어떻게 동작하는지
- Jenkins + ssh-agent 환경에서 무엇을 설정해야 하는지
- 최종적으로 어떻게 해결했는지
를 순서대로 정리해보고자 합니다.
문제 상황
Jenkins 파이프라인에서 다음과 같이 SSH 접속을 시도하였습니다.
sshagent(credentials: ['ssh-key']) {
sh 'ssh jhlee37@192.168.219.111 echo "Hello"'
}
하지만 파이프라인 로그에는 다음과 같은 에러가 발생했네요.

이후 키를 바꿔가며 시도하던 중에 다음 에러도 발생하였습니다.

착각했던 부분
제가 처음에 가지고 있던 생각은 이랬습니다.
“원격 서버에서 ssh-keygen으로 키 페어를 만들었고,
그 개인키(id_rsa)를 Jenkins credentials에 등록했으니
Jenkins에서 원격 서버로 바로 접근이 되어야 하는거 아닌가?”
이 생각의 착각은 단 한가지였죠.
- SSH 키를 “어디에서 생성했는지”가 중요하다고 착각한 것!
SSH 키 인증 실제 구조
SSH 키 인증은 생성 위치와 무관하게 다음 구조로만 동작합니다.
[접속하는 쪽 (Client)] → private key
[접속받는 쪽 (Server)] → public key (authorized_keys)
즉,
- Jenkins는 SSH 클라이언트
- 원격 서버는 SSH 서버
라는 점이 핵심인거죠.
SSH 인증 흐름
- Jenkins가 private key로 인증을 시도
- 원격 서버는
~/.ssh/authorized_keys에 등록된 public key들과 비교 - 일치하는 public key가 있으면 접속 허용
-> 서버는 private key를 절대 보지 않는다!!
그래서 반드시 필요한 작업
1. 키 페어 생성
원격 서버에서 생성했지만, 사실 그 위치는 중요하지 않습니다.
ssh-keygen -t rsa -b 4096 -m PEM -f jenkins_id_rsa
생성 결과
jenkins_id_rsa # 개인키 (private key)
jenkins_id_rsa.pub # 공개키 (public key)
2. 개인키 -> Jenkins credentials 등록
Jenkins 관리 화면에서
- Kind: SSH Username with private key
- Username:
jhlee37 - Private Key:
jenkins_id_rsa내용
-> Jenkins가 접속 주체이므로 개인키는 Jenkins가 가진다
3. 공개키 -> 원격 서버에 등록
cat jenkins_id_rsa.pub >> ~/.ssh/authorized_keys
최종 검증!
위 조건에 맞춰 다시 파이프라인을 실행해봤더니 결과는?

성공!!