繁体   English   中英

如何在PHP中将受信任的证书颁发机构列表设置为socket客户端?

[英]How to set trusted certificate authorities list to socket client in PHP?

在IHE Con​​nectathon的上下文中,我想创建一个响应ATNA配置文件的原始套接字服务器,它需要具有两端证书的TLS套接字。

如果在此消息中总结我的问题: https//groups.google.com/d/msg/eu_connectathon/O-VGI_3cltw/ARsElA65ZkkJ

编辑 :对不起,Google网上论坛不公开,以下是留言:

嗨弗洛里安,

错误消息“服务器要求提供证书,但发布者列表不包含有效的证书颁发机构”究竟是什么? 是指并且在过去几年中TLS工具客户端的实施发生了变化,还是我使用了错误的证书?

该消息表示服务器已将CertificateRequest消息发送到clienmt,而certificate_authorities字段中没有值。

我去年遇到了这个问题,并与TLS工具的开发人员讨论过这个问题。 他声称,如果服务器不包含此字段,客户端将无法确定要返回哪种类型的证书,假设您将连接顶部多个关联域,每个域都有自己的CA.

您似乎可以通过调用SSL_CTX_set_client_CA_list来指示OpenSSL返回此值,例如在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客户端告诉我“服务器要求提供证书,但发布者列表不包含有效的证书颁发机构。”

客户端和服务器之间的消息传递,但测试不正常,因为“不够安全”,告诉消息。

你看到了一个问题吗?PHP有没有我没看到的更多选项?

谢谢你的帮助。

编辑 :正如@rdlowrey建议我,我刚刚创建了一个错误报告: https ://bugs.php.net/bug.php?id = 69215

正如我在最初的评论中所提到的:

PHP的流服务器实现从未实际使用SSL_CTX_set_client_CA_list()来加密流。

这已在相关错误报告中引用的上游更正:

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.pemmy-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
]]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM