【问题标题】:How to get information about the client certificate?如何获取有关客户端证书的信息?
【发布时间】:2014-07-07 20:29:39
【问题描述】:

我试图解决这个问题超过一天甚至一周。 我请你至少给我一个想法或解决方案。请不要给我文档的链接,我已经熟记了。 现在的问题:

QSslSocket * server = new QSslSocket();
server->setPrivateKey("my.key");
server->setLocalCertificate("my.crt");
server->startServerEncryption();
if(server->waitForEncrypted()) {
   ...
}

在这种情况下,我使用 const 密钥和证书。我想接收有关客户端证书的信息,并根据连接的不同密钥和证书进行安装。

例如,客户端使用相同的证书,而我使用与此证书对应的密钥。

我尝试使用peer Certificate()的方法,但是返回void。

如何获取有关客户证书的信息,他使用该证书。也许有一种方法可以获取此证书。怎么做?

【问题讨论】:

  • 如果你写了一个减号,请解释他们的行为。
  • 而且标题需要更好——你要问的实际问题。
  • @Andy 我添加了标签 python,具有强大的功能,知道 C++ 的糟糕程序员将能够帮助我。解决方案或想法不依赖于语言。
  • @MichaelPetrotta 你有解决问题的想法吗?
  • @tioo:可悲的是,很多人都懒得解释。我想他们因为原标题有点不合适而投了反对票。话虽这么说,有点不清楚你在问什么。您打算阅读哪些文档? (Fwiw,我没有投反对票)

标签: c++ qt https openssl


【解决方案1】:

在 TLS 协议中,服务器先于客户端呈现其证书/身份,因此没有(标准)方法可以根据客户端证书选择呈现哪个服务器证书。一旦客户端出示其身份,服务器证书就已被锁定。

我能想到的唯一可以使用/滥用的 TLS 扩展是SNI,它可以让客户端请求自己选择的主机名(即客户端 A 请求对 cert_a 的响应.myserver.com,客户端 B 在服务器提供其证书之前请求 cert_b.myserver.com 等),因此服务器可以使用该信息来选择要提供的证书。

在 OpenSSL 中实现 SNI 并非易事,但有一些示例和 stackoverflow questions 可以查看以寻求帮助。

【讨论】:

  • 我不知道如何在 Qt 上翻译这些示例。
  • @tioo 我认为在客户端,您只需使用所需的主机名调用 QSslSocket::setPeerVerifyName,让它将其用作 SNI 的所需主机名。
  • 客户端是一个安装了站点证书的浏览器。我无权访问源,但它应该发送所需的数据。问题是如何获取你需要的数据?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
相关资源
最近更新 更多