![]()
全球超過1400萬臺服務器每天承受著同一個痛點:新員工入職要往幾十臺機器里塞公鑰,有人離職時你永遠不知道他的密鑰還躺在哪臺機器的哪個角落。這不是某個創業公司的技術債,這是SSH協議設計者2010年就埋好的解藥——只是沒人按說明書吃。
SSH證書體系在OpenSSH 5.4版本(2010年3月)就已內置,比Kubernetes誕生還早4年。
傳統SSH密鑰管理像什么?像給公司每個員工配一把實體鑰匙,而且要親手把鑰匙插進每一扇他可能需要打開的門。十個人、三十臺服務器,鑰匙數量就是300把。有人離職,你得回憶他摸過哪些門,然后一把一把換鎖。現實中沒人這么干,但服務器管理上,這就是標準操作。
證書體系做的第一件事,是把"信任誰"和"信任什么"拆開。你不再維護一張巨大的"人→機器"映射表,而是建立一個證書頒發機構(CA)——其實就是另一對SSH密鑰。所有服務器信任這個CA,CA簽發的證書就自動被信任。員工入職,CA給他簽一張用戶證書;服務器上線,CA給它簽一張主機證書。兩張證書,解決300把鑰匙的問題。
15年無人問津的技術,到底卡在哪
2010年的OpenSSH 5.4 release notes里,證書功能被描述為"支持SSH協議2.0的證書格式"。沒有發布會,沒有博客教程,文檔里幾行配置示例淹沒在數百頁man page中。當時的典型場景是:運維工程師打開文檔,看到ssh-keygen -s參數,以為是什么高級用法,直接跳過。
更大的障礙是心智模型。TLS證書在Web領域普及花了十年,靠的是瀏覽器廠商強制推行和可視化鎖圖標。SSH沒有UI,沒有綠色小鎖,證書驗證成功時命令行毫無反饋——這恰恰是設計者的意圖,靜默信任比彈窗確認更符合自動化場景。但副作用是,工程師根本意識不到這個功能存在。
云廠商的介入進一步固化了舊習慣。AWS EC2的密鑰對導入、Azure的SSH公鑰擴展、GCP的OS Login,都在傳統公鑰模型上疊床架屋。它們解決了部分痛點(比如集中存儲公鑰),卻讓證書方案顯得更加"非主流"。一個諷刺的事實:你在AWS控制臺點擊"下載密鑰對"時,后臺完全可以用證書實現同樣的功能,但AWS選擇了兼容2010年之前的工作流。
技術社區并非完全沒有嘗試。2012年,Facebook工程師在USENIX LISA大會上分享了內部SSH證書部署經驗,提到他們管理著"數萬臺服務器"的證書輪換。但演講視頻播放量至今不到兩千,且Facebook的解決方案高度定制,依賴內部基礎設施,外部團隊難以復制。2018年,Netflix開源了BLESS(Bastion's Lambda Ephemeral SSH Service),用AWS Lambda實現短期證書簽發,算是把證書方案拉回了主流視野——但BLESS本身已于2021年歸檔,維護者建議遷移到更現代的替代方案。
證書體系的工作機制:比TLS更簡單
如果你理解HTTPS證書,SSH證書幾乎是子集。核心差異只有兩點:沒有證書鏈(通常只有一級CA),沒有在線撤銷檢查(依賴短期有效期)。
部署需要兩個獨立的CA密鑰對。用戶CA簽發員工證書,主機CA簽發服務器證書。分離的原因是攻擊面控制:如果用戶CA私鑰泄露,攻擊者只能偽造員工身份;主機CA泄露,攻擊者只能偽造服務器身份。兩者同時泄露的概率,遠低于單一CA的平方級風險。
生成CA密鑰的操作和生成普通SSH密鑰無異:
ssh-keygen -t ed25519 -f user_ca -C "user-ca@yourorg"
ssh-keygen -t ed25519 -f host_ca -C "host-ca@yourorg"
私鑰文件(user_ca和host_ca)需要離線存儲,物理隔離,多人分持。這不是過度謹慎——這些密鑰的泄露意味著攻擊者可以簽發任意服務器的可信證書,或偽裝成任意員工登錄任意服務器。
主機證書的簽發流程:獲取服務器的現有主機公鑰(通常是/etc/ssh/ssh_host_ed25519_key.pub),用主機CA私鑰簽名,附加有效期和主機名標識:
ssh-keygen -s host_ca \
-I "webserver-prod-01" \
-h \
-n "webserver-prod-01.example.com,10.0.1.50" \
-V +52w \
/etc/ssh/ssh_host_ed25519_key.pub
參數說明:-s指定簽名密鑰,-I是證書標識(用于審計日志),-h聲明這是主機證書而非用戶證書,-n列出證書有效的主機名和IP,-V設置52周有效期。輸出文件ssh_host_ed25519_key-cert.pub需要復制回服務器,并在sshd_config中聲明:
HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub
重啟sshd后,服務器連接時自動呈現證書。客戶端無需再面對"是否信任此主機指紋"的提示——因為證書已由受信任的CA簽名。
客戶端配置同樣簡潔。將主機CA的公鑰加入known_hosts,使用@cert-authority指令:
@cert-authority *.example.com ssh-ed25519 AAAA...your-host-ca-public-key...
通配符*.example.com意味著:該CA簽發的任何example.com子域證書,客戶端自動信任。新服務器上線,只需簽發證書,無需觸碰任何客戶端配置。
用戶證書:入職一張卡,離職即失效
主機證書解決了"服務器身份驗證"問題,用戶證書解決"員工權限管理"問題。
傳統模型中,員工公鑰分散在各服務器的authorized_keys文件中。權限變更(比如從只讀改為可寫)需要登錄每臺服務器修改文件。證書模型把權限信息編碼進證書本身,通過principals字段聲明。
簽發用戶證書的命令:
ssh-keygen -s user_ca \
-I "alice@company.com" \
-n "developers,prod-readonly" \
-V +1w \
alice.pub
這里的關鍵是-n參數:alice獲得的證書包含兩個principals,"developers"和"prod-readonly"。服務器端的sshd_config可以基于principals匹配權限:
Match principals "developers"
AllowUsers alice bob carol
ForceCommand internal-sftp
Match principals "prod-readonly"
PermitOpen 10.0.1.0/24:22
X11Forwarding no
權限粒度完全由CA簽發時的principals列表決定。alice從開發崗調到運維崗,不需要修改任何服務器配置——新證書包含"operators" principal,舊證書過期后自動失效。
證書有效期是安全設計的核心。短期證書(如24小時或1周)意味著泄露的窗口極窄,且無需實現復雜的撤銷機制。對比傳統公鑰:員工2019年離職,他的公鑰可能在某臺2021年克隆的鏡像服務器里沉睡至今。
大規模部署需要自動化簽發流程。小型團隊可以用腳本+YubiKey保護CA私鑰;中型團隊考慮HashiCorp Vault的SSH秘密引擎,支持動態證書簽發;大型基礎設施可能需要自研服務,對接HR系統實現入職自動授權、離職即時失效。
現實阻力:為什么2010年的功能2025年還沒普及
技術債的積累有路徑依賴。2010年的運維團隊已經習慣了authorized_keys的編輯流程,證書方案沒有壓倒性優勢——直到服務器數量從"幾十臺"變成"幾千臺"。
監控和審計是另一個隱形門檻。傳統模型中,grep authorized_keys能直觀看到誰有權限。證書體系下,權限信息分散在:CA簽發日志、證書本身的principals字段、各服務器的Match配置。需要額外建設集中化審計系統,才能回答"alice現在能訪問哪些服務器"這個問題。
混合環境的兼容性也需考慮。部分嵌入式設備、老舊網絡設備運行的是裁剪版SSH實現,可能不支持證書擴展。證書方案通常需要并行運行傳統公鑰作為fallback,增加了部署復雜度。
但最大的障礙可能是組織慣性。證書體系要求安全團隊持有CA私鑰,開發和運維團隊改變"我自己管理服務器訪問"的習慣。這不是技術問題,是權責重新劃分的問題。很多公司的SSH密鑰管理混亂,恰恰因為"沒人覺得這是自己的責任"。
一些團隊嘗試的折中方案:保持傳統公鑰,但用配置管理工具(Ansible/Puppet/Chef)集中推送authorized_keys。這解決了"分散管理"問題,卻沒解決"長期有效"和"主機身份驗證"問題。配置管理工具的密鑰泄露,攻擊面比CA私鑰泄露更廣——因為工具通常擁有所有服務器的root權限。
2025年的重新評估:云原生時代的契合點
容器和短暫工作負載的興起,讓證書方案的優勢更加凸顯。Kubernetes節點每小時自動伸縮,傳統公鑰模型下,新節點需要某種機制獲取authorized_keys內容——通常是打包進鏡像或從Secret掛載,兩者都有明顯的安全或運維缺陷。證書方案中,節點啟動時向CA服務申請短期主機證書,生命周期與節點本身綁定。
GitHub在2023年宣布支持SSH證書用于倉庫訪問,雖然實現方式與服務器登錄場景不同,但標志著主流平臺開始認可證書模型的價值。云廠商的托管服務也在緩慢跟進:AWS Systems Manager Session Manager支持基于IAM角色的臨時SSH訪問,底層實現類似證書機制,只是對用戶透明。
開源生態的成熟降低了 adoption 門檻。Smallstep的step-ca項目提供完整的SSH證書CA實現,支持ACME協議自動簽發;Teleport(現Gravitational)將證書體系包裝成完整的基礎設施訪問平臺;OpenSSH 8.9+引入的FIDO/U2F密鑰支持,可以與證書結合實現硬件綁定的雙因素認證。
一個值得關注的細節:OpenSSH 9.0(2022年4月)默認禁用了RSA簽名算法,推薦ed25519或ECDSA。證書體系同樣受益——ed25519證書比RSA證書小約75%,簽發和驗證更快,在大規模自動化場景中差異顯著。
部署證書體系的最佳切入點,通常是新環境或新團隊。從Greenfield項目開始,建立CA基礎設施和簽發流程,再逐步遷移存量服務器。試圖一次性改造十年積累的SSH密鑰,往往因復雜度而失敗。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.