基於 PGP 密鑰的認證系統
考慮我們實現遠端服務,可以通過API(即restful http 或grpc)訪問。所有使用者都通過 pgp 密鑰進行身份驗證,並且每個使用者都有 pgp 密鑰對。
如何為此類服務實施身份驗證?
我看到了多種方法,但我不確定選擇哪一種:
- 使用 PGP 簽名生成對自簽名 X.509 證書進行簽名。
讓 Web 使用者創建一個自簽名 X.509 證書並將證書和私鑰儲存在 PKCS#12 密鑰庫中。然後創建一個包含此證書的 PGP 簽名容器。在驗證和剝離 PGP 簽名後,讓 Web 伺服器將其放入信任庫中。客戶端需要使用所使用的瀏覽器(或 Windows 商店,如果使用 IE / Edge / 另一個基於 SChannel 的瀏覽器)配置 PKCS#12 軟令牌。
您需要向使用者提供有關如何創建自簽名證書以及如何將自簽名證書和私鑰儲存區放入瀏覽器的本地密鑰儲存區的指導。您還可以創建一個應用程序來為使用者執行此操作。
PGP 不適合 Web 服務身份驗證,因為身份驗證將涉及伺服器發出質詢和客戶端返回簽名響應。現在使用者將如何提供簽名的響應(我從您的問題中了解到客戶端是瀏覽器)?您的選擇是:
- 在網頁上提供一個帶有一些 Javascript 庫的 UI,該庫獲取私鑰並簽署響應。使用者應該反對這種方法,因為將您的私鑰載入到網頁通常是不安全的。
- 將未簽名的響應從瀏覽器複製到另一個客戶端,對其進行簽名,然後將簽名的響應複製到瀏覽器。這種方法肯定會受到使用者的反對,他們會因為你提供的服務可用性差而討厭你。
因此,如果您有任何其他選擇,最好不要使用 PGP。如果您必須使用 PGP,那麼第一個選項可能是唯一可以實際工作的選項。例如,這類似於 AWS 管理控制台的工作方式,儘管在他們的情況下,它們不使用密鑰進行身份驗證。一個人寧願用相當於使用者名 + 請求參數的方式呼叫他們的 Web 服務,並用他們的私鑰對消息進行簽名。
因此,如果您有靈活性,也許您可以通過向使用者發出“使用者名”來跳過挑戰部分;例如,這可能是 PGP 公鑰的散列。然後,使用者會將使用者名作為服務參數之一發送,然後對消息進行簽名,類似於 AWS 的工作方式。然後,伺服器通過根據使用者名檢索公鑰並使用公鑰驗證簽名來驗證使用者身份。請注意,此方法仍然需要使用者將私鑰載入到瀏覽器。