제 목 :
Github SSH 키 적용하기

발단
내가 Git 클라이언트 툴로 GitKraken을 쓰고 있는데 가끔 앱을 켜기 귀찮을 때 CLI로 Git 명령을 치고 Push를 올릴때가 있다. 그런데 Github에 Push를 올릴 때면 자꾸 만나는 오류가 있는데 그것은 바로.
저 Password authentication is not supported for Git operations. 오류다. 2021년 8월부터 Github는 아이디/패스워드 기반 Push, Clone, Pull 하는 기능을 공식적으로 종료했다.
(안돼!!!)
사실 난 Github를 잘 쓰지 않고 사설 Git server를 주로 쓰다보니 이 사실을 까먹는 경우가 많은데 이 내용을 정리해야지 정리해야지 하다가 오늘에 이르러서야(5년이나 흘르다니!) 정리를 하기로 했다.
난 맥을 사용하지만 사실 윈도우라고 해서 크게 다를 것은 없다. 이전에 포스팅 했던 SSH Keygen으로 키 만들어서 호스트 접속하기 포스트를 읽어보면 키를 생성하는 방법을 알 수 있으니 생략하겠다.
그럼 이 다음부터는 키를 발행한 이후의 이야기를 해보겠다.
위의 이미지 처럼 SSH 키는 만들었고, 이제 이 키를 Github에 등록해보자.
Windows 10(1809 버전 이상)과 Windows 11에는 OpenSSH 클라이언트가 기본으로 들어 있어서 PowerShell이나 명령 프롬프트(cmd)에서 바로 ssh-keygen을 실행할 수 있다.
Github에 SSH키 등록하기
Github에 로그인을 하면 우측 상단에 프로필 이미지가 보인다. 그걸 클릭하면 Settings 메뉴를 확인할 수 있다.

Settings 안으로 들어가면 우측 메뉴에 SSH and GPG keys라는 메뉴를 확인할 수 있다.

SSH and GPG keys메뉴에 접근하면 지금까지 등록된 SSH키 목록(등록된 키가 없으면 아무것도 보이지 않는다.)과 New SSH key라는 버튼이 보인다. New SSH Key버튼을 클릭하자.

그러면 아까 만들어놨던 SSH 키를 입력할 수 있는 화면이 나오는데 이때 중요한건 .pub확장자의 파일 내용을 붙여넣는 것이다. 공개키 말이야. PRIVATE KEY 어쩌고 하는 내용은 넣으면 절대 안된다. 절대! 절대로!

키를 입력하고 Add SSH key버튼을 클릭하면 일단 Github에 내 SSH 키 등록이 마무리된다.

그럼 내가 만든 SSH키로 Github에 코드를 올려보자.
SSH Key 적용확인하기
SSH Key가 정상적으로 동작하는 방법은 아래의 명령을 사용하면 확인할 수 있다.
ssh -i ~/.ssh/{방금만든 키} -T git@github.com이렇게 입력하면 확인할 수 있다. 나는 github-ed25519라는 이름으로 키를 만들었고 아래 처럼 키가 정상적으로 동작하는 것을 확인했다.
근데 응답 코드에 보면 but Github does not provide shell access.라고 나와있다. 이건 뭐 대단한건 아니고 Github에 SSH 터미널 접근을 시도했는데 Github 서버에 우리가 SSH 터미널로 접근하면 안되고 할 수도 없으니까 발생하는 메시지다. Hi {사용자명}! You've successfully authenticated 응답을 봤으면 성공이라고 생각하면 된다.
저장소에 SSH키를 적용하자.
Git에 SSH 키를 적용하는 방법은 여러가지인데. 하나씩 짚고 가자면 아래와 같다.
명령 한 번만 지정하기(전역 세팅)
가장 간단한 방법은 GIT_SSH_COMMAND 환경 변수에 사용할 키를 적어서 Git 명령 앞에 붙이는 것이다. 이렇게 하면 그 명령을 실행할 때만 지정한 키를 쓴다.
GIT_SSH_COMMAND="ssh -i ~/.ssh/github-ed25519 -o IdentitiesOnly=yes" git push origin main여기서 IdentitiesOnly=yes는 꼭 넣어 주자. 이 옵션이 없으면 ssh-agent에 등록된 다른 키를 먼저 들이밀다가 엉뚱한 계정으로 인증되거나, 시도 횟수를 넘겨서 Too many authentication failures로 튕기는 일이 생긴다.
매번 이렇게 길게 치기 귀찮다면 셸 설정 파일(~/.zshrc 같은 것)에 넣어 버리면 된다. 그러면 모든 저장소에서 이 키를 쓰게 된다.
export GIT_SSH_COMMAND="ssh -i ~/.ssh/github-ed25519 -o IdentitiesOnly=yes"다만 이렇게 하면 사설 Git 서버처럼 다른 키를 써야 하는 곳에도 같은 키가 들어간다. 나처럼 Github 말고 다른 Git 서버도 쓴다면 아래에 나오는 저장소별 설정이 낫다.
PowerShell에서는 환경 변수를 먼저 설정하고 명령을 실행하면 된다.
$env:GIT_SSH_COMMAND = "ssh -i ~/.ssh/github-ed25519 -o IdentitiesOnly=yes"git push origin main명령 프롬프트(CMD)에서는 set으로 설정한다. 따옴표를 "변수=값"처럼 전체에 씌우고, = 앞뒤에는 공백을 넣지 않는다.
set "GIT_SSH_COMMAND=ssh -i ~/.ssh/github-ed25519 -o IdentitiesOnly=yes"git push origin main두 방법 모두 그 창을 닫으면 설정이 사라진다. 계속 쓰고 싶다면 setx로 사용자 환경 변수에 저장하면 된다. 저장한 값은 새로 연 창부터 적용된다.
setx GIT_SSH_COMMAND "ssh -i ~/.ssh/github-ed25519 -o IdentitiesOnly=yes"키 경로를 C:\Users\...처럼 역슬래시로 쓰면 안 된다. Git이 이 값을 셸로 넘기면서 역슬래시를 지워 버려서 키 파일을 못 찾는다. ~/.ssh/...나 C:/Users/...처럼 슬래시로 쓰자.
한 저장소에만 지정하기(git config 세팅)
저장소마다 쓰는 키가 다르다면 core.sshCommand 설정을 쓰면 된다. 저장소 폴더 안에서 아래 명령을 한 번만 실행해 두면, 그 다음부터는 평소처럼 git push만 쳐도 지정한 키를 쓴다.
git config core.sshCommand "ssh -i ~/.ssh/github-ed25519 -o IdentitiesOnly=yes"git push origin main이 설정은 그 저장소의 .git/config 파일에만 저장된다. 그래서 다른 저장소나 사설 Git 서버에는 영향이 없다. 실제로 .git/config를 열어 보면 아래처럼 들어가 있다.
[core] sshCommand = ssh -i ~/.ssh/github-ed25519 -o IdentitiesOnly=yes아직 받지 않은 저장소라면 clone하면서 바로 설정할 수도 있다. -c 옵션으로 넘긴 설정은 clone할 때도 쓰이고, 받은 저장소의 .git/config에도 그대로 저장된다.
git clone -c core.sshCommand="ssh -i ~/.ssh/github-ed25519 -o IdentitiesOnly=yes" git@github.com:{사용자명}/{저장소}.git설정이 잘 들어갔는지 확인하거나 지우고 싶으면 아래 명령을 쓰면 된다.
# 지금 설정된 값 확인git config --get core.sshCommand
# 설정 지우기git config --unset core.sshCommand이 명령들은 Windows의 PowerShell이나 CMD에서도 똑같이 쓸 수 있다. 다만 키 경로는 앞에서 말한 것처럼 역슬래시 대신 슬래시로 쓰자.
두 가지를 확인해 보자.
- remote 주소가 HTTPS인지:
git remote -v로 봤을 때 주소가https://로 시작하면 SSH를 아예 쓰지 않는다.git remote set-url origin git@github.com:{사용자명}/{저장소}.git으로 SSH 주소로 바꾸자. GIT_SSH_COMMAND환경 변수가 남아 있는지: 환경 변수가core.sshCommand보다 우선한다. 앞에서export나setx로 전역 설정을 해 뒀다면 저장소 설정은 무시된다.
Push를 올려보자
나는 저장소에만 키를 등록하고 Push를 올리려고 했다. 하지만 기존에 remote세팅에 https 경로를 넣어놓은 바람에 Username을 입력하라는 메시지가 나왔다. git remote -v를 이용해 remote 주소가 어디로 향해있는지 확인하고 git remote set-url을 이용해 SSH 주소로 변경했다. 그리고 나서는 Push가 정상적으로 확인할 수 있었지.

이미지를 확인해보면 HTTPS/SSH 주소를 토글해가면서 확인할 수 있으니 요 주소를 긁어다가 적용하면된다.
마무리
Github에 SSH 키 적용하는걸 언제간 정리를 해서 글을 써야지 하고 생각만하고 있다가 드디어 정리를 마쳤다. 앓던 이를 뽑은 기분이다. SSH키 등록하는 과정이 매우 귀찮은 일이라서 불편하긴 한데 보안을 위해서라면 이 방법이 옳다. 나 혼자 쓰는 Git Server면 모를까 전세계 사람들이 사용하는 Github의 Repository에 ID/PW로 인증을 해버리면 전 세계에 악성코드를 퍼뜨리는 것도 가능하니까. 그러니 너그러운 우리가 품을 좀 팔아서 안전한 인터넷 세상의 일원이 되는 것이 좋을 것 같다.
안녕!

꼬리말을 불러오는 중...