ssh-keygen: SSH 키 생성과 공개 키 등록, ssh-copy-id 사용법

공정위 광고 문구 Ver 3.1
공정위 광고 문구 Ver 3.2(모바일 전용)
테스트 환경RHEL 계열AlmaLinux 9.8root 계정2026-11-05 확인
네트워크 명령어ssh-keygenssh-copy-id위치/usr/bin/ssh-keygen

ssh-keygen은 SSH 접속에 쓰는 개인 키와 공개 키 한 쌍을 만들고, 지문 확인과 암호 변경, known_hosts 정리까지 맡는 OpenSSH 명령어입니다. AlmaLinux 9 서버에서 ed25519 키와 rsa 키를 만들어 지문을 확인하고 암호와 주석을 바꾼 뒤 ssh-copy-id의 dry-run으로 확인해 보니, 서버로 건너가는 것은 .pub 파일의 공개 키 한 줄뿐이었습니다.

아래 출력의 계정 이름과 키 파일 경로는 예시 값이고, 지문과 공개 키, randomart는 글을 쓰며 만들었다가 지운 키의 값입니다. 서버에 공개 키를 실제로 등록하는 명령은 명령만 적고 실행하지 않았습니다.

1️⃣ ssh-keygen 키 생성: -t ed25519와 -C 주석

키는 ssh-keygen -t 종류 -C 주석 꼴로 만듭니다. -t는 키 종류이고, -C는 공개 키 끝에 붙는 주석이라 이메일이나 용도를 적습니다. 아래는 저장할 파일을 -f로 지정하고 암호 물음 두 번에 그대로 Enter를 친 전체 출력입니다.

ssh-keygen -t ed25519 -C "user@example.com" -f ~/.ssh/id_ed25519
Generating public/private ed25519 key pair.
Enter passphrase for "/home/user/.ssh/id_ed25519" (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:c73KJh85pPijvy43kS1uaQo77fSsGlE4Wz+aMF+sTy8 user@example.com
The key's randomart image is:
+--[ED25519 256]--+
|                 |
|     .           |
|    o o          |
|     = o   .     |
|    =   Soo .    |
|     = *+*.. .   |
|    o.B.o++ .    |
|    .=o*Eo.+     |
|    o+=@OO=      |
+----[SHA256]-----+

암호 물음에서 Enter만 치면 암호 없는 키가 됩니다. -f를 생략하면 암호 물음 앞에 저장할 파일을 묻는 줄이 먼저 나옵니다. 괄호 안에 기본 경로인 홈 폴더 아래 .ssh/id_ed25519가 적혀 있고, 여기서도 Enter만 치면 그 경로에 저장됩니다.

출력 끝의 randomart는 지문을 그림으로 바꾼 것입니다. 키를 만들 때와 -lv로 다시 확인했을 때 같은 그림이 나왔습니다.

ls -l ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.pub
-rw------- 1 user user 411 Oct 29 08:22 /home/user/.ssh/id_ed25519
-rw-r--r-- 1 user user  98 Oct 29 08:22 /home/user/.ssh/id_ed25519.pub

개인 키는 600, 공개 키는 644 권한으로 만들어졌습니다. 개인 키는 내 컴퓨터에만 두고 밖으로 보내지 않습니다.

cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVLiw04ugfXq15n2m8ZDW0OywkRoug8beXw/9VnVY/L user@example.com

공개 키는 키 종류, 키 값, 주석이 띄어쓰기로 이어진 한 줄입니다. 이 한 줄이 접속할 서버의 authorized_keys에 들어갑니다. 폴더 안 파일의 역할은 트리로 묶었습니다.

~/.ssh키와 접속 기록이 모이는 폴더 · 권한 700
id_ed25519개인 키 · 내 컴퓨터에만 두는 파일 · 권한 600
id_ed25519.pub공개 키 한 줄 · 접속할 서버의 authorized_keys에 넣음 · 권한 644
authorized_keys이 서버로 들어올 수 있는 공개 키 목록(받는 쪽 서버에 있음)
known_hosts접속했던 서버의 호스트 키 · ssh-keygen -R로 한 줄씩 지움
config서버별 별칭·포트·키 파일 지정(ssh_config)

2️⃣ ssh-keygen 옵션: -f, -N, -b, -q

물음에 답하며 만드는 방식은 손으로 칠 때는 편하지만, 스크립트에서는 물음 자체를 없애야 합니다. -f로 파일을 정하고 -N으로 암호를 주면 묻지 않고 바로 만들어집니다.

ssh-keygen -t ed25519 -f ~/.ssh/deploy_key -N "" -C "deploy@example.com"
Generating public/private ed25519 key pair.
Your identification has been saved in /home/user/.ssh/deploy_key
Your public key has been saved in /home/user/.ssh/deploy_key.pub
The key fingerprint is:
SHA256:Rhk2/tgn59K8jtvDWJTOLiYnToM8t4gkdaMfu6TJ0oM deploy@example.com
The key's randomart image is:
+--[ED25519 256]--+
|        +        |
|       o +       |
|        +    .   |
|       . +  o    |
|    . o S ++o    |
|   . + +   B+    |
|  .oo * + .=+    |
|  E+o* Boo=++.   |
|   .=.=oo=o++.   |
+----[SHA256]-----+

-N 뒤에 빈 따옴표를 주면 암호 없는 키가 되고, 물음 없이 저장 위치와 지문까지 한 번에 나왔습니다.

ssh-keygen -t ed25519 -f ~/.ssh/deploy_key -N ""
Generating public/private ed25519 key pair.
/home/user/.ssh/deploy_key already exists.
Overwrite (y/n)?

같은 이름으로 다시 실행하면 already exists 뒤에 덮어쓸지 묻습니다. n을 치자 아무것도 바꾸지 않고 종료 코드 1로 끝났습니다. 운영 중인 키를 실수로 덮어쓰지 않게 새 키는 다른 이름으로 만듭니다.

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N "" -C "user@example.com"
Generating public/private rsa key pair.
Your identification has been saved in /home/user/.ssh/id_rsa
Your public key has been saved in /home/user/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:f+uwCSQjMka1BEHzXADwIWbrlbVRiP6Z4tjnwNwPVAA user@example.com
The key's randomart image is:
+---[RSA 4096]----+
|o=BE*=+.         |
|oo.Oo++          |
| .+o+. .         |
|....  .          |
| .+ o.= S        |
| .o+o= + .       |
|  ++.o  . o .    |
| . o..o  . = .   |
|    o. .  o.o    |
+----[SHA256]-----+

rsa는 -b로 길이를 정합니다. 매뉴얼 기준 기본값은 3072비트이고, 위에서는 4096비트로 만들어 randomart 머리에 RSA 4096이 찍혔습니다. ed25519는 길이가 정해져 있어 -b를 붙여도 무시된다고 매뉴얼에 적혀 있습니다.

ssh-keygen -f ~/.ssh/default_key -N "" -C "user@example.com"
Generating public/private ed25519 key pair.
Your identification has been saved in /home/user/.ssh/default_key
Your public key has been saved in /home/user/.ssh/default_key.pub
The key fingerprint is:
SHA256:mwy02fpKxjxEVvLC2EUJeaMIiNFOVS0GwWVjN9v0j4c user@example.com
The key's randomart image is:
+--[ED25519 256]--+
|o+ o+=O=*..      |
|o + .*+B== .     |
| o ..oB+o.. .    |
|  . .+.=     +   |
|      = S   E o  |
|     + + o   .   |
|      B +        |
|     o o         |
|      ...        |
+----[SHA256]-----+

-t를 생략하자 ed25519 키가 만들어졌습니다.

ssh-keygen -q -t ed25519 -f ~/.ssh/backup_key -N "" -C "backup@example.com"; echo rc=$?
rc=0

-q를 붙이면 지문과 randomart까지 모두 숨기고 종료 코드만 남습니다. 여러 서버용 키를 스크립트로 만들 때 사용합니다.

📌 주요 옵션: 이 글에서 실행한 결과

옵션하는 일이 글에서 본 결과
-t 종류만들 키 종류출력 첫 줄에 ed25519, rsa 같은 종류가 나오고, 생략하면 ed25519
-C 주석공개 키 끝에 붙는 주석cat으로 본 공개 키 끝에 user@example.com
-f 파일키 파일 경로/home/user/.ssh/deploy_key에 저장되었다는 줄, 같은 이름으로 다시 실행하면 already exists와 Overwrite (y/n)?
-N 암호새 암호(passphrase), 빈 따옴표면 암호 없음암호 물음 없이 저장 위치와 지문까지 한 번에
-b 비트키 길이rsa에 4096을 주면 randomart 머리에 RSA 4096
-q출력을 모두 숨김echo로 찍은 rc=0 한 줄만 남음
-l키 파일의 지문 출력공개 키와 개인 키에서 같은 SHA256 지문, authorized_keys는 키마다 한 줄
-E 해시지문의 해시 종류 지정-E md5로 MD5:00:7b:02:5e로 시작하는 지문
-v-l과 함께 주면 randomart까지 출력키를 만들 때와 같은 randomart
-y개인 키에서 공개 키를 꺼내 출력.pub 파일과 글자까지 같은 공개 키 한 줄
-p개인 키의 암호 바꾸기새 암호로 저장되었다는 줄이 나오고, 개인 키가 411바이트에서 464바이트로
-P 암호옛 암호(지금 걸린 암호)맞는 암호는 공개 키, 틀린 암호는 incorrect passphrase supplied to decrypt private key
-c주석 바꾸기, 새 주석은 -C로Old comment: user@example.com과 Comment 'user@laptop' applied
-F 호스트known_hosts에서 그 호스트의 줄 찾기# Host 192.0.2.10 found: line 1과 그 줄
-R 호스트known_hosts에서 그 호스트의 줄 지우기known_hosts updated와 원래 파일 known_hosts.old, 없는 호스트는 not found
-Hknown_hosts의 호스트 이름과 주소를 해시로|1|로 시작하는 줄로 바뀌고, .old 파일에 해시 전 줄이 남는다는 WARNING

📎 그 밖의 옵션: 공식 매뉴얼 기준

옵션하는 일
-a 횟수개인 키를 저장할 때 KDF(bcrypt_pbkdf) 반복 횟수, 클수록 암호 확인이 느려지고 무차별 대입에 강해짐, 기본 16
-A없는 호스트 키를 기본 종류(rsa, ecdsa, ed25519)마다 기본 경로에 만듦
-B키 파일의 bubblebabble 다이제스트 출력
-eOpenSSH 키를 -m 형식(기본 RFC4716)으로 바꿔 출력, 다른 SSH 프로그램용
-i-m 형식(기본 RFC4716)의 암호 없는 키를 OpenSSH 형식으로 바꿔 출력
-m 형식키 형식 지정(RFC4716, PKCS8, PEM), -p와 함께 OpenSSH와 PEM 개인 키 형식을 서로 바꿈
-r 호스트공개 키로 그 호스트 이름의 SSHFP DNS 레코드 출력
-s CA 키CA 키로 공개 키에 서명해 인증서 만들기
-L인증서 내용 출력
-KFIDO 인증 장치에 저장된 resident 키를 지금 폴더로 내려받음
-Y signSSH 키로 파일에 서명, 서명은 파일 이름 끝에 .sig를 붙여 저장, 용도 이름은 -n으로

3️⃣ ssh-keygen -l 지문 확인과 -y 공개 키 추출

키 파일이 여럿이면 어느 공개 키가 어느 개인 키의 짝인지 파일 이름만으로는 알기 어렵습니다. 지문은 개인 키와 공개 키에서 같은 값이 나오므로, -l로 두 파일의 지문을 견주면 짝을 확인할 수 있습니다.

ssh-keygen -l -f ~/.ssh/id_ed25519.pub
256 SHA256:c73KJh85pPijvy43kS1uaQo77fSsGlE4Wz+aMF+sTy8 user@example.com (ED25519)
ssh-keygen -l -f ~/.ssh/id_ed25519
256 SHA256:c73KJh85pPijvy43kS1uaQo77fSsGlE4Wz+aMF+sTy8 user@example.com (ED25519)

공개 키 파일과 개인 키 파일에서 같은 SHA256 지문이 나왔습니다. 앞의 256은 키 길이이고, 끝 괄호는 키 종류입니다.

ssh-keygen -l -E md5 -f ~/.ssh/id_ed25519.pub
256 MD5:00:7b:02:5e:b8:ba:85:0c:32:d7:15:7e:72:45:f7:bc user@example.com (ED25519)

-E md5를 붙이면 예전 꼴인 MD5 지문으로 바뀝니다. 오래된 서버나 관리 화면이 MD5 지문을 보여 줄 때 대조용으로 사용합니다.

ssh-keygen -lv -f ~/.ssh/id_ed25519.pub
256 SHA256:c73KJh85pPijvy43kS1uaQo77fSsGlE4Wz+aMF+sTy8 user@example.com (ED25519)
+--[ED25519 256]--+
|                 |
|     .           |
|    o o          |
|     = o   .     |
|    =   Soo .    |
|     = *+*.. .   |
|    o.B.o++ .    |
|    .=o*Eo.+     |
|    o+=@OO=      |
+----[SHA256]-----+

-v를 함께 주면 randomart가 다시 나옵니다. 키를 만들 때 출력된 그림과 같은 그림이었습니다.

ssh-keygen -l -f ~/.ssh/authorized_keys
256 SHA256:Rhk2/tgn59K8jtvDWJTOLiYnToM8t4gkdaMfu6TJ0oM deploy@example.com (ED25519)

authorized_keys처럼 공개 키가 여러 줄인 파일을 주면 줄마다 지문이 한 줄씩 나옵니다. 서버에 어떤 키가 등록되어 있는지 확인할 때 이 방법으로 봅니다.

ssh-keygen -y -f ~/.ssh/id_ed25519
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVLiw04ugfXq15n2m8ZDW0OywkRoug8beXw/9VnVY/L user@example.com

-y는 개인 키에서 공개 키를 다시 꺼냅니다. .pub 파일을 지웠거나 다른 컴퓨터로 개인 키만 옮겼을 때 이 출력을 파일로 저장하면 됩니다. 출력은 원래 .pub 파일과 글자까지 같았습니다.

4️⃣ ssh-keygen -p 암호 변경과 -c 주석 변경

개인 키에 암호(passphrase)를 걸면 파일이 유출돼도 암호 없이는 쓰지 못합니다. 대신 접속할 때마다 암호를 쳐야 해서, 사람이 손으로 접속하는 키에 맞고 크론처럼 자동으로 도는 스크립트의 키에는 맞지 않습니다.

ssh-keygen -p -f ~/.ssh/id_ed25519 -P "" -N "example-pass"
Key has comment 'user@example.com'
Your identification has been saved with the new passphrase.

-P가 옛 암호, -N이 새 암호입니다. 암호 없던 키라 -P에 빈 따옴표를 주었고, 새 암호로 다시 저장되었다는 두 줄이 나왔습니다. 옵션 없이 -p만 주면 옛 암호와 새 암호를 차례로 묻는다고 매뉴얼에 적혀 있습니다.

ls -l ~/.ssh/id_ed25519
-rw------- 1 user user 464 Oct 29 08:22 /home/user/.ssh/id_ed25519

암호를 건 뒤 개인 키 파일이 411바이트에서 464바이트로 커졌습니다.

ssh-keygen -y -f ~/.ssh/id_ed25519 -P "example-pass"
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVLiw04ugfXq15n2m8ZDW0OywkRoug8beXw/9VnVY/L user@example.com
ssh-keygen -y -f ~/.ssh/id_ed25519 -P "wrongpass"
Load key "/home/user/.ssh/id_ed25519": incorrect passphrase supplied to decrypt private key

암호가 걸린 키는 -y에도 -P로 암호를 넘겨야 합니다. 맞는 암호로는 전과 같은 공개 키가 나왔고, 틀린 암호를 주자 incorrect passphrase 오류로 끝났습니다. 매뉴얼은 잃어버린 암호를 되찾을 방법이 없다고 밝히고 있어, 암호를 잊으면 새 키를 만들어 공개 키를 다시 등록합니다.

ssh-keygen -c -C "user@laptop" -f ~/.ssh/id_ed25519 -P "example-pass"
Old comment: user@example.com
Comment 'user@laptop' applied
cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVLiw04ugfXq15n2m8ZDW0OywkRoug8beXw/9VnVY/L user@laptop

-c는 주석을 바꿉니다. 옛 주석과 새 주석이 한 줄씩 나오고, 공개 키 파일 끝의 주석도 user@laptop으로 바뀌었습니다. 주석은 키를 구분하는 표시라 키 값 자체는 그대로였습니다.

ssh-keygen -p -f ~/.ssh/id_ed25519 -P "example-pass" -N ""
Key has comment 'user@laptop'
Your identification has been saved with the new passphrase.

암호를 없애려면 -N에 빈 따옴표를 넣습니다. 같은 두 줄이 나오고, 이 뒤로는 -P 없이 -y가 다시 실행되었습니다.

5️⃣ ssh-keygen -R known_hosts 호스트 키 삭제

known_hosts에는 접속했던 서버의 호스트 키가 한 줄씩 쌓입니다. 서버를 다시 설치해 호스트 키가 바뀌면 ssh는 저장된 키와 다르다며 접속을 거절하는데, 이때 옛 줄을 지우는 옵션이 -R입니다. 아래 known_hosts는 예시 주소 세 줄로 만든 파일이고, -f로 그 파일을 지정했습니다.

cat ~/.ssh/known_hosts
192.0.2.10 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKKphFOc7oiKNpIHFTzK/ippCS5U5D+lF3xmXM6dmYjk
server2.example.com,192.0.2.20 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID3s6oYeTCz7KeYs0f/60/Ix0DhmK4hf1uHCC10TrXyR
[192.0.2.30]:2222 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC0WmcBD2HIsiSn+tERrbeFIyExAodSEUhE9j5WMpkRW

줄마다 호스트 이름이나 주소, 키 종류, 키 값 순서입니다. 쉼표로 이은 둘째 줄은 이름과 주소가 같은 서버이고, 셋째 줄의 대괄호와 콜론은 22번이 아닌 포트입니다.

ssh-keygen -F 192.0.2.10 -f ~/.ssh/known_hosts
# Host 192.0.2.10 found: line 1
192.0.2.10 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKKphFOc7oiKNpIHFTzK/ippCS5U5D+lF3xmXM6dmYjk

-F는 그 호스트의 줄을 몇째 줄인지와 함께 출력합니다. 없는 호스트는 아무것도 출력하지 않고 종료 코드 1로 끝났습니다.

ssh-keygen -R 192.0.2.10 -f ~/.ssh/known_hosts
# Host 192.0.2.10 found: line 1
/home/user/.ssh/known_hosts updated.
Original contents retained as /home/user/.ssh/known_hosts.old
cat ~/.ssh/known_hosts
server2.example.com,192.0.2.20 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID3s6oYeTCz7KeYs0f/60/Ix0DhmK4hf1uHCC10TrXyR
[192.0.2.30]:2222 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC0WmcBD2HIsiSn+tERrbeFIyExAodSEUhE9j5WMpkRW

-R은 그 호스트의 줄을 지우고 원래 파일을 known_hosts.old로 남깁니다. 지운 뒤 두 줄만 남았습니다.

ssh-keygen -R 192.0.2.99 -f ~/.ssh/known_hosts
Host 192.0.2.99 not found in /home/user/.ssh/known_hosts
ssh-keygen -R "[192.0.2.30]:2222" -f ~/.ssh/known_hosts
# Host [192.0.2.30]:2222 found: line 2
/home/user/.ssh/known_hosts updated.
Original contents retained as /home/user/.ssh/known_hosts.old

없는 호스트를 지정하면 not found 한 줄만 나왔습니다. 포트가 다른 서버는 known_hosts에 적힌 대로 대괄호와 포트까지 넣어야 찾습니다.

ssh-keygen -H -f ~/.ssh/known_hosts
WARNING: /home/user/.ssh/known_hosts.old contains unhashed entries
Delete this file to ensure privacy of hostnames
/home/user/.ssh/known_hosts updated.
Original contents retained as /home/user/.ssh/known_hosts.old
cat ~/.ssh/known_hosts
|1|JL/knNlx/BnCoOWp5rNeRo3r1rE=|OCPyeFd1rgG8P2QGzrju/V2Y8c4= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID3s6oYeTCz7KeYs0f/60/Ix0DhmK4hf1uHCC10TrXyR
|1|AG9QJQvGaQmVsEusSdND1lM9cKI=|Ue0a9suJIzN0yxoJgV7ClLBgSYw= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID3s6oYeTCz7KeYs0f/60/Ix0DhmK4hf1uHCC10TrXyR

-H는 호스트 이름과 주소를 해시로 바꿉니다. 파일이 유출돼도 어느 서버에 접속했는지 드러나지 않게 하는 옵션이고, 쉼표로 이었던 이름과 주소는 해시 두 줄로 나뉘었습니다. .old 파일에 해시 전 내용이 남아 있다는 경고도 함께 나왔습니다.

ssh-keygen -F server2.example.com -f ~/.ssh/known_hosts
# Host server2.example.com found: line 1
|1|JL/knNlx/BnCoOWp5rNeRo3r1rE=|OCPyeFd1rgG8P2QGzrju/V2Y8c4= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID3s6oYeTCz7KeYs0f/60/Ix0DhmK4hf1uHCC10TrXyR

해시된 파일에서도 -F는 이름으로 그 줄을 찾았습니다.

6️⃣ ssh-copy-id 공개 키 등록과 authorized_keys

키를 만들어도 서버가 그 공개 키를 모르면 접속은 여전히 비밀번호로 합니다. 공개 키를 서버에 알리는 자리가 접속할 계정의 ~/.ssh/authorized_keys이고, 이 파일에 .pub 한 줄을 넣는 명령이 ssh-copy-id입니다. 개인 키는 내 컴퓨터에 남고 공개 키 한 줄만 건너갑니다. 아래 다이어그램에서 단계 버튼을 누르면 두 파일이 어디에 놓이는지 보입니다.

🔐 ssh-keygen 키 쌍이 접속에 쓰이는 흐름
설명 다이어그램
🔍 단계
$ ssh-keygen -t ed25519 -C user@example.comssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.0.2.10ssh -i ~/.ssh/id_ed25519 user@192.0.2.10
💻 내 컴퓨터 ~/.ssh
🔒id_ed25519개인 키 · 밖으로 보내지 않음
🔑id_ed25519.pub공개 키 한 줄 · 서버에 복사
➜아직 서버에 없음공개 키 한 줄 복사서버가 공개 키로 확인
🖥️ 서버 ~/.ssh/authorized_keys
📄비어 있음비밀번호로만 로그인
🔑ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJVLiw04ugfXq15n2m8ZDW0OywkRoug8beXw/9VnVY/L user@example.com등록된 공개 키 · 이 줄과 짝인 개인 키만 통과
ssh-keygen은 개인 키와 공개 키를 한 쌍으로 만듭니다. 개인 키는 내 컴퓨터 ~/.ssh에만 두고, 공개 키는 .pub 파일의 한 줄입니다. 이 단계에서는 서버에 아직 아무것도 없어 비밀번호로만 로그인합니다.
ssh-copy-id는 공개 키 한 줄을 서버의 ~/.ssh/authorized_keys 끝에 덧붙입니다. 개인 키는 복사되지 않습니다. 공개 키는 비밀로 둘 필요가 없어 여러 서버에 같은 줄을 넣어도 됩니다.
접속할 때 서버는 authorized_keys의 공개 키로 내 개인 키의 서명을 확인합니다. 짝이 맞으면 비밀번호 없이 로그인되고, 개인 키 파일이 없는 컴퓨터에서는 같은 계정이라도 비밀번호를 묻습니다.
ssh-copy-id -n -i ~/.ssh/deploy_key.pub -o ConnectTimeout=3 user@192.0.2.10
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/deploy_key.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: ERROR: ssh: connect to host 192.0.2.10 port 22: Connection timed out

-n은 dry-run이라 서버에 아무것도 쓰지 않습니다. 그래도 ssh-copy-id는 먼저 그 키로 로그인을 시도해 이미 등록된 키를 걸러 내는데, 192.0.2.10은 문서용 주소라 연결이 되지 않아 timed out으로 끝났습니다. -o 뒤 옵션은 ssh에 그대로 넘어갑니다.

ssh-copy-id -n -f -i ~/.ssh/deploy_key.pub -o ConnectTimeout=3 user@192.0.2.10
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/deploy_key.pub"
=-=-=-=-=-=-=-=
Would have added the following key(s):

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKKphFOc7oiKNpIHFTzK/ippCS5U5D+lF3xmXM6dmYjk deploy@example.com
=-=-=-=-=-=-=-=

-f는 이 확인을 건너뛰는 강제 모드입니다. -n과 함께 주자 서버에 들어갈 공개 키 한 줄이 Would have added 아래에 나왔습니다. .pub 파일의 내용과 같은 줄입니다.

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.0.2.10

실제 등록은 -n을 뺀 이 명령으로 합니다. ssh-copy-id 스크립트와 매뉴얼 기준으로, 이 명령은 그 계정의 비밀번호를 한 번 묻고, 서버의 ~/.ssh/authorized_keys 끝에 공개 키를 덧붙인 뒤 Number of key(s) added: 1을 출력합니다. 파일과 폴더가 없으면 만들고, 이미 같은 키가 있으면 건너뜁니다.

ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 user@192.0.2.10

포트가 22번이 아니면 -p로 넘깁니다.

ssh-copy-id가 없는 환경에서는 공개 키 한 줄을 서버의 authorized_keys에 직접 덧붙입니다. 서버에 비밀번호로 로그인한 뒤 아래 순서로 진행합니다. 출력은 같은 서버 안에서 .pub 파일을 덧붙여 확인한 것이고, 다른 서버라면 .pub 파일의 한 줄을 복사해 echo로 덧붙입니다.

mkdir -p ~/.ssh
chmod 700 ~/.ssh

.ssh 폴더가 없으면 만들고 권한을 700으로 맞춥니다.

cat ~/.ssh/deploy_key.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
cat ~/.ssh/authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKKphFOc7oiKNpIHFTzK/ippCS5U5D+lF3xmXM6dmYjk deploy@example.com
ls -l ~/.ssh/authorized_keys
-rw------- 1 user user 100 Oct 29 08:22 /home/user/.ssh/authorized_keys

authorized_keys에 공개 키 한 줄이 들어갔고 권한은 600입니다. sshd는 기본 설정에서 사용자 파일 권한을 먼저 검사해 누구나 쓸 수 있는 권한이면 로그인을 받지 않는다고 sshd_config 매뉴얼의 StrictModes 항목에 적혀 있습니다.

ssh -i ~/.ssh/id_ed25519 user@192.0.2.10

등록이 끝나면 개인 키로 접속합니다. 키 이름이 id_ed25519처럼 기본 이름이면 ssh가 알아서 찾고, deploy_key처럼 다른 이름이면 ssh -i 옵션으로 파일을 지정합니다.

🔲 ssh-keygen 명령어 시뮬레이터

아래 시뮬레이터에서 ssh-keygen으로 키를 만들고 지문 확인, 암호 변경, known_hosts 정리, ssh-copy-id까지 직접 입력해 볼 수 있습니다. 지문과 공개 키는 본문과 같은 예시 값이고, ssh-copy-id는 가상 서버에 등록하는 흉내만 냅니다.

ssh-keygen 명령어 시뮬레이터OpenSSH 9.9p1 · user
[root@server work]#
키보드 ↑↓ 로 앞에서 쓴 명령을 다시 불러옵니다.

🔢 FAQ & 추천 콘텐츠

ssh-keygen 기본값이 ed25519이고 키가 짧아 공개 키 한 줄이 98바이트였습니다. rsa는 4096비트 공개 키가 742바이트였고, ed25519를 받지 못하는 오래된 서버나 장비에 접속할 때 사용합니다.

바꿔도 됩니다. ssh 매뉴얼 기준으로 ssh는 ~/.ssh/id_ed25519, ~/.ssh/id_rsa 같은 기본 이름만 자동으로 찾으므로, 다른 이름은 접속할 때 -i로 지정하거나 ~/.ssh/config의 IdentityFile에 적어 둡니다.

sshd_config 매뉴얼 기준으로 PasswordAuthentication을 no로 바꾸고 sshd 설정을 다시 읽게 합니다. 키로 접속되는 것을 다른 터미널에서 먼저 확인한 뒤에 끕니다. 확인 전에 끄면 비밀번호로도 키로도 들어가지 못해 서버에서 잠길 수 있습니다.

ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

인간임을 증명하세요: 7   +   7   =