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

SSL客户端证书认证
EN

Security用户
提问于 2013-08-03 19:32:20
回答 3查看 37.2K关注 0票数 10

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

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

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

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

EN

回答 3

Security用户

回答已采纳

发布于 2013-08-03 19:45:33

证书只是带有附加上下文的公钥。密钥的名称、签名、使用指南等等。SSL/TLS取决于该上下文。否则,您连接的主机将不知道密钥是否真正属于您。SSL信任机制基于显式信任证书的概念,然后是它们签署的隐式可信证书。

但是,如果您没有使用SSL或TLS,那么没有SSL或TLS的加密仍然可能发生,但是信任必须以不同的方式发生。SSH就是一个很好的例子: SSH仍然使用公钥和私钥,但是由于没有签名的层次结构,证书提供的添加的信息不会很有用,所以密钥是单独发送的。相反,客户端询问是否在服务器第一次连接时信任它的公钥,然后每次检查公钥是否与它上次看到的公钥匹配。这可能是因为SSH不使用SSL或TLS进行加密。

但是,如果您使用的是SSL协议,则协议要求必须向公钥显示证书的添加上下文。也就是说,证书是必须放置公钥以供SSL使用的容器。

如果您拥有私钥,那么使用像OpenSSL这样的工具创建一个自签名证书是非常简单的。

票数 11
EN

Security用户

发布于 2013-08-04 13:44:47

SSL/TLS使用证书支持客户端身份验证。真正在内部发生的是:

  • 服务器通过CertificateRequest消息请求“客户端证书”。
  • 客户端将其证书作为Certificate消息发送,并计算握手中前面所有消息的签名(使用其私钥);签名以CertificateVerify消息的形式发送。
  • 服务器以某种方式获取客户端公钥(通常通过将客户端证书解码为X.509证书,以X.509方式验证它,然后从它中提取公钥)并使用它验证来自客户端的签名。

然而,在协议本身中,证书被交换为不透明的字节块;每个“证书”都用指定长度的3字节头发送。因此,如果同时控制服务器和客户端代码,则完全由您来决定如何解释这些字节块。您不需要发送X.509证书。如果你愿意的话,你可以发送一个空的消息。

重要的一点仍然是:

  • 为了使身份验证有意义,服务器必须知道一些保证客户端公钥。签名表明客户端控制私钥,但只有当相应的公钥明确地附加到已知的客户端标识时,才会有任何好处。
  • 密钥对必须是适合签名的类型(即RSA或DSA,而不是Diffie-Hellman)。

现有的SSL实现可能至少坚持遵守X.509格式,在这种情况下,您必须用某种自签名的X.509证书包装您的公钥,这在一些库(如OpenSSL )中相对容易编程。

有一个标准用于用OpenPGP公钥替换OpenPGP中的X.509证书,展示了SSL固有的格式灵活性。

票数 9
EN

Security用户

发布于 2013-08-03 21:46:48

除了我们亲爱的朋友泰勒尔

您应该了解OpenSSL linux命令,并且有很好的PHP或perl编程技巧。(特别是PHP)这里有一些很好的指南: 1-http://www.php.net/manual/en/book.openssl.php和2-openssl。org您必须对openssl命令及其功能有深入的了解。

最后:(您的问题)是否可以发送服务器公钥而不是客户证书进行客户证书认证?不,因为您可能会忘记TLS握手协议,它一步一步地显示客户端服务器的身份验证和密钥交换。http://msdn.microsoft.com/en-us/library/windows/desktop/aa380513%28v=vs.85%29.aspx

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

https://security.stackexchange.com/questions/40016

复制
相关文章

相似问题

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