1 điểm bởi GN⁺ 2025-11-24 | 1 bình luận | Chia sẻ qua WhatsApp
  • Trên phiên bản Tahoe của macOS, tính năng tạo và sử dụng khóa SSH bằng Secure Enclave được hỗ trợ sẵn
  • Thư viện /usr/lib/ssh-keychain.dylib ngoài PKCS11Provider dành cho thẻ thông minh hiện có còn triển khai giao diện SecurityKeyProvider, cho phép giao tiếp trực tiếp với Secure Enclave thay vì thiết bị FIDO2
  • Với lệnh sc_auth, có thể tạo khóa sinh trắc học dựa trên Touch ID; thông qua ssh-keygen hoặc ssh-add, có thể nạp và sử dụng khóa trực tiếp từ vùng bảo mật
  • Nếu thiết lập biến môi trường SSH_SK_PROVIDER trong .zprofile, thì SSH, ssh-agent, ssh-keygen đều tự động nhận diện
  • Có thể triển khai cấu trúc xác thực SSH vừa an toàn vừa tiện lợi chỉ bằng các tính năng mặc định của macOS, không cần công cụ bên ngoài

Tổng quan về hỗ trợ khóa SSH dựa trên Secure Enclave

  • macOS Tahoe hỗ trợ tạo và sử dụng khóa SSH dựa trên Secure Enclave
    • Trước đây cần các dự án bên ngoài như secretive, nhưng giờ có thể thay thế bằng tính năng mặc định của macOS
  • /usr/lib/ssh-keychain.dylib triển khai SecurityKeyProvider, cho phép truy cập Secure Enclave theo cách tương tự như thiết bị FIDO2
  • Nhờ tính năng này, có thể thực hiện xác thực SSH bằng chip bảo mật tích hợp của macOS mà không cần phần cứng ngoài như YubiKey

Tạo và quản lý khóa

  • Có thể tạo khóa Secure Enclave yêu cầu xác thực Touch ID bằng lệnh sc_auth create-ctk-identity -l ssh -k p-256-ne -t bio
    • Có thể kiểm tra danh sách khóa đã tạo và mã băm bằng lệnh list-ctk-identities
    • Có thể xóa khóa bằng lệnh delete-ctk-identity
  • Có thể kiểm tra dấu vân tay khóa SSH (fingerprint) bằng tùy chọn list-ctk-identities -t ssh

Sử dụng trong SSH

  • Có thể nạp cặp khóa từ Secure Enclave bằng lệnh ssh-keygen -w /usr/lib/ssh-keychain.dylib -K -N ""
    • Không cần nhập PIN, xác thực bằng Touch ID
    • “private key” được tạo ra không phải là khóa bí mật thực tế mà là giá trị tham chiếu thông tin xác thực FIDO
  • Sau khi sao chép khóa công khai lên máy chủ bằng ssh-copy-id,
    có thể kết nối bằng lệnh ssh -o SecurityKeyProvider=/usr/lib/ssh-keychain.dylib localhost

Tích hợp với ssh-agent

  • Có thể đăng ký trực tiếp khóa Secure Enclave vào ssh-agent bằng lệnh ssh-add -K -S /usr/lib/ssh-keychain.dylib
    • Có thể kiểm tra các khóa đã đăng ký bằng ssh-add -L
    • Sau đó thực hiện xác thực bằng lệnh ssh -o SecurityKeyProvider=/usr/lib/ssh-keychain.dylib

Thiết lập SecurityKeyProvider mặc định

  • Có thể chỉ định trực tiếp trong .ssh/config, hoặc thêm vào .zprofile dòng
    export SSH_SK_PROVIDER=/usr/lib/ssh-keychain.dylib để tự động nhận diện
  • Sau đó chỉ cần dùng các lệnh ssh-add -K hoặc ssh my-server để kết nối SSH dựa trên khóa bảo mật

Khóa có thể xuất ra (Exportable Keys)

  • Có thể tạo khóa dùng để xuất ra, được mã hóa bằng Secure Enclave bằng lệnh sc_auth create-ctk-identity -l ssh-exportable -k p-256 -t bio
    • Có thể xuất ra file PEM bằng export-ctk-identity,
      và đăng ký lại trên thiết bị khác bằng import-ctk-identities
  • Cách này giảm bớt mức độ an toàn phần nào nhưng thuận tiện cho sao lưu

Thảo luận của nhà phát triển và mở rộng mã

  • Trong phần bình luận có thảo luận về việc có thể dùng cờ .biometryCurrentSet hay không
    • Hiện tại chỉ hỗ trợ “có dùng sinh trắc học hay không (bật/tắt)”, không thể điều khiển chi tiết hơn
  • Tác giả đã đảo ngược kỹ thuật (reverse-engineering) ssh-keychain.dylib để xem xét khả năng bổ sung tính năng biometryCurrentSet vào hàm sk_enroll()
  • Ví dụ mã được đề xuất yêu cầu ký mã (codesign) bằng tài khoản Apple Developer Program thì mới có thể truy cập Secure Enclave
  • Trong mã có bao gồm logic tạo khóa, ký, đăng ký (sk_enroll, sk_sign, v.v.),
    và hiện thực quá trình tạo và ký khóa ECDSA P-256 trong Secure Enclave

Tóm tắt

  • macOS giờ đã hỗ trợ gốc xác thực SSH tận dụng trực tiếp Secure Enclave
  • Nhờ xác thực sinh trắc học bằng Touch ID và cấu trúc tương thích FIDO2, độ an toàn và tính tiện dụng được cải thiện
  • Có thể quản lý khóa SSH chỉ bằng các tính năng tích hợp sẵn của hệ thống, không cần phần cứng ngoài hay phần mềm bổ sung
  • Các nhà phát triển đang thử nghiệm mở rộng ssh-keychain.dylib để kiểm soát sinh trắc học chi tiết hơn

1 bình luận

 
GN⁺ 2025-11-24
Ý kiến trên Hacker News
  • Nếu tôi hiểu đúng, điều này có nghĩa là không thể sao lưu khóa riêng tư
    Vì nó được lưu trong Secure Enclave, nên nếu làm mất laptop thì khóa cũng mất theo
    Có vẻ chỉ có thể xuất khóa công khai. Tất nhiên có thể có cách tiếp cận khác hoặc reset bởi quản trị viên, nhưng dù vậy vẫn có chút gì đó khiến tôi thấy bất an
    OP nói sau đó sẽ trả lời và cập nhật trang web

    • Hãy xem man sc_auth. Thay vì tạo trực tiếp trong Secure Enclave, có thể tạo khóa có thể xuất ra ở dạng mã hóa
      Với lệnh ví dụ như sc_auth create-ctk-identity -l ssh-exportable -k p-256 -t bio, sau đó có thể tạo file .pem bằng export-ctk-identity
      Có thể nhập lại trên thiết bị khác bằng import-ctk-identities. Tôi định sẽ thêm nội dung này vào hướng dẫn
    • Về bản chất thì khóa gốc không phải để “xuất ra”. Mỗi lần di chuyển khóa là lại phát sinh rủi ro bị lộ
      Cốt lõi của PKI là chỉ di chuyển khóa công khai, còn khóa riêng tư phải chỉ tồn tại ở một nơi
    • Đúng vậy. Tốt hơn là tạo nhiều khóa để dùng làm bản sao lưu
      Như vậy trong mọi trường hợp khóa cũng sẽ không bị lộ
    • Việc không thể xuất khóa riêng tư là cùng một khái niệm với YubiKey
      Khóa riêng tư được tạo trên YubiKey cũng không thể sao lưu
    • Về nguyên tắc thì đúng là nên dùng nhiều khóa
      Lý tưởng nhất là mỗi thiết bị có một khóa riêng, để nếu làm mất hay bị trộm thiết bị cũng không thành vấn đề
      Tôi cất một YubiKey được bảo vệ bằng PIN trong két sắt. Như vậy nếu laptop, điện thoại và YubiKey dùng hằng ngày của tôi đều biến mất thì vẫn còn phương án dự phòng
  • Đi xa hơn một chút thì còn có thể ký GPG dựa trên ECDSA
    Tuy nhiên do lỗi nên cần GPG và SSH agent đã được vá
    Có một phiên bản gói có kèm UI cho macOS (KeetaNetwork/agent),
    và cùng backend đó cũng hoạt động trên Linux với TPM qua PKCS#11
    Khác biệt giữa GPG và SSH chỉ là cách bọc khóa và chữ ký, còn về cơ bản tất cả đều là ECDSA

  • Secretive có thiết lập đơn giản hơn, nhưng tôi định chuyển sang cách này để bớt đi một ứng dụng
    Tôi đã viết lại cách thiết lập khóa SSH dựa trên TPM trên Windows 11 trên blog của tôi

    • Tôi tò mò không biết trên Linux có thể lưu ssh-key trong TPM không
  • Đây là một tính năng khá tuyệt
    Tôi đã dùng Secretive trong thời gian dài, và nó tiện hơn nhiều so với khóa hay thẻ vật lý
    Mỗi khi khóa SSH được dùng, bạn phải bấm nút hoặc xác thực vân tay nên luôn biết rõ khi nào nó đang được sử dụng
    Bạn có thể duy trì tunnel ssh-agent để ký git an toàn ngay cả trên máy chủ từ xa
    Tuy nhiên bản Tahoe có rất nhiều lỗi và thường xuyên bị treo. Tôi không có thời gian để debug nên cứ để vậy
    Trải nghiệm SSH dựa trên Smart Card trước đây từng khiến tôi khổ sở, nhưng nếu ổn định thì cũng đáng để thử

    • Tôi cũng thích Secretive, nhưng tính năng xác nhận của ssh-agent thì OpenSSH đã hỗ trợ từ lâu rồi
      Có thể xác nhận mỗi lần dùng khóa riêng tư thông qua ssh-askpass. Chỉ là nó không phân biệt được local hay remote
  • Cần cẩn thận vì cách này dùng đường cong từng bị nghi là có backdoor do NSA cài vào

  • Tôi thắc mắc tại sao đã lưu trong Secure Enclave mà vẫn cần file khóa riêng tư

    • Triển khai sk của OpenSSH cũng vậy. Dù có tùy chọn “resident key” thì vẫn cần file khóa riêng tư
      Đây chỉ đơn thuần là tham chiếu đến thông tin xác thực FIDO, chứ không chứa dữ liệu khóa bí mật thực sự
      Với khóa sk không thường trú, file là cần thiết vì bộ xác thực phần cứng không lưu trạng thái
      Tôi không chắc triển khai của macOS là có lưu trạng thái hay không lưu trạng thái. Nó có thể bị hỏng khi cài lại OS
  • Có một dự án tên là facebookincubator/sks
    Đây là thư viện golang trừu tượng hóa nhiều loại khóa SSH dựa trên phần cứng, hỗ trợ Linux, Windows và macOS

    • Nhưng chỉ với thư viện golang thì ssh-agent không thể hoạt động
      Vì vậy trước đây tôi đã bắt đầu tự làm ssh-tpm-agent
  • Tôi muốn dùng cùng khóa riêng tư đó trên iPhone để ký email hoặc file
    Tôi tự hỏi liệu iCloud có thể xử lý việc này không

    • Những loại khóa này không được đồng bộ qua iCloud
      Thay vào đó, Passkey mới được đồng bộ. Cần tạo một SecurityKeyProvider mới giao tiếp với API Passkey
      Passkey bị ràng buộc với bundle ID của ứng dụng hoặc domain cụ thể
      Ví dụ nếu Secretive hỗ trợ Passkey, thì cặp khóa đó sẽ không thể dùng trong ứng dụng khác, nhưng
      sẽ được đồng bộ giữa nhiều thiết bị dùng cùng một ứng dụng
  • Đã đến lúc thêm tính năng mới cho KeyMux
    Công cụ này hỗ trợ enclave key cho SSH, SSL và PGP,
    ví dụ có thể truy cập máy chủ Vault bằng chứng chỉ SSL dựa trên Secure Enclave để thực hiện xác thực SSH bằng khóa riêng tư Vault không thể xuất ra
    Có thể xem tại keymux.comliên kết App Store