2013-04-22 160 views
5

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

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

$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); 

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

希望我对我的问题很清楚。

由于提前, 拉斐尔

回答

1

您应该使用​​设置verify_peertrue;这将要求另一方验证客户的证书是否可信。验证是通过检查证书是否由可信机构签署完成的,因此您需要指定通过cafilecapath选项可以找到授权机构的公钥。

请注意,上述方法同样适用于客户端的服务器端(允许您验证客户端) - 服务器也未通过身份验证,除非您明确如此。

+0

好的,所以在客户端,我需要将verify_peer设置为true,并将cafile设置为_server_键的路径?我应该在服务器上创建一个stream_context吗?如果是,我应该设置什么选项?顺便说一句,感谢您的快速回复! – user2308602 2013-04-22 19:59:00

+0

@ user2308602:如果您想实际验证客户端,则必须在服务器上创建流上下文。与客户端相同的选项,一切都是对称的。 – Jon 2013-04-23 07:42:33

+0

我的服务器代码中必须有缺失的东西。目前,任何启动套接字的人都可以成功连接,即使没有证书。 在服务器端,我使用以下选项创建上下文: local_cert = myCert.pem; verify-peer = true; allow_self_signed = false; cafile = myKey.pem; 然后,我创建套接字: '$服务器= 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'; }' 任何想法? – user2308602 2013-04-25 14:46:43