Oto prosty skrypt PHP, który otwiera gniazdo SSL gotowy do wysyłania żądań http:PHP i CA Weryfikacja SSL - OS Niezależne
$contextOptions = array(); $socketUrl = 'ssl://google.com:443'; $streamContext = stream_context_create($contextOptions); $socket = stream_socket_client($socketUrl, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $streamContext); if (!$socket || $errno !== 0) { var_dump($socket, $errstr); exit; } var_dump($socket); exit('Socket created.');
To działa - Właśnie testowałem go - ale nie ma walidacji przeciwko zaufanemu sklepowi CA.
Możemy zmodyfikować ten skrypt do używania PHP SSL Context options:
$contextOptions = array( 'ssl' => array( 'cafile' => 'C:\xampp\cacerts.pem', 'CN_match' => '*.google.com', // CN_match will only be checked if 'verify_peer' is set to TRUE. See https://bugs.php.net/bug.php?id=47030. 'verify_peer' => TRUE, ) ); $socketUrl = 'ssl://google.com:443'; $streamContext = stream_context_create($contextOptions); $socket = stream_socket_client($socketUrl, $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $streamContext); if (!$socket || $errno !== 0) { var_dump($socket, $errstr); exit; } var_dump($socket); exit('Socket created.');
Dopóki 'cafile' istnieje i ma poprawne CA to ten przykład działa również ...
... ale jak możemy to zrobić bez twardego kodowania nazwy pliku/ścieżki do pliku CA? Próbujemy stworzyć coś, co weryfikuje certyfikaty SSL OS niezależnie, bez konieczności oddzielnej konfiguracji dla każdego serwera, na którym działa ten skrypt.
Wiem, że Linux ma katalog dla urzędów certyfikacji, który możemy umieścić jako "capath". A co z Windows? Gdzie przechowują swoje zaufane ośrodki CA? Szukałem i te niestety wydawały się być w rejestrze, więc czy nie ma możliwości, abyśmy mogli uzyskać do nich dostęp z PHP? A co z innymi systemami operacyjnymi?
rdlowrey ma absolutną rację. Możesz jednak pobrać liść z Guzzle i spakować swój własny plik CA w swoim kodzie: https://github.com/guzzle/guzzle/blob/master/src/Guzzle/Http/Resources/cacert.pem – Tom
Powinienem dodaj, że przy stosowaniu podejścia zwiniętego nakłada się na ciebie obowiązek upewnienia się, że twoje certyfikaty CA są aktualne. Zwykle zmieniają się one kilka razy w roku, a jeśli nie są aktualizowane, istnieje możliwość zweryfikowania równorzędnych użytkowników za pomocą zaatakowanego urzędu certyfikacji. Zdolność 5.6 do używania certyfikatów zarządzanych przez system operacyjny jest dużym krokiem naprzód, ponieważ nie musisz nic o tym wiedzieć. Jednak to również jest tak dobre, jak twoja skłonność do instalowania najnowszych aktualizacji systemu operacyjnego, więc twoje certyfikaty nie są nieaktualne. Niestety, jest to funkcja, która w najbliższym czasie nie pojawi się w libcurl. – rdlowrey
Najlepszym rozwiązaniem z dużym marginesem, jeśli potrzebujesz maksymalnego bezpieczeństwa (dla paranoików i świadomych NSA) jest użycie znanego skrótu linii papilarnych do weryfikacji certyfikatu peera. Jest to funkcjonalność, która będzie dostępna dla zaszyfrowanych strumieni również w PHP 5.6. To powiedziawszy, jest * dużo * pracy do zrobienia w odniesieniu do dokumentacji dla tych rzeczy, więc możemy uzyskać informację w ciągu najbliższych kilku miesięcy przed wydaniem. Tak: jesteśmy tego świadomi i tak, będziemy ciężko pracować, aby podręcznik był przydatnym zasobem, jeśli chcesz chronić swoje transfery :) – rdlowrey