2013-04-22 15 views
5

ich zur Zeit einer TCP-Socket bin mit Daten zwischen einem Server auszutauschen und einem Client mit Socket-Streams in PHP. Ich möchte, dass jeder Client ein eindeutiges Zertifikat (das ich für sie erzeugen werde) hat, um auf meinen Server zuzugreifen, so dass nur Leute, die ich kenne, in der Lage sein werden, es zu benutzen. Ich habe nur gesucht und gefunden, wie man das Zertifikat auf der Serverseite verwendet, was es mir ermöglicht, eine SSL-Socket-Verbindung herzustellen, aber was ich tatsächlich brauche, ist ein Client-Server-Zertifikat, um den Client zu identifizieren, der eine Verbindung zu meinem Server herstellt. Ist das mit PHP möglich?PHP - SSL Socket-Client-Zertifikat

würde ich den Client vorstellen, wie diese zu verbinden:

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

Aber wie funktioniert der Server Griff (identifizieren, etc.), um dieses Client-Seite Zertifikat?

Hoffnung war ich mit meiner Frage klar.

Vielen Dank im Voraus, Rafael

Antwort

1

Sie stream_context_set_optionverify_peer zu true einzustellen verwenden sollten; Dies erfordert, dass die andere Seite überprüft, ob das Zertifikat des Clients vertrauenswürdig ist. Die Überprüfung erfolgt durch Überprüfung durchgeführt, dass das Zertifikat von einer vertrauenswürdigen Stelle signiert ist, so müssen Sie, wo das öffentliche Schlüssel des Behörde angeben kann entweder durch die cafile oder capath Option zu finden.

Beachten Sie, dass die oben gilt sowohl auf der Serverseite (damit Sie Ihre Kunden authentifizieren) und auf der Client-Seite - der Server auch authentifiziert wird, nicht, wenn Sie es ausdrücklich so machen.

+0

Okay, also auf dem Client muss ich verify_peer auf true und kafile auf den Pfad des Schlüssels der _server_ setzen? Soll ich auch einen stream_context auf dem Server erstellen? Wenn ja, welche Optionen sollte ich einstellen? Übrigens, danke für die schnelle Antwort! – user2308602

+0

@ user2308602: Sie müssen einen Stream-Kontext auf dem Server erstellen, wenn Sie den Client tatsächlich authentifizieren möchten. Gleiche Optionen wie auf der Clientseite, alles ist symmetrisch. – Jon

+0

Es muss etwas auf meinem Server-Code fehlen. Derzeit kann jeder, der einen Socket initiiert, erfolgreich eine Verbindung herstellen, auch ohne ein Zertifikat. Auf der Serverseite erstelle ich den Kontext mit den Optionen: local_cert = myCert.pem; verify-peer = wahr; allow_self_signed = false; kafile = myKey.pem; Dann erstelle ich die Fassung: '$ server = stream_socket_server ('ssl: //0.0.0.0: 500', $ errno, $ errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $ streamContext);' Und hören Verbindungen: ' while (wahr) { $ client = stream_socket_accept ($ server); Echo 'Client verbunden'; } ' Irgendwelche Ideen? – user2308602

Verwandte Themen