在IHE Connectathon的上下文中,我想创建一个响应ATNA配置文件的原始套接字服务器,它需要具有两端证书的TLS套接字.
我的问题如果总结在这条消息中:
https://groups.google.com/d/msg/eu_connectathon/O-VGI_3cltw/ARsElA65ZkkJ
编辑:对不起,Google网上论坛不公开,以下是留言:
Hi Florian,
What exactly does the error message “Server asked for a certificate,
but list of issuers doesn’t contain valid certificate authority.”
mean and did the implementation of the TLS Tools Client change during
the last years, or am I using the wrong certificates?
该消息表示服务器已发送CertificateRequest
发送给客户的消息,在certificate_authorities中没有值
领域.
去年我遇到了这个问题并与开发人员讨论过这个问题
TLS工具.他声称,如果服务器不包括这个
现场,客户端不会知道什么样的证书
返回,假设您将连接顶部多个的场景
亲和域,每个域都有自己的CA.
您似乎可以指示OpenSSL返回此值
调用SSL_CTX_set_client_CA_list,例如在
DcmTLSTransportLayer :: addTrustedCertificateFile.我没有测试过这个
还有TLS工具,但我希望在此之前完成
connectathon开始.但是我在PHP中的实现与它们的实现并不相同.
看起来PHP缺少“SSL CTX设置客户端CA列表”的可能性,告诉客户端它应该使用哪个证书颁发机构.$context = stream_context_create(); if ($certificate) { // Server certificate + private key stream_context_set_option($context, 'ssl', 'local_cert', "/path/to/server.pem"); stream_context_set_option($context, 'ssl', 'passphrase', $passphrase); // Client public certificates stream_context_set_option($context, 'ssl', 'cafile', "/path/to/ca.pem"); stream_context_set_option($context, 'ssl', 'allow_self_signed', false); stream_context_set_option($context, 'ssl', 'verify_peer', true); stream_context_set_option($context, 'ssl', 'peer_name', "TlsTools2"); stream_context_set_option($context, 'ssl', 'capture_peer_cert', true); stream_context_set_option($context, 'ssl', 'capture_peer_cert_chain', true); } $this->__socket = @stream_socket_server("tcp://$address:$port", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $context);
IHE Gazelle TLS客户端告诉我“服务器要求提供证书,但发布者列表不包含有效的证书颁发机构.”
客户端和服务器之间的消息传递,但测试不正常,因为“不够安全”,告诉消息.
谢谢你的帮助.
编辑:正如@rdlowrey建议我,我刚刚创建了一个错误报告:https://bugs.php.net/bug.php?id=69215
解决方法:
正如我在最初的评论中所提到的:
PHP’s stream server implementation has never actually used SSL_CTX_set_client_CA_list() for encrypted streams.
这已在相关错误报告中引用的上游更正:
https://bugs.php.net/bug.php?id=69215
一旦发布了PHP 5.6.8二进制文件(或者您可以在该版本之前针对当前源手动构建PHP),将反映此更改.
履行
使用更新的二进制文件,OP的示例代码将按预期工作而无需修改.在服务器中使用的加密上下文的简单示例:
<?PHP
$serverCtx = stream_context_create(['ssl' => [
'local_cert' => '/path/to/my-server-cert.pem',
'passphrase' => 'elePHPant',
'cafile' => '/path/to/my-ca-certs.pem',
'verify_peer' => true
]]);
在上面的示例中,当作为TLS握手的一部分发送客户端CA列表时,PHP会自动使用上面引用的my-ca-certs.pem文件中的证书名称.
笔记
通过“verify_peer”=>在加密服务器流中启用对等验证时true PHP不会自动启用对等名称验证.除非您只希望允许单个证书持有者(具有特定的已知名称)访问您的服务器,否则这正是您想要的.此默认行为支持更常见的用例,即允许其证书由可信CA签名的任何客户端建立与服务器的连接.但是,如果您希望在加密服务器中强制执行名称验证,请修改上面的上下文示例,如下所示:
<?PHP
$serverCtx = stream_context_create(['ssl' => [
'local_cert' => '/path/to/my-server-cert.pem',
'passphrase' => 'elePHPant',
'cafile' => '/path/to/my-ca-certs.pem',
'verify_peer' => true,
'verify_peer_name' => true, // verify the name on the cert
'peer_name' => 'zanzibar' // ensure the cert's name matches this
]]);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。