2013-04-22 11 views
5

Attualmente sto utilizzando un socket TCP per scambiare dati tra un server e un client utilizzando i socket stream in PHP. Voglio che ogni cliente abbia un certificato univoco (che genererò per loro) per accedere al mio server in modo che solo le persone che conosco possano usarlo. Ho cercato e trovato solo come utilizzare il certificato sul lato server, che mi consentirà di stabilire una connessione socket SSL, ma quello di cui ho effettivamente bisogno è usare un certificato server client per identificare il client che si connette al mio server. È possibile usare PHP?PHP - Certificato client socket SSL

mi immagino il client di connettersi in questo modo:

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

Ma come fa la maniglia del server (identifico, ecc) questo certificato lato client?

Spero di essere stato chiaro con la mia domanda.

Grazie in anticipo, Rafael

risposta

1

Si dovrebbe usare stream_context_set_option per impostare verify_peer a true; ciò richiederà l'altro lato per verificare che il certificato del cliente sia attendibile. La verifica viene eseguita controllando che il certificato sia firmato da un'autorità attendibile, quindi è necessario specificare dove è possibile trovare la chiave pubblica dell'autorità tramite l'opzione cafile o capath.

Si noti che quanto sopra è valido sia sul lato server (per consentire l'autenticazione dei client) e sul lato client - anche il server non è autenticato a meno che non lo si effettui esplicitamente.

+0

OK, così sul client ho bisogno di impostare verify_peer su true e cafile sul percorso della chiave il _server_? Devo creare uno stream_context anche sul server? Se sì, quali opzioni dovrei impostare? A proposito, grazie per la rapida risposta! – user2308602

+0

@ user2308602: è necessario creare un contesto di flusso sul server se si desidera autenticare realmente il client. Stesse opzioni del lato client, tutto è simmetrico. – Jon

+0

Ci deve essere qualcosa che manca sul mio codice server. Al momento, chi inizia un socket su di esso può connettersi con successo, anche senza un certificato. Sul lato server creo il contesto con le opzioni: local_cert = myCert.pem; verify-peer = true; allow_self_signed = false; cafile = myKey.pem; Poi ho creare il socket: 'server = stream_socket_server $ ('ssl: //0.0.0.0: 500', $ errno, $ errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $ streamContext);' E ascoltare le connessioni: ' while (true) { $ client = stream_socket_accept ($ server); echo 'client connesso'; } Qualche idea? – user2308602