2013-04-22 11 views
5

Używam obecnie gniazda TCP do wymiany danych między serwerem a klientem przy użyciu strumieni gniazd w PHP. Chcę, aby każdy klient miał unikalny certyfikat (który będę dla niego generował), aby uzyskać dostęp do mojego serwera, tak aby tylko osoby, które znam, będą mogły z niego korzystać. Szukałem i znalazłem tylko jak używać certyfikatu po stronie serwera, co umożliwi mi nawiązanie połączenia SSL, ale to, czego potrzebuję, to użycie certyfikatu serwera klienta do identyfikacji klienta, który łączy się z moim serwerem. Czy to jest możliwe za pomocą PHP?PHP - certyfikat klienta gniazda SSL

bym sobie wyobrazić klienta, aby połączyć tak:

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

Ale jak uchwyt serwer (identyfikacja, etc) ten certyfikat stronie klienta?

Mam nadzieję, że moje pytanie było jasne.

Dzięki z góry, Rafael

Odpowiedz

1

Należy użyć stream_context_set_option ustawić verify_peer do true; będzie to wymagać od drugiej strony do sprawdzenia, czy certyfikat klienta jest zaufany. Weryfikacja polega na sprawdzeniu, czy certyfikat jest podpisany przez zaufany urząd, dlatego musisz określić, gdzie klucz publiczny urzędu można znaleźć za pomocą opcji cafile lub .

Należy pamiętać, że powyższe stwierdzenie jest prawdziwe zarówno po stronie serwera (aby umożliwić uwierzytelnianie klientów) i po stronie klienta - serwer również nie jest uwierzytelniany, chyba że zostanie to jawnie wykonane.

+0

Okay, więc na kliencie muszę ustawić verify_peer na true i cafile na ścieżkę klawisza _serwera_? Czy powinienem również utworzyć stream_context na serwerze? Jeśli tak, jakie opcje należy ustawić? Przy okazji, dziękuję za szybką odpowiedź! – user2308602

+0

@ user2308602: Musisz utworzyć kontekst strumienia na serwerze, jeśli chcesz faktycznie uwierzytelnić klienta. Te same opcje, co po stronie klienta, wszystko jest symetryczne. – Jon

+0

Pewnie czegoś brakuje na moim kodzie serwera. Obecnie każdy, kto inicjuje do niego gniazdo, może się z powodzeniem łączyć, nawet bez certyfikatu. Po stronie serwera tworzę kontekst z opcjami: local_cert = myCert.pem; verify-peer = true; allow_self_signed = false; cafile = myKey.pem; Potem utworzyć gniazda: '$ server = stream_socket_server ('SSL: //0.0.0.0: 500', $ errno, $ errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $ streamContext);' i słuchać połączeń: ' while (true) { $ client = stream_socket_accept ($ serwer); echo "klient podłączony"; } ' Wszelkie pomysły? – user2308602