2013-04-22 158 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