Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-SSL套接字客户端证书_Php_Sockets_Ssl_Certificate_Client Side - Fatal编程技术网

PHP-SSL套接字客户端证书

PHP-SSL套接字客户端证书,php,sockets,ssl,certificate,client-side,Php,Sockets,Ssl,Certificate,Client Side,我目前正在使用tcp套接字在服务器和客户端之间使用PHP中的套接字流交换数据。我希望每个客户机都有一个唯一的证书(我将为他们生成)来访问我的服务器,这样只有我认识的人才能使用它。 我只搜索并找到了如何在服务器端使用证书,这将使我能够进行SSL套接字连接,但我实际需要的是使用客户机-服务器证书来标识连接到我的服务器的客户机。这是否可以使用PHP实现 我想象客户机是这样连接的: $clientCert = './clientCert.pem'; $streamContext = stream_con

我目前正在使用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);
但是服务器如何处理(识别等)这个客户端证书呢

希望我的问题是清楚的

提前感谢,,
Rafael

您应该使用
流式上下文设置选项
设置为
;这将需要另一方验证客户端的证书是否可信。验证是通过检查证书是否由受信任的机构签名来完成的,因此您需要通过
cafile
capath
选项指定在何处可以找到该机构的公钥


请注意,上述内容在服务器端(允许您对客户端进行身份验证)和客户端都适用——除非您明确地这样做,否则服务器也不会进行身份验证。

好的,那么在客户端上,我需要将verify_peer设置为true,并将cafile设置为服务器密钥的路径?我是否也应该在服务器上创建一个stream_上下文?如果是,我应该设置哪些选项?顺便说一句,谢谢你的快速回复@user2308602:如果要实际验证客户端,必须在服务器上创建流上下文。与客户端的选项相同,所有内容都是对称的。我的服务器代码中一定缺少某些内容。目前,任何向其启动套接字的人都可以成功连接,即使没有证书。在服务器端,我使用以下选项创建上下文:local_cert=myCert.pem;验证peer=true;允许自签名=假;cafile=myKey.pem;然后我创建套接字:
$server=stream\u socket\u server('ssl://0.0.0.0:500“,$errno,$errstr,STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,$streamContext)并收听连接:
while(true){$client=stream\u socket\u accept($server);echo'client connected'}
有什么想法吗?