[Git] 9.2. SSH 키 생성 및 사용하기

업데이트:

카테고리:

태그: , , ,

SSH란 무엇일까?

SSH 프로토콜은 원래 unix나 linux 같은 OS에 안전하게 접속하기 위해 만들어졌다. 보안상 문제점이 있었던 기존의 방식을 개선하기 위해 만들어졌고, 앞에 안전한(secure) 이라는 수식어가 붙는다.

윈도우에서 사용하는 putty나 secure CRT라는 프로그램들이 SSH를 사용하며, git도 SSH를 이용해서 안전하게 데이터를 주고 받을 수 있다.


SSH 키 생성하기

이전까지 사용해오던 https 방식은 GitHub에 내가 올바른 사용자라는 것을 알려주기 위해서 사용자 ID/PW를 이용해서 사용자 인증을 하였다. SSH를 이용하면 공개키 / 비밀키 방식을 사용한다.

공개키는 자물쇠, 비밀키는 열쇠이다. 내 컴퓨터에 열쇠를 저장하고 GitHub에 자물쇠를 업로드하는 방식이다.

SSH를 사용하기 위한 첫 단계로 먼저 SSH 키를 생성해야 한다. 여러 방법 중 우리는 Git Bash에서 SSH-keygen 명령을 이용해서 만들어보겠다.


tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ ssh-keygen

# ssh-keygen 명령을 이용해서 SSH key를 생성

Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/tmdgn/.ssh/id_rsa):

# Enter 키를 누른다.

Created directory '/c/Users/tmdgn/.ssh'.
Enter passphrase (empty for no passphrase):

# Enter 키를 누른다.

Enter same passphrase again:

# Enter 키를 누른다.

Your identification has been saved in /c/Users/tmdgn/.ssh/id_rsa
Your public key has been saved in /c/Users/tmdgn/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:83NRy/EMcA6J612JAdo/Ll6tJ8obC1amZloOopinEf4 tmdgn@ASUSSH
The key's randomart image is:
+---[RSA 3072]----+
| .oo.. |
(생략)
|+o.E . . \*o.o |
+----[SHA256]-----+

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ cd ~/.ssh/

# 키가 저장된 폴더로 이동

tmdgn@ASUSSH MINGW64 ~/.ssh
$ pwd

# 현재 폴더 경로 확인

/c/Users/tmdgn/.ssh

tmdgn@ASUSSH MINGW64 ~/.ssh
$ ls

# 현재 폴더의 두 개의 키 파일 확인

id_rsa id_rsa.pub

tmdgn@ASUSSH MINGW64 ~/.ssh
$ cat id_rsa.pub

# 공개키 확인, 내용을 메모장에 붙여넣는다.

ssh-rsa
AAAAB3NzaC1yc2EAA...

위 코드를 실행한 결과는 내 비밀키가 온전히 드러난 상태이므로, 코드만 기록하는 것으로 대체한다.

$ ls 명령으로 파일 목록을 확인하면 pub 확장자가 있는 파일과 없는 파일 두 개를 확인할 수 있다. id_rsa.pub 파일이 공개키(public key)이고, 확장자가 없는 id_rsa가 비밀키이다.

공개키의 내용을 메모장에 복사/붙여넣기 해둔다.


GitHub에 키 등록하기

우리가 생성한 키를 GitHub에 등록해야 사용할 수 있다. 공개키와 비밀키 중 공개키를 GitHub에 등록해야 한다. 집 문에 자물쇠가 있는 것과 비슷한 원리이다.

image

GitHub 페이지에서 [Setting - Account settings - SSH and GPG Keys] 메뉴를 선택하면 SSH Key와 GPG Key를 추가할 수 있는데 여기서 우리는 SSH key 오른쪽에 있는 [New SSH key] 버튼을 클릭해서 SSH key를 추가한다.

※ 참고 ) GPG Key는 무엇일까? GPG Key는 작업에 서명을 할 때 사용한다. 중요한 서류에 친필 사인을 하는 것처럼 PC 작업을 한 사람이 진짜 나라는 것을 증명하기 위해 사용한다.


image

SSH key 추가 화면에서 [Title]은 적당한 내용을 써넣는다. ‘내 컴퓨터 공개키’ 이런 식으로 명확하게 어떤 공개키인지를 알려주는 내용이 좋다. 아래의 [Key]에는 앞 단계에서 메모장에 붙여넣은 공개키의 내용을 붙여넣는다.

image

Key is invalid. 즉, 키가 유효하지 않다는 오류 배너가 떴다. 어떤 것이 문제였는지 다시 천천히 살피니까 공개키에 ssh-rsa가 포함되어야 하는 것이었다.

image

ssh-rsa 텍스트를 추가하여 아래와 같이 정상적으로 SSH key를 등록할 수 있었다.

image


SSH를 이용해서 저장소 클론하기

생성한 SSH key가 잘 동작하는지 확인해야 한다. 사용자 계정에 있는 원격저장소의 주소를 하나 클립보드에 복사한다. SSH를 사용하려면 이 주소에서 https://github.com/ 부분을 git@로 바꾸고 git@github.com: 으로 바꾸면 된다. ’:’ 기호가 있음에 주의해야 한다.


1. SSH로 원격저장소 클론하기 1

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ pwd
/c/Users/tmdgn/Documents/hello-git-cli

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git clone git@github.com:Orchemi/hello-git-cli.git

# 아쉽게도 실패한다.

Cloning into 'hello-git-cli'...
The authenticity of host 'github.com (52.78.231.108)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

위 코드의 실행결과는 아래와 같다.

image

왜 클론에 실패하는걸까. **SSH 설정 파일을 만들어주지 않았기 때문이다.


2. SSH 설정 파일 만들기

$ echo "Host github.com" >> ~/.ssh/config

위 코드의 실행 결과는 다음과 같다.

image

위 명령에 의해 홈 폴더 아래에 /.ssh/config 파일이 생성된다. 다음 단계는 VSC에서 해당 파일의 내용을 아래와 같이 수정하고 저장한다.


3. SSH 설정 파일 내용

Host github.com
Hostname github.com
IdentityFile ~/.ssh/id_rsa

VSC에서 config 파일을 직접 수정한 모습이다.

image

설정 파일의 내용은 간단하게 ‘github.com 에서 사용자 식별을 위해 .ssh/github_rsa 파일을 사용하라’는 뜻이다.

이제 다시 클론을 시도해본다.


4. SSH를 이용해서 clone 및 push 해보기

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git clone git@github.com:Orchemi/hello-git-cli.git
Cloning into 'hello-git-cli'...
The authenticity of host 'github.com (52.78.231.108)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
remote: Enumerating objects: 25, done.
remote: Counting objects: 100% (25/25), done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 25 (delta 3), reused 23 (delta 1), pack-reused 0
Receiving objects: 100% (25/25), done.
Resolving deltas: 100% (3/3), done.

tmdgn@ASUSSH MINGW64 ~/Documents/hello-git-cli (master)
$ git push
Everything up-to-date

위 코드의 실행 결과이다.

image

SSH를 이용해서 클론에 성공했다. 이전에 떴던 장문의 메시지는 지문 관련해서 연결을 할 것인지에 대한 물음이었고, yes를 택하며 clone에 성공했다. push도 정상적으로 동작한 것이다.

SSH 인증은 cache에 저장하는 옵션에 비해 PW가 노출되지 않는다는 장점이 있기 때문에 종종 사용된다.

만약 비밀키가 외부에 노출된다면? 그냥 GitHub에 등록된 공개키를 제거하고 새로운 공개키 비밀키를 만들어서 다시 등록하면 된다.


다양한 인증이 존재하는 이유

상황에 따라 다양한 인증이 모두 사용될 수 있기 때문에 Git과 GitHub에서는 다양한 인증 방법을 제공하고 있다. 최근에는 DevOps(개발과 운영을 함께 하는 기업 문화)나 배포 자동화 등이 IT 회사의 트렌드인데 이런 개발 기법에 Git을 잘 적용하기 위해서도 다양한 인증 방법을 이해하고 필요에 따라 적용하는 것이 좋다.


Reference

  • 팀 개발을 위한 Git GitHub 시작하기, 한빛미디어, 정호영,진유림

댓글남기기