2013-01-07 13 views
8

Testuję API korzystające z funkcji php i certyfikatu CA, ale coś jest nie tak i jestem trochę zagubiony.Certyfikat równorzędny SSL lub klucz zdalny SSH nie był prawidłowy

Skonfigurowałem SSL na moim apache VirtualHost i wygląda dobrze (otwiera https:://[myVHost] ... działa).

jednak API curl wezwanie oddaj mi tę wiadomość:

  • SSL peer certificate or SSH remote key was not OK

nie jestem bardzo doświadczony z SSL, więc mam kilka pomysłów co do przyczyny tego.

UPDATE:

Jest to kod używam w moim cURL życzenie, mam skomentował 2 linie i zmienia ich wartość (spójrz na linii „todo”), w ten sposób to działa, jednak jest to tylko praca arround ...

$opts[CURLOPT_URL] = $url; 
    $opts[CURLOPT_RETURNTRANSFER] = true; 
    $opts[CURLOPT_CONNECTTIMEOUT] = 50; 
    $opts[CURLOPT_TIMEOUT] = 100; 
    $headers = array(
     'Accept: application/json', 
     "User-Agent: APIXXX-PHP-Client"); 
    $opts[CURLOPT_HTTPHEADER] = $headers; 
    $opts[CURLOPT_USERPWD] = $env->getApiKey() . ':'; 
    if (certificatePresent()) { 

     // $opts[CURLOPT_SSL_VERIFYPEER] = true; 
     // $opts[CURLOPT_SSL_VERIFYHOST] = 2; 

     // TODO: SET IT BACK 
     $opts[CURLOPT_SSL_VERIFYPEER] = 0; 
     $opts[CURLOPT_SSL_VERIFYHOST] = 0; 

     $opts[CURLOPT_CAINFO] = $path 

     } 

    curl_setopt_array($curl, $opts); 

    $response = curl_exec($curl); 
+0

Potrzebujemy pełnego i kompletnego kodu, którego używasz do złożenia zamówienia, w tym * wszystkich * ustawionych opcji zwijania. Czy jest to również samopodpisany certyfikat? – Charles

+0

Informacje dodane :) o pytaniu 'samopodpisanym certyfikacie' Nie wiem: certyfikat jest dostarczany z interfejsem API ... – WonderLand

+5

Pomyślnie zidentyfikowano przyczynę główną:' CURLOPT_SSL_VERIFYHOST' ma wartość 2. Po ustawieniu na 2 curl sprawdzi, czy certyfikat jest ważny i czy został wydany przez urząd certyfikacji, któremu ufa. Jeśli certyfikat zdalny jest samopodpisany lub w inny sposób nie został wydany przez urząd certyfikacji, któremu ufa, będzie on jęczeć i podać błąd podobny do tego, który otrzymałeś. Jeśli masz certyfikat od strony trzeciej, musisz przekonać curl, aby zaufać urzędowi certyfikacji, który go podpisał. Mówisz, że dostałeś certyfikat CA, prawda? Co z tym zrobiłeś? – Charles

Odpowiedz

4

prawdopodobnie używasz samopodpisany certifiacate SSL, który nie przejdzie, gdy opcje CURLOPT_SSL_VERIFYPEER jest ustawiony.

Istnieją dwa rozwiązania:

  1. Kup ważny certyfikat SSL.
  2. Wyłącz weryfikację SSL w Curl. (add --insecure option)

Jeśli wyłączysz weryfikację, nie możesz być pewien, czy naprawdę komunikujesz się z hostem. Wszystko zależy od poziomu bezpieczeństwa, którego potrzebujesz.

0

Masz rację, chcąc włączyć SSL_VERIFYPEER, jeśli obawiasz się ataków typu "man-in-the-middle".

Czy Twój zestaw $path wskazuje na certyfikat (lub pakiet certyfikatów) dostarczony przez właściciela API? Czy ten certyfikat może być odczytany przez użytkownika serwera WWW? Jeśli tak, czy zweryfikowaliście, że certyfikat (y) jest taki sam, jak przy ręcznym odwiedzaniu adresu https w przeglądarce i sprawdzaniu certyfikatu?

Jeśli nie możesz go uruchomić, a interfejs API, z którym się łączysz, ma certyfikat SSL działający w normalnej przeglądarce bez ostrzeżeń, powinieneś móc ustawić $path na pakiecie root CA na serwerze.

0

Można zbudować prawidłowy certyfikat SSL i upewnić się, że jest on przechowywany w zaufanym folderze.

Prawidłowy certyfikat SSL można utworzyć, włączając następujące polecenie w wierszu polecenia programisty: VS2012. (Można to uzyskać, pisząc programista na początku)

Poniższe polecenie tworzy samopodpisany certyfikat, który można wykorzystać do przetestowania aplikacji internetowej korzystającej z protokołu Secure Sockets Layer (SSL) na serwerze WWW, którego adres URL to www.example.com . OID zdefiniowany przez opcję -eku identyfikuje ten certyfikat jako SSL server certificate. Certyfikat jest przechowywany w moim sklepie i jest dostępny na poziomie komputera (a nie użytkownika).Klucz prywatny certyfikatu można wyeksportować, a certyfikat jest ważny od May 10, 2010 through December 22, 2011.

Makecert -r -pe -n CN = "www.example.com" -b 05/10/2010 -e 12/22/2011 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localmachine -ský wymiana -sp „Microsoft RSA SChannel Cryptographic Provider” -Sy 12

więcej informacji na temat sposobu tworzenia SSL certificate

teraz upewnij się, że ten certyfikat jest zaufany, można to zrobić wpisując w CERTMGR cmd ..

teraz utworzony certyfikat znajduje się w folderze PERSONAL .. skopiuj go i wklej do ZAUFANEJ FOLDERU LUDZI.

To powinno wystarczyć. Daj mi znać, jeśli to nie zadziała.

2

chociaż jestem odpowiadając stary post, myślę, że to pomoże nowy viewers-

Można sprawdzić ten problem dodając

$opts[CURLOPT_VERBOSE] = 1 

W przypadku certyfikatu z podpisem własnym klient może połączyć się z serwerem przy użyciu adresu IP, ponieważ nazwa hosta nie jest dostępna w pamięci podręcznej DNS. W takim przypadku COMMON NAME (CN) twojego certyfikatu serwera musi być zgodny z adresem IP serwera (wpisz adres IP jako nazwę zwykłą podczas generowania certyfikatu serwera). Gdy zrobisz to poprawnie, można zobaczyć tę wiadomość:

nazwa zwyczajowa: 192.168.0.1 (dopasowane)

Tutaj 192.168.0.1 jest tego przykładem.

0

Obok CURLOPT_SSL_VERIFYPEER istnieją dwa inne ustawienia, które mogą być zmienione na false/0:

CURLOPT_SSL_VERIFYHOST 
CURLOPT_SSL_VERIFYSTATUS 

Pamiętaj, że należy naprawić swoje certyfikaty SSL & ustawienia zamiast bezpieczeństwa wyłączyć!

Powiązane problemy