SSH 키 생성 — 처음 만나는 passphrase 질문
Linux 서버에서 Windows 서버 연결용 SSH 키를 만들었습니다.
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_cardnews
그러자 바로 이런 화면이 나왔습니다.
Enter passphrase (empty for no passphrase):
passphrase는 SSH 키에 추가로 거는 암호입니다. 설정하면 키를 쓸 때마다 암호를 입력해야 합니다. 자동화 파이프라인에서는 매번 암호를 입력할 수 없기 때문에 엔터를 두 번 눌러서 빈 passphrase로 설정합니다. 자동화 스크립트에서 키를 쓸 때 아무것도 입력하지 않아도 되는 상태가 됩니다.
키 생성이 완료되면 두 파일이 만들어집니다. ~/.ssh/id_ed25519_cardnews 는 개인키이고, ~/.ssh/id_ed25519_cardnews.pub 는 공개키입니다. Windows 서버에 넣어야 하는 것은 .pub 파일의 내용입니다. 개인키는 절대 밖으로 내보내지 않습니다.
1차 접속 시도 — Permission denied
키를 만들고 바로 접속을 시도했습니다.
ssh -i ~/.ssh/id_ed25519_cardnews reedoc@125.132.162.227 "whoami"
결과는 Permission denied (publickey,keyboard-interactive) 였습니다. 예상된 실패였습니다. 공개키를 Windows 서버에 아직 등록하지 않았기 때문입니다.
Windows 서버 sshd 상태 확인 — 서비스 재시작 오류
Windows 서버에서 OpenSSH 서비스 상태를 확인했습니다.
Get-Service sshd
Running 상태였습니다. 그런데 Restart-Service sshd 명령을 실행하자 오류가 났습니다. "sshd 서비스를 열 수 없습니다"라는 메시지였습니다. 관리자 권한 없이 PowerShell을 열어서 생긴 문제였습니다. Windows에서 서비스를 재시작하려면 반드시 관리자 권한으로 PowerShell을 실행해야 합니다.
관리자 권한 PowerShell에서 다시 확인하자 정상이었습니다.
Get-Service sshd
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Server*'
sshd 서비스 Running, OpenSSH.Server State: Installed. 서비스 자체는 문제없는 상태였습니다.
authorized_keys 등록과 권한 설정
공개키를 Linux에서 복사해서 Windows의 C:\Users\reedoc.ssh\authorized_keys 에 붙여넣었습니다. 그리고 icacls로 권한을 정리했습니다.
icacls "C:\Users\reedoc\.ssh" /inheritance:r
icacls "C:\Users\reedoc\.ssh" /grant reedoc:F
icacls "C:\Users\reedoc\.ssh\authorized_keys" /inheritance:r
icacls "C:\Users\reedoc\.ssh\authorized_keys" /grant reedoc:F
Restart-Service sshd
다시 접속을 시도했습니다. 결과는 여전히 Permission denied였습니다.
디버그 모드로 원인 분석
일반 오류 메시지로는 어디서 막히는지 알 수 없었습니다. -vvv 옵션을 붙여서 상세 로그를 봤습니다.
ssh -vvv -i ~/.ssh/id_ed25519_cardnews reedoc@125.132.162.227 "whoami"
로그에서 핵심 줄이 나왔습니다.
debug1: Offering public key: /root/.ssh/id_ed25519_cardnews ED25519 ...
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,keyboard-interactive
이 로그의 의미는 명확했습니다. Linux가 키를 정상적으로 보냈습니다. 그런데 Windows sshd가 그 키를 받고도 거절했습니다. 키 전송 자체는 성공했는데 인증에서 실패한 것입니다. 즉, 네트워크나 키 파일의 문제가 아니라 Windows sshd가 공개키를 읽는 위치가 다른 문제였습니다.
핵심 원인 — 관리자 계정의 숨겨진 규칙
Windows OpenSSH에는 잘 알려지지 않은 규칙이 있습니다. 로그인 계정이 Administrators 그룹에 속하면 일반 사용자와 다른 경로에서 공개키를 읽습니다.
일반 계정: C:\Users\사용자명.ssh\authorized_keys 관리자 계정: C:\ProgramData\ssh\administrators_authorized_keys
reedoc 계정의 그룹을 확인했습니다.
whoami /groups
결과에 BUILTIN\Administrators 가 있었습니다. 관리자 계정이었습니다. 이것이 원인이었습니다. C:\Users\reedoc.ssh\authorized_keys 에 아무리 공개키를 넣어도 sshd는 C:\ProgramData\ssh\administrators_authorized_keys 를 보고 있었습니다.
administrators_authorized_keys — 메모장으로 열리지 않는다
C:\ProgramData\ssh\administrators_authorized_keys 파일을 메모장으로 열려고 했더니 접근이 거부됐습니다. 시스템 보호 파일이라 일반 편집기로는 열리지 않습니다.
관리자 권한 PowerShell에서 직접 파일을 작성해야 합니다.
@'
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA.... root@openclaw-first
'@ | Set-Content -Path "C:\ProgramData\ssh\administrators_authorized_keys" -NoNewline
이 방법으로 메모장 없이 PowerShell에서 직접 파일에 공개키를 씁니다. -NoNewline 옵션을 붙여야 줄바꿈이 추가되지 않습니다. 공개키는 반드시 한 줄이어야 합니다.
기존에 다른 키가 있어서 지우기 싫다면 Add-Content로 추가할 수 있습니다. 하지만 디버깅 중에는 새 키 하나만 남기는 것이 가장 확실합니다.
권한 설정 — Administrators와 SYSTEM 모두 필요
파일을 만들었으면 권한을 설정합니다. 이 파일은 일반 사용자가 읽으면 안 됩니다. Administrators와 SYSTEM만 읽을 수 있어야 OpenSSH가 신뢰합니다.
icacls "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r
icacls "C:\ProgramData\ssh\administrators_authorized_keys" /grant "Administrators:F"
icacls "C:\ProgramData\ssh\administrators_authorized_keys" /grant "SYSTEM:F"
Restart-Service sshd
연결 성공
Linux에서 다시 접속을 시도했습니다.
ssh -i ~/.ssh/id_ed25519_cardnews reedoc@125.132.162.227 "whoami"
desktop-o5q0j8p\reedoc
Windows 서버의 계정명이 돌아왔습니다. Linux에서 Windows로 SSH 연결이 성공했습니다.
문제 해결 체크리스트
Windows OpenSSH 연결이 안 될 때 확인할 순서입니다.
첫째, SSH 키를 보내고 있는지 확인합니다. ssh -vvv 로그에서 "Offering public key" 줄이 나와야 합니다. 안 나오면 -i 옵션이나 키 경로 문제입니다.
둘째, 서버가 키를 받고도 거절하는지 확인합니다. "Offering public key" 다음에 바로 "Authentications that can continue"가 나오면 서버가 키를 거절한 것입니다. 키 내용이나 등록 위치 문제입니다.
셋째, 로그인 계정이 관리자 그룹인지 확인합니다. whoami /groups 에서 BUILTIN\Administrators 가 있으면 authorized_keys 위치가 다릅니다. C:\ProgramData\ssh\administrators_authorized_keys 를 써야 합니다.
넷째, 파일 권한을 확인합니다. administrators_authorized_keys 는 Administrators와 SYSTEM만 접근할 수 있어야 합니다. 다른 계정에 읽기 권한이 있으면 OpenSSH가 보안상 그 파일을 무시합니다.
다섯째, 항상 관리자 권한 PowerShell에서 작업합니다. 서비스 재시작, 권한 설정, 파일 쓰기 모두 일반 PowerShell에서는 권한 오류가 납니다.
