C++ x509\存储\添加\证书和;ssl\u ctx\u使用\u证书?

C++ x509\存储\添加\证书和;ssl\u ctx\u使用\u证书?,c++,ssl,openssl,C++,Ssl,Openssl,我正在尝试将多个证书加载到SSL_CTX中 查看文档,我能够使用以下两种方式建立SSL连接: 创建X509_存储,向存储添加证书,然后使用SSL_CTX_set_cert_存储将证书存储加载到SSL_CTX中 多次调用SSL_CTX_use_certificate(CTX,cert) 这两者之间有区别吗?我在StackOverflow的某个地方看到SSL\u CTX\u use\u证书不适用于自签名证书?为什么?我在任何地方的文档中都没有看到这一点。(自我签名是什么意思?) *同样对于#2,调用

我正在尝试将多个证书加载到SSL_CTX中

查看文档,我能够使用以下两种方式建立SSL连接:

  • 创建X509_存储,向存储添加证书,然后使用SSL_CTX_set_cert_存储将证书存储加载到SSL_CTX中
  • 多次调用SSL_CTX_use_certificate(CTX,cert)

  • 这两者之间有区别吗?我在StackOverflow的某个地方看到SSL\u CTX\u use\u证书不适用于自签名证书?为什么?我在任何地方的文档中都没有看到这一点。(自我签名是什么意思?)


    *同样对于#2,调用SSL_CTX_多次使用_证书是否会替换现有证书?我是否需要调用SSL\u CTX\u add\u extra\u chain\u cert?

    证书验证过程中,
    X509\u存储
    用于构建证书信任链。因此,验证对等证书时,将使用
    X509\u STORE\u add\u cert
    添加的任何证书

    SSL\u CTX\u use\u certificate
    用于针对对等方设置用于身份验证的本地证书,即在服务器上设置服务器证书,在客户端设置客户端证书。它必须附带一个设置私钥的函数,如
    SSL\u CTX\u use\u PrivateKey
    SSL\u CTX\u use\u certificate
    可以多次调用,并将替换现有证书或添加另一个证书:即,使用较新版本的OpenSSL,可以同时拥有RSA和ECDSA证书

    SSL\u CTX\u use\u证书不适用于自签名证书


    使用
    SSL\u CTX\u use\u certificate
    时,OpenSSL不关心证书是否是自签名的。接收证书作为身份验证的通信对等方希望会关心,并且可能会抱怨,因为找不到本地信任锚来验证证书。

    证书验证期间,
    X509\u存储
    用于构建证书信任链。因此,验证对等证书时,将使用
    X509\u STORE\u add\u cert
    添加的任何证书

    SSL\u CTX\u use\u certificate
    用于针对对等方设置用于身份验证的本地证书,即在服务器上设置服务器证书,在客户端设置客户端证书。它必须附带一个设置私钥的函数,如
    SSL\u CTX\u use\u PrivateKey
    SSL\u CTX\u use\u certificate
    可以多次调用,并将替换现有证书或添加另一个证书:即,使用较新版本的OpenSSL,可以同时拥有RSA和ECDSA证书

    SSL\u CTX\u use\u证书不适用于自签名证书


    使用
    SSL\u CTX\u use\u certificate
    时,OpenSSL不关心证书是否是自签名的。接收证书作为身份验证的通信对等方希望会关心,并且可能会抱怨,因为没有找到本地信任锚来验证证书。

    “自签名意味着什么?”任何证书都已签名。签名由另一个证书计算(更准确地说是由附加到其他证书的私钥计算)。公共全局证书由已知CA(可能有中间证书)签名。本地证书由它自己签名,它充当它自己的CA,任何人都可以随时生成该证书。所以它是自签名的。“自签名是什么意思?”任何证书都会被签名。签名由另一个证书计算(更准确地说是由附加到其他证书的私钥计算)。公共全局证书由已知CA(可能有中间证书)签名。本地证书由它自己签名,它充当它自己的CA,任何人都可以随时生成该证书。所以它是自签名的。谢谢你的回复。关于本部分的问题“必须附带设置私钥的功能”。如果我只进行服务器身份验证(没有相互TLS),那么客户端的本地证书是否仍然需要私钥?我能够在没有SSL连接的情况下建立SSL连接。设置如下:[Client]加载CA证书,验证|[Server]加载由加载到客户端的CA证书颁发的私钥和公共证书,验证|无mode@Panda:如果不进行相互身份验证,则根本不需要在客户端中设置身份验证证书,也就是说,不仅不需要
    SSL\u CTX\u use\u PrivateKey
    ,而且也不需要
    SSL\u CTX\u use\u certificate
    。我不明白。即使不只是相互身份验证和服务器身份验证,客户端如何验证服务器传递的证书是否有效?客户端不需要加载某种证书吗?或者知道什么是CA证书来验证服务器的证书?(仅在服务器身份验证下)@Panda:peers证书根据
    X509\u存储中的CA证书进行验证。正如我所说的,
    SSL\u-CTX\u-use\u-certificate
    不是用来把证书放在那个存储中的,而是
    X509\u-store\u-add\u-cert
    是。@Panda:我想你关于区别的实际问题已经回答了。在您的评论中,您当前提出了一个新问题,该问题应为a)作为单独的问题提出,b)提供重现您的问题和理解您实际操作所需的实际代码。感谢您的回复。关于本部分的问题“必须附带设置私钥的功能”。如果我只进行服务器身份验证(没有相互TLS),那么客户端sid上的本地证书是否仍然需要私钥