Openssl Indy 10客户端证书:全部集成在一个.pem文件中?
tl;医生: TIdSSLIOHandlerSocketOpenSSL是否有办法使用一个.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
详细信息: 供应商合作伙伴要求我们使用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";