2013-08-03 282 views
0

是否有可能使用客戶端證書認證只有公鑰和私鑰(我沒有生成任何證書,我只有公鑰和私鑰)的程序。SSL客戶端證書認證

只是,

我想通過客戶端證書身份驗證在服務器上進行身份驗證。 但以編程方式製作客戶端證書很困難。

我想只使用公鑰和私鑰(我只有公鑰和私鑰,沒有證書)進行客戶端證書驗證。

可以發送服務器公鑰而不是客戶端證書進行客戶端證書身份驗證嗎?

回答

1

可以發送服務器公鑰而不是客戶端證書進行客戶端證書身份驗證嗎?

否。SSL協議已定義。如果有可能,它不會實現目標。服務器的公鑰不會以任何形式或形式驗證服務器的身份。

2

TLS協議只允許交換證書,而不是原始公鑰。即使是「PGP密鑰」(如果你想用OpenPGP for authentication in TLS代替X.509,這個支持得更少)實際上是證書(它們是公鑰和一組標識符和屬性的簽名組合)。

這就是說,你可以使用自簽名的客戶端證書進行客戶端身份驗證,並依靠自己的公鑰(,但你需要驗證反對的東西你的服務器已經知道,這個公鑰如已知的名單) 。您需要了解首先實施的安全影響。這與自簽名服務器證書不完全相同。 (我建議保留一種更傳統的方法來驗證服務器證書。)

您可以讓客戶端發送自簽名證書(可能使用certain tricks regarding the CA list advertised by the server),並在TLS堆棧中執行驗證,或者在應用。

請注意,許多應用程序容器(例如Java中的Tomcat/Jetty)期望SSL/TLS層驗證客戶端證書。因此,如果您在那裏跳過身份驗證(並且希望稍後在容器中或作爲應用程序的一部分執行此操作),則許多應用程序框架將會混淆。在執行任何需要在應用程序中進行身份驗證的操作之前,您需要非常小心以確保身份驗證實際上在某處執行。

例如,可以讓信任管理器允許Tomcat/Jetty中的任何客戶端證書通過,但不能依賴javax.servlet.request.X509Certificate請求屬性進行任何方式的驗證(大多數框架都會否則預計)。您需要在您的應用程序中實現一些驗證邏輯:例如,在任何驗證功能之前先過濾此客戶端證書中的公鑰與您已知的公鑰列表(但是您想將公鑰與一個標識符)。或者,您也可以在自定義信任管理器(使用Java)中執行此驗證,這將需要較少的應用程序內的工作。

您可以使用SSLVerifyClient optional_no_ca在Apache Httpd + PHP設置(例如)中執行類似操作。同樣,你的PHP應用程序不能依賴於已經驗證的證書,所以你也必須在那裏實現驗證。

除非您瞭解您獲得的證書信息在哪個階段得到驗證,否則不要執行任何操作。