# macOS에서 Secure Enclave 기반 SSH 키 네이티브 지원

> Clean Markdown view of GeekNews topic #24571. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=24571](https://news.hada.io/topic?id=24571)
- GeekNews Markdown: [https://news.hada.io/topic/24571.md](https://news.hada.io/topic/24571.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2025-11-24T10:03:24+09:00
- Updated: 2025-11-24T10:03:24+09:00
- Original source: [gist.github.com/arianvp](https://gist.github.com/arianvp/5f59f1783e3eaf1a2d4cd8e952bb4acf)
- Points: 1
- Comments: 1

## Topic Body

- macOS의 **Tahoe 버전**에서 Secure Enclave를 이용한 **SSH 키 생성 및 사용 기능**이 기본 지원됨  
- `/usr/lib/ssh-keychain.dylib` 라이브러리가 기존 **스마트카드용 PKCS11Provider** 외에 **SecurityKeyProvider** 인터페이스를 구현해, FIDO2 장치 대신 Secure Enclave와 직접 통신 가능  
- `sc_auth` 명령으로 **Touch ID 기반 생체인증 키 생성**, `ssh-keygen` 또는 `ssh-add`를 통해 **보안 영역에서 직접 키 불러오기 및 사용** 가능  
- `.zprofile`에 `SSH_SK_PROVIDER` 환경변수를 설정하면 **SSH, ssh-agent, ssh-keygen** 모두에서 자동 인식  
- 외부 도구 없이 macOS 기본 기능만으로 **보안성과 편의성을 동시에 확보한 SSH 인증 구조** 구현 가능  

---

### Secure Enclave 기반 SSH 키 지원 개요
- macOS Tahoe는 **Secure Enclave 기반 SSH 키 생성 및 사용**을 지원  
  - 기존에는 `secretive` 같은 외부 프로젝트가 필요했으나, 이제 macOS 기본 기능으로 대체 가능  
- `/usr/lib/ssh-keychain.dylib`이 **SecurityKeyProvider**를 구현해 FIDO2 장치와 유사한 방식으로 Secure Enclave 접근 가능  
- 이 기능을 통해 **YubiKey 등 외부 하드웨어 없이** macOS 내장 보안 칩으로 SSH 인증 수행 가능  

### 키 생성 및 관리
- `sc_auth create-ctk-identity -l ssh -k p-256-ne -t bio` 명령으로 **Touch ID 인증이 필요한 Secure Enclave 키** 생성  
  - `list-ctk-identities` 명령으로 생성된 키 목록과 해시 확인 가능  
  - `delete-ctk-identity` 명령으로 키 삭제 가능  
- `list-ctk-identities -t ssh` 옵션으로 **SSH 키 지문(fingerprint)** 확인 가능  

### SSH에서의 사용
- `ssh-keygen -w /usr/lib/ssh-keychain.dylib -K -N ""` 명령으로 **Secure Enclave에서 키 쌍 불러오기**  
  - PIN 입력은 필요 없으며, Touch ID로 인증  
  - 생성된 “private key”는 실제 비밀키가 아닌 **FIDO 자격 증명 참조값**  
- `ssh-copy-id`로 공개키를 서버에 복사 후,  
  `ssh -o SecurityKeyProvider=/usr/lib/ssh-keychain.dylib localhost` 명령으로 접속 가능  

### ssh-agent 연동
- `ssh-add -K -S /usr/lib/ssh-keychain.dylib` 명령으로 **Secure Enclave 키를 ssh-agent에 직접 등록** 가능  
  - 등록된 키는 `ssh-add -L`로 확인  
  - 이후 `ssh -o SecurityKeyProvider=/usr/lib/ssh-keychain.dylib` 명령으로 인증 수행  

### 기본 SecurityKeyProvider 설정
- `.ssh/config`에 직접 지정하거나, `.zprofile`에  
  `export SSH_SK_PROVIDER=/usr/lib/ssh-keychain.dylib` 추가 시 자동 인식  
- 이후 단순히 `ssh-add -K` 또는 `ssh my-server` 명령으로 **보안키 기반 SSH 접속** 가능  

### 내보내기 가능한 키 (Exportable Keys)
- `sc_auth create-ctk-identity -l ssh-exportable -k p-256 -t bio` 명령으로 **Secure Enclave로 암호화된 내보내기용 키** 생성 가능  
  - `export-ctk-identity`로 PEM 파일로 내보내고,  
    `import-ctk-identities`로 다른 장치에 재등록 가능  
- 이 방식은 **보안성은 다소 낮지만 백업에 유리**  

### 개발자 토론 및 코드 확장
- 댓글에서 `.biometryCurrentSet` 플래그 사용 가능 여부가 논의됨  
  - 현재는 **“생체인증 사용 여부(on/off)”만 지원**, 세부 제어 불가  
- 작성자는 `ssh-keychain.dylib`을 **역공학(reverse-engineering)** 하여 `sk_enroll()` 함수에 **biometryCurrentSet 기능 추가 가능성**을 검토  
- 제안된 코드 예시는 **Apple Developer Program 계정으로 코드 서명(codesign)** 해야 Secure Enclave 접근 가능  
- 코드에는 **키 생성, 서명, 등록(sk_enroll, sk_sign 등)** 로직이 포함되어 있으며,  
  **ECDSA P-256 키**를 Secure Enclave에서 생성하고 서명하는 과정이 구현됨  

### 요약
- macOS는 이제 **Secure Enclave를 직접 활용한 SSH 인증**을 네이티브로 지원  
- Touch ID 기반 생체인증과 FIDO2 호환 구조를 통해 **보안성과 편의성 향상**  
- 외부 하드웨어나 추가 소프트웨어 없이 **시스템 내장 기능만으로 SSH 키 관리 가능**  
- 개발자들은 `ssh-keychain.dylib`을 확장해 **세분화된 생체인증 제어**를 실험 중

## Comments



### Comment 46717

- Author: neo
- Created: 2025-11-24T10:03:24+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=46025721) 
- 내가 이해한 게 맞다면, 이건 **개인 키를 백업할 수 없다는 뜻**임  
  Secure Enclave 안에 저장되므로 노트북을 잃으면 키도 함께 사라짐  
  공개 키만 내보낼 수 있는 것 같음. 물론 다른 접근 방법이나 관리자 리셋이 가능하겠지만, 그래도 약간 불안한 구석이 있음  
  나중에 OP가 답변을 달고 웹페이지를 업데이트한다고 함  
  - `man sc_auth`를 참고하면 됨. Secure Enclave에서 직접 생성하는 대신 **암호화된 내보내기용 키**를 만들 수 있음  
    예시 명령어로 `sc_auth create-ctk-identity -l ssh-exportable -k p-256 -t bio` 등을 실행하고, 이후 `export-ctk-identity`로 `.pem` 파일을 만들 수 있음  
    다른 기기에서 `import-ctk-identities`로 다시 불러올 수 있음. 이 내용을 가이드에 추가할 예정임  
  - 원래 키는 ‘내보내는’ 게 아님. 키를 옮길 때마다 노출 위험이 생김  
    **PKI의 핵심은 공개 키만 이동**하고, 개인 키는 한 곳에만 존재해야 함  
  - 맞음. 여러 개의 키를 백업용으로 만들어두는 게 좋음  
    이렇게 하면 어떤 경우에도 키가 유출되지 않음  
  - 개인 키를 내보낼 수 없는 건 **YubiKey와 동일한 개념**임  
    YubiKey에서 생성된 개인 키도 백업할 수 없음  
  - 원칙적으로는 여러 키를 사용하는 게 맞음  
    기기를 잃거나 도난당해도 문제없게, 기기별로 하나씩 두는 게 이상적임  
    나는 PIN으로 보호된 YubiKey를 금고에 보관해둠. 만약 노트북, 폰, 일상용 YubiKey가 모두 사라져도 대비가 됨  

- 조금 더 나아가면 **ECDSA 기반 GPG 서명**도 가능함  
  다만 버그 때문에 패치된 GPG와 SSH agent가 필요함  
  macOS용 UI가 포함된 패키지 버전이 있고 ([KeetaNetwork/agent](https://github.com/KeetaNetwork/agent)),  
  같은 백엔드가 Linux에서도 [PKCS#11을 통한 TPM](https://github.com/KeetaNetwork/agent/tree/main/Agent/gnupg/src)으로 작동함  
  GPG와 SSH의 차이는 키와 서명을 감싸는 방식뿐이며, 근본적으로는 모두 ECDSA임  

- Secretive가 설정은 더 간단하지만, 이 방식으로 바꿔서 **앱을 하나 줄일 생각**임  
  Windows 11에서 TPM 기반 SSH 키를 설정하는 방법을 [내 블로그](https://cedwards.xyz/tpm-backed-ssh-keys-on-windows-11/)에 정리했음  
  - Linux에서도 TPM에 ssh-key를 저장할 수 있는지 궁금함  

- 꽤 멋진 기능임  
  나는 **Secretive를 오랫동안 사용**해왔고, 물리 키나 카드보다 훨씬 편했음  
  SSH 키가 사용될 때마다 버튼을 누르거나 지문 인식을 해야 해서 언제 사용되는지 명확히 알 수 있음  
  ssh-agent 터널을 유지해 원격 서버에서도 안전하게 git 서명을 할 수 있음  
  다만 Tahoe 버전은 버그가 많고 자주 멈춤. 디버깅할 여유가 없어서 그냥 두고 있음  
  Smart Card 기반 SSH UX는 예전에 고생했던 기억이 있지만, 안정적이라면 시도해볼 만함  
  - 나도 Secretive를 좋아하지만, **ssh-agent의 확인 기능**은 OpenSSH에서도 오래전부터 지원함  
    `ssh-askpass`를 통해 각 개인 키 사용 시 확인할 수 있음. 다만 로컬/원격 구분은 안 됨  

- 이 방식은 **NSA가 백도어를 심었다는 의심이 있는 커브**를 사용하므로 주의해야 함  

- Secure Enclave 안에 저장하는데 왜 개인 키 파일이 필요한지 궁금함  
  - OpenSSH의 `sk` 구현도 마찬가지임. “resident key” 옵션이 있어도 **개인 키 파일이 필요함**  
    이는 단순히 FIDO 자격 증명에 대한 참조일 뿐, 실제 비밀 키 데이터는 포함하지 않음  
    비거주형 `sk` 키의 경우 하드웨어 인증기가 상태를 저장하지 않기 때문에 파일이 필요함  
    macOS의 구현이 상태 저장형인지 비저장형인지는 확실치 않음. OS 재설치 시 깨질 수도 있음  

- [facebookincubator/sks](https://github.com/facebookincubator/sks)라는 프로젝트가 있음  
  다양한 하드웨어 기반 SSH 키를 추상화하는 **golang 라이브러리**로, Linux, Windows, macOS를 지원함  
  - 하지만 golang 라이브러리만으로는 ssh-agent가 작동하지 않음  
    그래서 나는 예전에 [ssh-tpm-agent](https://github.com/Foxboron/ssh-tpm-agent)를 직접 만들기 시작했음  

- iPhone에서도 같은 개인 키로 이메일이나 파일 서명을 하고 싶음  
  iCloud가 이를 처리해줄 수 있을까 궁금함  
  - 이런 키들은 iCloud로 **동기화되지 않음**  
    대신 Passkey가 동기화됨. Passkey API와 통신하는 SecurityKeyProvider를 새로 만들어야 함  
    Passkey는 특정 앱 번들 ID나 도메인에 묶여 있음  
    예를 들어 Secretive가 Passkey를 지원한다면, 그 키쌍은 다른 앱에서는 사용할 수 없지만  
    같은 앱의 여러 기기 간에는 동기화됨  

- 이제 **KeyMux**에 새로운 기능을 추가할 때가 됨  
  이 도구는 SSH, SSL, PGP용 enclave 키를 지원하며,  
  예를 들어 Secure Enclave 기반 SSL 인증으로 Vault 서버에 접속해 **비내보내기형 Vault 개인 키**로 SSH 인증을 수행할 수 있음  
  [keymux.com](https://keymux.com/)과 [App Store 링크](https://apps.apple.com/us/app/keymux/id6448807557)에서 확인 가능함
