根據可用密碼套件列表生成私鑰
我正在建構自己的基於 MQTT 的網路,我將為此生成自己的ca/server/client證書以進行身份驗證。
這裡的目標是保持消息大小**盡可能小,**以減少頻寬流量,但我已經知道 TLS 層為其發送的流量增加了相當大的成本。也就是說,使用客戶端證書,我實際上必須在每次 TCP 連接嘗試時將客戶端證書發送到伺服器,反之亦然,這可能會增加 8kb,甚至無需發送一個字節的真實數據。(我希望到目前為止我的那部分是正確的)
此外,由於我的許多客戶都是小型嵌入式設備,它們只能使用有限數量的密碼套件,因此事情變得更加複雜。
例如,這是客戶端可以使用的密碼套件的允許列表:
現在在這個例子中,唯一可用的密碼套件是基於PSK和RSA的。當然,我很想使用EC密碼套件,但鑑於列表,我認為這不是我的選擇。
現在我有幾個問題是:
- 給定密碼套件列表,任何私鑰(CA、伺服器或客戶端)都可以是基於 EC 的還是都必須是 RSA?
- 我是否還應該將使用 TLS 包裝的單個 MQTT 包保持盡可能小,或者這是否會用額外的字節填充?(例如,如果我的包只有 5 個字節,或者我可以自由編寫一個 25 字節長的包,這會有所不同嗎)
- 如果我想減少流量頻寬,我還應該記住哪些其他事項?
- ECDHE-RSA 密碼套件讓我頭疼。他們使用 EC 進行密鑰交換,但使用 RSA 進行 PKI ?這是否意味著伺服器可以擁有 EC 私鑰。
給定密碼套件列表,任何私鑰(CA、伺服器或客戶端)都可以是基於 EC 的還是都必須是 RSA?
當然,不僅僅是 RSA,或者 TLS-PSK 的預共享對稱密鑰。
請注意,對於 TLS-RSA 密碼套件,密鑰將用於密鑰封裝,即加密密鑰的使用和 TLS-ECDHE-RSA 密碼套件,您需要一個可用於實體身份驗證的證書以及用於簽名的密鑰。通常這兩個位都是為 TLS 特定證書設置的。
我是否還應該將使用 TLS 包裝的單個 MQTT 包保持盡可能小,或者這是否會用額外的字節填充?(例如,如果我的包只有 5 個字節,或者我可以自由編寫一個 25 字節長的包,這會有所不同嗎)
AES 將加密為 16 字節的倍數,3DES 將加密為 8 的倍數。3DES 仍然相當安全,但不應再真正使用它。幸運的是 TLS 使用 3 密鑰 3DES,所以就是這樣。
ECDHE-RSA 密碼套件讓我頭疼。他們使用 EC 進行密鑰交換,但使用 RSA 進行 PKI ?這是否意味著伺服器可以擁有 EC 私鑰。
正確,但 ECDHE 中的 E 表示短暫-短暫的 Diffie-Hellman。客戶端和伺服器都將(可能/希望)為每個連接生成一個新的密鑰對。EC 的密鑰對生成與執行 DH 密鑰協議本身的速度差不多,但它比 RSA 密鑰對生成快得多。
此密鑰對是特定於會話的,不需要儲存,因此您不必圍繞它執行任何密鑰管理。只有 RSA 密鑰用於實體身份驗證,因此確實需要管理私鑰和證書。