Openssl Indy 10客户端证书:全部集成在一个.pem文件中?

Openssl Indy 10客户端证书:全部集成在一个.pem文件中?,openssl,c++builder,indy10,Openssl,C++builder,Indy10,tl;医生: TIdSSLIOHandlerSocketOpenSSL是否有办法使用一个.pem文件,其中包含客户端证书的证书、根和密钥 详细信息: 供应商合作伙伴要求我们使用mTLS身份验证。他们提供了一个证书,我以PEM格式导出了它(包括我的证书、根证书和私钥) 然后,我使用cURL在PHP中进行了一些简单的连接性测试 注意,我可以使用我的全包.pem文件。 $the_url = 'https://example.com/post-to-me'; $xml_payload = '<f

tl;医生:

TIdSSLIOHandlerSocketOpenSSL是否有办法使用一个.pem文件,其中包含客户端证书的证书、根和密钥


详细信息:

供应商合作伙伴要求我们使用mTLS身份验证。他们提供了一个证书,我以PEM格式导出了它(包括我的证书、根证书和私钥)

然后,我使用cURL在PHP中进行了一些简单的连接性测试

注意,我可以使用我的全包.pem文件。

$the_url = 'https://example.com/post-to-me';
$xml_payload = '<foo>bar</foo>';
$headers = array( "Content-type: text/xml",
                  "Content-length: ".strlen($xml_payload),
                  "Connection: close" );

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $the_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);            // Force curl_exec() to return server response string rather than true/false
curl_setopt($ch, CURLOPT_TIMEOUT, 10);                  // 10-second timeout
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSLCERT, 'all-in-one-cert.pem');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'super-secret-password');

$result     = curl_exec($ch);
这产生了同样的错误

我还尝试使用.pfx证书文件:

FSSLIOHandlerSocket->SSLOptions->CertFile       = "all-in-one-cert.pfx";
FSSLIOHandlerSocket->OnGetPassword              = GetPassWord;
这允许加载证书,但随后导致连接时握手失败:

连接SSL时出错。 错误:14094410:SSL例程:SSL3_读取字节:sslv3警报握手失败

我使用Wireshark验证发生此握手错误是因为0个证书被传递到握手中

我通过将客户端证书、根和密钥拆分为三个单独的文件来解决此问题,如下所示:

FSSLIOHandlerSocket->SSLOptions->CertFile       = "cert-only.pem";
FSSLIOHandlerSocket->SSLOptions->RootCertFile   = "root-only.pem";
FSSLIOHandlerSocket->SSLOptions->KeyFile        = "key-only.pem";

不过,我还是很好奇:有没有办法在一个.pem文件中使用所有三个组件?还是我遗漏了什么?我是mTLS业务的新手,请原谅我的无知

如果您使用的是OpenSSL 1.0.2,
CertFile
可以是包含整个证书链的单个文件。但是另外,
RootCertFile
KeyFile
必须是单独的文件。但是,
RootCertFile
可能包含多个CA证书。谢谢,@RemyLebeau!我感谢你的时间和专业知识。
FSSLIOHandlerSocket->SSLOptions->CertFile       = "all-in-one-cert.pfx";
FSSLIOHandlerSocket->OnGetPassword              = GetPassWord;
FSSLIOHandlerSocket->SSLOptions->CertFile       = "cert-only.pem";
FSSLIOHandlerSocket->SSLOptions->RootCertFile   = "root-only.pem";
FSSLIOHandlerSocket->SSLOptions->KeyFile        = "key-only.pem";