Openssl 客户端向您提供其公共证书时的相互身份验证

Openssl 客户端向您提供其公共证书时的相互身份验证,openssl,ssl-certificate,mutual-authentication,Openssl,Ssl Certificate,Mutual Authentication,通常,双向ssl又名双向身份验证包括生成服务器ca密钥和证书等。然后客户端生成csr,将其提供给您,然后您签署他们的csr,并向他们提供客户端证书 但是, 我遇到过这样一个案例,客户机要求我通过交换彼此的x509公共证书来实现“相互身份验证”。听说过这个吗?可能被称为“双向SSL”或“相互身份验证”以外的东西 我正在努力使用openssl查找有关此的任何文档或信息。传统的客户端证书方法利用CA和数字签名来验证证书的真实性 在您的情况下,似乎您想要的是事先在可信通道中交换证书。在这种情况下,您需要

通常,双向ssl又名双向身份验证包括生成服务器ca密钥和证书等。然后客户端生成csr,将其提供给您,然后您签署他们的csr,并向他们提供客户端证书

但是,

我遇到过这样一个案例,客户机要求我通过交换彼此的x509公共证书来实现“相互身份验证”。听说过这个吗?可能被称为“双向SSL”或“相互身份验证”以外的东西


我正在努力使用openssl查找有关此的任何文档或信息。

传统的客户端证书方法利用CA和数字签名来验证证书的真实性

在您的情况下,似乎您想要的是事先在可信通道中交换证书。在这种情况下,您需要做的是存储此证书的指纹,并在收到请求时验证签名是否正确

下面是Node.JS中的一个示例:

consthttps=require('https');
常数fs=要求('fs');
常量选项={
key:fs.readFileSync('/tmp/server.key'),
证书:fs.readFileSync('/tmp/server.crt'),
requestCert:对,
拒绝:错误
};
https.createServer(选项,(请求,回复)=>{
//我们使用蛇油证书,没有CA,因此我们将拥有未经授权的证书。
控制台日志(请求套接字授权);
var cert=req.connection.getPeerCertificate();
//这是证书指纹,验证它是否是您期望的指纹
控制台日志(cert.fingerprint);
书面记录(200);
res.end('hello world\n');
}).听(8000);
生成证书和密钥的ruby脚本:

需要“openssl”
keypair=OpenSSL::PKey::RSA.new(2048)
cert=OpenSSL::X509::Certificate.new
cert.not_before=Time.now
cert.subject=OpenSSL::X509::Name.new([
[“C”、“否”],
[“圣”、“奥斯陆”],
[“L”,“奥斯陆”],
[“CN”,“根CA”]
])
cert.issuer=cert.subject
cert.not#u after=Time.now+100000000#40年左右
cert.public\u key=keypair.public\u key
cert.sign(密钥对,OpenSSL::Digest::SHA256.new)
File.open(“/tmp/client.key”,“w+”)do|f|
F
我遇到过这样一个案例,客户机要求我通过交换彼此的x509公共证书来实现“相互身份验证”。听说过这个吗

我相信这仍然叫做相互认证

通常,基于证书的相互认证分为两种模式之一。第一种是具有CA层次结构的企业模型,组织的CA同时对客户机和服务器证书进行签名

第二种模式是客户端使用自签名证书,即所谓的。它被称为originbound,因为每个需要证书的站点(Origin)都会让客户端提供一个证书。原产地证书是IETF的基础

我不清楚令牌绑定是否与源绑定证书具有相同的安全属性。您知道,我们可以通过将身份验证作为通道设置的一部分,使用原始绑定证书来阻止中间人攻击。令牌绑定分离绑定并将其在堆栈中上移。我认为它允许MitM充当中间人


企业证书

在企业模型中,以下是使用OpenSSL的操作

在服务器上执行以下操作。服务器将处理客户端证书验证:

  • 使用
    SSL\u-verify\u-PEER
    调用
    SSL\u-CTX\u-set\u-verify
    ,如果没有对等证书,则调用
    SSL\u-verify\u-FAIL\u
  • 调用
    CTX\u set\u client\u CA\u list
    设置服务器将接受的颁发者CA列表。这将导致向客户端发送相应的SSL/TLS消息,提示输入证书。这只会向客户端发送一个名称列表;他们仍然必须在服务器上受信任
  • 向服务器接受的发卡机构调用
    SSL\u CTX\u load\u verify\u location
    。这增加了服务器端的信任
在客户端,执行以下操作:

  • 调用
    SSL\u CTX\u use\u certificate\u file
    加载客户端证书
  • 根据需要调用
    SSL\u CTX\u use\u certificate\u chain\u file
  • 调用
    SSL\u CTX\u使用\u PrivateKey
    加载私钥

原产地证书

源绑定证书和自签名证书略有不同,因为没有CA层次结构

在服务器上执行以下操作。服务器不调用
SSL\u CTX\u load\u verify\u locations
CTX\u set\u client\u CA\u list
,因为它是自签名证书

  • 使用
    SSL\u-verify\u-PEER
    调用
    SSL\u-CTX\u-set\u-verify
    ,如果没有对等证书,则调用
    SSL\u-verify\u-FAIL\u
  • 密钥交换后调用
    SSL\u获取\u对等\u证书
    。验证提供给服务器的客户端证书
在客户端,执行以下操作。它与企业模型相同

  • 调用
    SSL\u CTX\u use\u certificate\u file
    加载客户端证书
  • 根据需要调用
    SSL\u CTX\u use\u certificate\u chain\u file
  • 调用
    SSL\u CTX\u使用\u PrivateKey
    加载私钥
缺少企业CA意味着客户端的自签名证书需要在带外与服务器通信。然后,服务器需要保留某种目录,以便根据可分辨名称和序列号查找客户端证书。这里您真正关心的是客户机的公钥。在本例中,X509证书是一个演示细节。它只是打包,因为它通常通过权威机构的签名将身份绑定到公钥(但在这个模型中不是这样)

这个模型中的攻击——房间里500磅重的大猩猩——是一个坏人通过使用相同的可分辨名称和序列号来模拟用户,因为没有注册授权人
curl --insecure --cert /tmp/client.crt --key /tmp/client.key https://localhost:8000