2015-06-20 226 views
1

我是新來的SSL和證書。我一直在做我的關於客戶證書驗證研究。我已閱讀thiswiki客戶端證書認證

所以如果我要實現我的B2B REST服務的客戶端證書身份驗證解決方案,我應該做以下

  1. 要求客戶產生自己的公鑰和私鑰,並生成證書(CA頒發?)他們公共密鑰。通過電子郵件或USB密鑰發送該證書。
  2. 在服務器端導入客戶端的公共證書到信任存儲和啓用客戶端驗證
  3. 在手抖客戶出示它的證書,並通過認證,因爲服務器證書的副本,它的信任存儲區和可覈實CertificateVerify消息

我的問題是它如何阻止有人冒充我的客戶。讓我們假設黑客X將一個通過認證的CA作爲握手的一部分發送給服務器。然後服務器會自動信任它並授予訪問權限。

回答

1

我有你的問題分解成兩個部分。一個

部分:Let's say a hacker X sends a CA issued certified to the server as part of handshake. Then server would automatically trust it and grant access.

如果X aquires一個真實的客戶端的客戶端證書,然後沒關係。因爲證書本身不包含任何祕密。這些證書可以在任何地方沒有做任何損害(除非你想保持你的電子郵件地址保密,儘量不要發表公佈。但它可能會在一段時間後走出去,而且公司製作的X509CertificateExtensions不考慮以及)

私鑰是必須由客戶保守祕密的重要關鍵。如果X也獲得私鑰,則X可以強制一個可信的客戶端並登錄到您的系統中。因此客戶端必須保護這些私鑰不被盜用!

這是因爲內的客戶端身份驗證握手,服務器不僅要求客戶端證書。客戶還必須通過使用他的私鑰來證明他是該證書的真正擁有者,如the wiki you referenced所述:The client sends a CertificateVerify message, which is a signature over the previous handshake messages using the client's certificate's private key.這樣的簽名可以只有如果客戶端擁有屬於證書的私鑰, wiki以及:This lets the server know that the client has access to the private key of the certificate and thus owns the certificate.

第二部分:How do establish a initial trust relationship?

這部分是困難的,如果有涉及到許多客戶。這就是PKI成立的原因。您信任CA,並且CA應該對請求證書的客戶進行身份檢查。

自制軟件解決方案,在這種情況下,你有你自己的CA,或者你不信任的CA,部分是由你。 您必須確保您只能爲真正的客戶提供服務。如果您通過USB鑰匙進行此操作,並且客戶親自將它們交給您,那沒關係。

如果您收到一封電子郵件,內容爲「您好,我是ABC的朋友XYZ,請記住?順便說一句,這是我的證書」 - 檢查兩次。

1

基於客戶端證書的身份驗證實際上不驗證客戶端連接是否在您的白名單中。假設客戶端X從公共CA Y獲得一個證書,並且將Y的證書導入到您的可信列表中,那麼來自X的連接將成功。

現在,如果入侵者Z從相同的CA Y購買證書(知道您的應用程序將信任的CA是一個複雜的部分),並且嘗試使用您的應用程序進行身份驗證,驗證仍然會成功,因爲其有效的證書來自可信任的CA.該應用程序將繼續爲Z服務,這是你不想要的。

因此,最好的方法是自我簽署客戶端客戶端證書(並將其部署在您信任的客戶端上),在這種情況下您將成爲CA,從而限制入侵者獲取訪問權限。

下面是一些參考,

# Create the CA Key and Certificate for signing Client Certs 
openssl genrsa -des3 -out ca.key 4096 
openssl req -new -x509 -days 365 -key ca.key -out ca.crt 

# Create the Client Key and CSR 
openssl genrsa -des3 -out client.key 1024 
openssl req -new -key client.key -out client.csr 

# Sign the client certificate with our CA cert. 
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt 

如果你只是希望只允許少數已知的IP地址,然後基於IP網絡的阻塞/節流是首選的方法(但是,有其自身管理的複雜性/更新IP列表)。