0

是否可以制作一个仅使用公钥和私钥进行客户端证书身份验证的程序(我没有生成任何证书,我只有公钥和私钥)。

简单地,

我想使用客户端证书身份验证在服务器上进行身份验证。但是很难以编程方式制作客户端证书。

我想只使用公钥和私钥进行客户端证书身份验证(我只有公钥和私钥,没有证书)。

是否可以发送服务器公钥而不是客户端证书进行客户端证书身份验证?

4

2 回答 2

3

TLS 协议只允许交换证书,不允许交换原始公钥。甚至“PGP 密钥”(如果您想用OpenPGP 替换 X.509 以在 TLS 中进行身份验证,则支持较少)实际上是证书(它们是公钥和一组标识符和属性的签名组合) .

话虽如此,您可以使用自签名客户端证书执行客户端身份验证并依赖其公钥(但您需要根据您的服务器已经知道的内容验证此公钥,例如已知列表)。您需要首先了解实现此功能的安全隐患。这与自签名服务器证书的问题并不完全相同。(我建议保留更传统的方法来验证服务器证书。)

您可以让客户端发送自签名证书(可能使用有关服务器公布的 CA 列表的某些技巧)并在 TLS 堆栈中或稍后在应用程序中执行验证。

请注意,许多应用程序容器(例如 Java 中的 Tomcat/Jetty)期望 SSL/TLS 层来验证客户端证书。因此,如果您跳过那里的身份验证(并希望稍后在容器内或作为应用程序的一部分进行),许多应用程序框架将会混淆。在执行任何需要在应用程序中进行身份验证的操作之前,您需要非常小心地确保在某处实际执行了身份验证。

例如,在 Tomcat/Jetty 中有一个允许任何客户端证书通过的信任管理器是可以的,但您不能依赖javax.servlet.request.X509Certificate请求属性已经以任何方式验证(大多数框架本来会期望)。您需要在应用程序中实现一些验证逻辑:例如,在任何经过​​身份验证的功能之前有一个过滤器,该过滤器将此客户端证书中的公钥与您已知的公钥列表进行比较(或者您希望将公钥与标识符)。或者,您也可以在您的自定义信任管理器(在 Java 中)中执行此验证,这将需要在应用程序中进行较少的工作。

您可以在 Apache Httpd + PHP 设置(例如)中执行类似的操作,使用SSLVerifyClient optional_no_ca. 同样,您的 PHP 应用程序不能依赖已验证的证书,因此您也必须在那里实现验证。

除非您了解您获得的证书信息是在哪个阶段得到验证的,否则请不要这样做。

于 2013-08-04T16:29:04.883 回答
1

是否可以发送服务器公钥而不是客户端证书进行客户端证书身份验证?

不,SSL 协议已经定义。如果有可能,它就不会实现目标。服务器的公钥不会以任何形式或形式验证服务器的身份。

于 2013-08-04T01:01:53.220 回答