首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SSL客户端证书认证

SSL客户端证书认证
EN

Stack Overflow用户
提问于 2013-08-03 19:29:31
回答 2查看 941关注 0票数 0

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

简单地说,

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-04 01:01:53

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-08-04 16:29:04

TLS协议只允许交换证书,而不允许交换原始公钥。即使是"PGP密钥“(如果您想用用于TLS中身份验证的OpenPGP替换X.509,它不太受支持)实际上也是证书(它们是公钥和一组标识符和属性的有符号组合)。

尽管如此,您可以使用自签名的客户端证书执行客户端身份验证,并依赖于它们的公钥(,但您需要根据服务器已经知道的内容(如已知的列表)验证此公钥)。您需要首先了解实现这一点所涉及的安全问题。这与自签名服务器证书的问题不完全相同.(我建议保留一种更传统的方法来验证服务器证书。)

您可以让客户端发送一个自签名证书(可能使用关于服务器广告的CA列表的某些技巧),或者在TLS堆栈中执行验证,或者在应用程序中执行以后的验证。

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

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

您可以使用SSLVerifyClient optional_no_ca在Apache + PHP安装程序中执行类似的操作。同样,您的PHP应用程序无法依赖经过验证的证书,因此您也必须在那里实现这样的验证。

除非您了解您所获得的证书信息在哪一阶段已被验证,否则不要这样做。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18036469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档