首页 文章

SSL客户端证书认证

提问于
浏览
0

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

只是,

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

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

It is possible to send server public key instead of client certificate for client certificate authentication ?

2 回答

  • 2

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

    不可以 . 已经定义了SSL协议 . 如果有可能,它将无法实现目标 . 服务器的公钥不以任何形式或形式验证服务器的标识 .

  • 1

    TLS协议仅允许交换证书,而不是原始公钥 . 甚至"PGP keys"(如果你想用支持更少的OpenPGP for authentication in TLS取代X.509)实际上是证书(它们是公钥和一组标识符和属性的签名组合) .

    这就是说,您可以使用自签名客户端证书执行客户端身份验证并依赖其公钥( but you will need to verify this public key against something your server already knows, such as a known list ) . 您需要首先了解实现此问题的安全隐患 . 这与自签名服务器证书不完全相同 . (我建议保留一种更传统的方法来验证服务器证书 . )

    您可以使客户端发送自签名证书(可能使用certain tricks regarding the CA list advertised by the server)并在TLS堆栈中执行验证或稍后在应用程序中执行验证 .

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

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

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

    Don't do any of this unless you understand at which stage the certificate information you get has been verified.

相关问题