【问题标题】:PHP - SSL socket client certificatePHP - SSL 套接字客户端证书
【发布时间】:2013-04-15 19:33:08
【问题描述】:

我目前正在使用 tcp 套接字在服务器和客户端之间使用 PHP 中的套接字流交换数据。我希望每个客户端都有一个唯一的证书(我将为他们生成)来访问我的服务器,这样只有我认识的人才能使用它。 我已经搜索并发现仅如何在服务器端使用证书,这将使我能够建立 SSL 套接字连接,但我真正需要的是使用客户端服务器证书来识别连接到我的服务器的客户端。这可以使用 PHP 吗?

我想客户端是这样连接的:

$clientCert = './clientCert.pem';
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $clientCert);
$server = stream_socket_client('ssl://IP', $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext);

但是服务器如何处理(识别等)这个客户端证书呢?

希望我的问题很清楚。

提前致谢, 拉斐尔

【问题讨论】:

    标签: php sockets ssl certificate client-side


    【解决方案1】:

    您应该使用stream_context_set_optionverify_peer 设置为true;这将要求对方验证客户端的证书是否可信。验证是通过检查证书是否由受信任的机构签署来完成的,因此您需要通过cafilecapath 选项指定可以在何处找到该机构的公钥。

    请注意,上述内容在服务器端(允许您验证您的客户端)在客户端都适用——除非您明确指定,否则服务器也不会经过身份验证。

    【讨论】:

    • 好的,所以在客户端我需要将 verify_peer 设置为 true 并将 cafile 设置为 server 的密钥路径?我也应该在服务器上创建一个 stream_context 吗?如果是,我应该设置哪些选项?顺便说一句,感谢您的快速回复!
    • @user2308602:如果你想真正验证客户端,你必须在服务器上创建一个流上下文。与客户端相同的选项,一切都是对称的。
    • 我的服务器代码上一定有什么东西丢失了。目前,任何启动套接字的人都可以成功连接,即使没有证书。在服务器端,我使用以下选项创建上下文:local_cert = myCert.pem;验证对等=​​真; allow_self_signed = false; cafile = myKey.pem;然后我创建套接字:$server = stream_socket_server('ssl://0.0.0.0:500', $errno, $errstr, STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $streamContext); 并监听连接:while(true) { $client = stream_socket_accept($server); echo 'client connected'; } 有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2012-03-27
    • 2013-08-04
    • 2012-08-25
    • 2010-10-16
    • 2017-04-28
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多