해결하기 - ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

Kim Dong Kyun·2024년 9월 20일
0

개요

Github Actions 로 CI/CD 워크플로우를 아래와 같이 작성하고, 여러가지 세팅을 거쳤다.

name: Java CI with Gradle and Docker

on:
  push:
    branches:
      - main

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      # 1. GitHub 저장소에서 코드 체크아웃
      - name: Checkout repository
        uses: actions/checkout@v4

      # 2. JDK 17 설치
      - name: Set up JDK 17
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'

      # 3. Gradle 빌드
      - name: Build with Gradle
        run: ./gradlew build

      # 4. Docker 이미지 빌드
      - name: Build Docker image
        run: docker build -f Dockerfile -t ${{ secrets.DOCKERHUB_USERNAME }}/pr-deliver .

      # 5. Docker Hub 로그인
      - name: DockerHub login
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_PASSWORD }}

      # 6. Docker Hub에 이미지 푸시
      - name: Push Docker image
        run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/pr-deliver

      # 7. SSH를 통해 EC2 인스턴스에 접속하여 애플리케이션 배포
      - name: Deploy to EC2 via SSH
        uses: appleboy/ssh-action@v0.1.3
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ubuntu # EC2 사용자 이름 (Amazon Linux일 경우 'ec2-user')
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          port: 22
          script: |
            # Docker Hub에서 최신 이미지 풀
            docker pull ${{ secrets.DOCKERHUB_USERNAME }}/pr-deliver
            
            # 기존 컨테이너가 실행 중이면 중지
            docker stop pr-deliver || true
            
            # 기존 컨테이너 삭제
            docker rm pr-deliver || true
            
            # 새로운 컨테이너 실행
            docker run --name pr-deliver --rm -d -p 8080:8080 \
              -e JASYPT_ENCRYPTOR_PASSWORD=${{ secrets.JASYPT_PASSWORD }} \
              ${{ secrets.DOCKERHUB_USERNAME }}/pr-deliver

위와 같이 설정하고, EC2 에서 SSH key 발급받고(그리고 퍼블릭키도 설정해주고, 권한설정하고...), 깃허브에서 시크릿 넣어주고, 돌렸는데 안되더라. 에러는 아래와 같다.

...

# 새로운 컨테이너 실행
docker run --name pr-deliver --rm -d -p 8080:8080 \
  -e JASYPT_ENCRYPTOR_PASSWORD=*** \
  ***/pr-deliver

======END======
2024/09/20 12:29:34 ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

라는 오류가 발생했다. 왤까?

1. 로컬에서 테스트해보기

mkdir -p ~/.ssh
nano ~/.ssh/id_rsa

로 프라이빗 키 파일을 하나 생성하고, (해당파일엔 프라이빗키를 넣어준다)

chmod 600 ~/.ssh/id_rsa

로 권한을 설정한다.

ssh -i ~/.ssh/id_rsa {퍼블릭 DNS || IP}
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

yes 를 눌러준다.

그러면 잘 접속이 된다. 근데 왜 workflow에선 실패하지?


https://github.com/appleboy/ssh-action/issues/297

위 링크를 보면,

I was facing the same issue and spent hours trying to resolve it. Turns out, it was a version issue. Got resolved for me once I started using: appleboy/ssh-action@master

라는 글이 있다. 버전관련 문제로 이슈를 겪고 있다는 뜻이라고 하네.

      # 7. SSH를 통해 EC2 인스턴스에 접속하여 애플리케이션 배포
      - name: Deploy to EC2 via SSH
        uses: appleboy/ssh-action@v0.1.3 // 여기를 appleboy/ssh-action@master 로 바꾸자.
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ubuntu # EC2 사용자 이름 (Amazon Linux일 경우 'ec2-user')
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          port: 22
          script: |

잘 작동한다.

결론

애플실리콘을 사용한다면 EC2 에 SSH 를 사용하여 접속 시,

uses : appleboy/ssh-action@master

를 추가해준다.

0개의 댓글