SSL vs SSH
比較 SSL/TLS 與 SSH 的運作流程,以及 openssl 與 ssh-keygen 產生的金鑰用途與 CloudFront 使用 PEM 的原因。
問題:
openssl和ssh-keygen長出來的 secret 用途差在哪→ SSL 和 SSH 的差別是啥?
→ SSL 和 SSH 的運作流程
- →
openssl和ssh-keygen長出來的 secret 用途→ 為啥 Cloudfront signed URL 使用的是
openssl長出來的 key 而不是ssh-keygen
SSL vs SSH
顧客 <-- SSL --> 店面 <-- SSH --> 管理員
(client) (server) (client)
- SSL:確保交易資訊不會被偷看、確保店面是官方正店
- SSH:用於遠端管理、維護運作
SSL/TLS 運作流程
- TLS handshake
-
Client 發起通訊、提供自己支援的加密算法和隨機數
-
Server 回覆:選擇雙方都支援的加密法、SSL/TLS 證書、隨機數
- SSL/TLS 證書裡包含 server public key (generated by
openssl) / server domain name / CA signed number,用於給 client 驗證
- SSL/TLS 證書裡包含 server public key (generated by
-
Client 驗證證書的合法性
-
交換臨時公鑰 (Ephemeral Key Exchange)
- server 生成 DHE key pair,並把 DHE public key 用 openssl 長出來的私鑰簽名後傳給 client(用 private key 簽名確保未被篡改;傳送 public key + public key 簽章)
- client 用 server 憑證的 public key 驗證簽名,確認未被篡改
- client 生成 DHE key pair,並把 DHE public key 傳給 server
- server/client 用自己的 private key + 對方的 public key 計算出共享密鑰,計算結果會一致,作為後續加密通訊的對稱密鑰
⚠️ 為什麼設計這樣的流程?
- 效率:避免臨時公鑰加密和解密的開銷,簡化交換流程。
- 安全性:即使交換的公鑰被攔截,攻擊者仍無法計算共享密鑰(基於 Diffie-Hellman 的數學特性)。
- 身份驗證:伺服器簽名保證了公鑰來源的可信性,防止中間人攻擊。
-
之後的通訊都用這把 key 加解密
-
- 為什麼交換公鑰時的內容被偷聽、竄改無效?
- 非對稱式加密沒有私鑰就解不開
- Key exchange protocol
- RSA 缺點:server private key 被洩漏則訊息可能會被破解
- Ephemeral Diffie-Hellman (DHE & ECDHE)
- 用 ephemeral key 進行金鑰交換
- 基於數學難題生成 ephemeral key
- 完整性校驗
- Client 可以驗證 CA 簽名的合法性
- TLS 使用 HMAC (Hash-based message authentication code) 來驗證訊息是否被篡改
SSH 運作流程
-
建立連線:Key exchange by DHE & ECDHE
→ 驗證 Server 身份 by public key fingerprint
-
Server 驗證 Client 身份 by 密碼或者 public key
→ server 收到 client 的 public key 會放在
~/.ssh/authenticated_keys裡面→ 這個 client public key 是由
ssh-keygen長出來的 -
使用第一步交換的 key 對後續傳輸的訊息加密
為啥 Cloudfront signed URL 使用的是 openssl 長出來的 key 而不是 ssh-keygen
- Cloudfront 要求的密鑰格式是 PEM,這也是 OpenSSL 生成密鑰的預設格式,如果使用
ssh-keygen則需要額外設定 ssh-keygen主要支援 SSH 協定,用於遠端登錄或身份驗證,協定本身就與 SSL 不同
→ 衍伸題:為啥 CloudFront 要用 PEM 格式?
- 行業標準化: PEM 格式是加密領域的通用標準,廣泛兼容多種工具和協議。
- 靈活性: 可用於存儲公私鑰和證書,適合 CloudFront 的應用需求。
- 可讀性和易用性: 基於文本的格式便於傳輸和管理。
- 安全性: 支持加密密鑰存儲。
OpenSSL & ssh-keygen 密鑰用途
| 特性/用途 | OpenSSL 生成的密鑰 | ssh-keygen 生成的密鑰 |
|---|---|---|
| 設計目標 | 通用加密工具,支持多種協議與場景(如 SSL/TLS、數字簽名) | 專為 SSH 協議設計,用於遠程登錄和身份驗證 |
| 格式 | 支持 PEM(默認)、DER、PKCS#8 等多種格式 | 默認生成 OpenSSH 格式,可選擇 PEM 格式 |
| 用途場景 | SSL/TLS 通信、數字簽名、證書生成、數據加密 | SSH 登錄、SCP/SFTP 文件傳輸、SSH 隧道 |
| 應用協議 | SSL/TLS、HTTPS、X.509 證書 | SSH(Secure Shell) |
| 生成密鑰的常見算法 | 支持 RSA、ECDSA、Ed25519、DSA、EC | 支持 RSA、ECDSA、Ed25519 |
| 密鑰的主要用途 | - 簽署和驗證 SSL/TLS 憑證 - 加解密數據 - 密鑰交換 | - 驗證 SSH 登錄 - 無密碼登錄 - SSH tunnel 安全 |
| 密鑰使用環境 | 通常搭配 Web 服務器(如 Nginx、Apache)或證書管理工具 | 通常搭配 OpenSSH 服務器或客戶端 |
| 可否用於 CloudFront | 是,支持 PEM 格式,適合用於 CloudFront Signed URL | 否,默認格式不兼容,需手動轉換為 PEM 格式才能使用 |
| 典型命令 | openssl genpkey 或 openssl genrsa | ssh-keygen -t rsa -b 2048 |