2017-07-13 24 views
6

Serwer Mysql działa php5.3. Nowy serwer internetowy działa w wersji php7.1 (migracja z php5.3). Kiedy próbuję połączyć się z serwerem Mysql za pomocą ssl, to nie działa.Mysql PHP połączenie z SSL nie działa PDO

try { 
$dbh = new PDO($dsn, $user, $password, array(PDO::MYSQL_ATTR_SSL_KEY => '/etc/mysql/client-key.pem', 
              PDO::MYSQL_ATTR_SSL_CERT => '/etc/mysql/client-cert.pem', 
              PDO::MYSQL_ATTR_SSL_CA => '/etc/mysql/ca-cert.pem') 
      ); 
    echo "Connestion established"; 
} catch (PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage(); 
} 

Connection failed: SQLSTATE[HY000] [2002]

PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed

ale gdy usunę bloku z połączenia SSL, grzywny pracy. Nie wiem, co się dzieje. Może być niezgodność wersji serwera i klienta. Becasue Używam starego klucza publicznego i klucza prywatnego.

Czy to z powodu niezgodności mysql klienta i wersji serwera?

PS: Zaktualizowałem php7 tylko na serwerze internetowym.

+0

wszystko od raportowania błędów php? i czy certyfikaty są nadal ważne, gdy protokół SSL jest zainstalowany i włączony w konfiguracji? –

+0

@ Fred-ii- Nic w 'php' error, ponieważ używam try-catch. Nigdy nie zmieniłem certyfikatów. Wystarczy skopiować i wkleić ze starego serwera WWW na nowy. –

+0

@ Fred-ii-: stary serwer sieciowy uruchomił apache2 i nowy nginx. Gdzie włączyć mysql-ssl w nginx? –

Odpowiedz

1

Mówisz, że "skopiowałeś klucze SSL z jednego serwera na drugi". Więc jest nowy serwer? Nowy serwer ma nową tożsamość, więc serwer zdalny odrzuci certyfikaty, ponieważ identyfikator nie jest zgodny.

Myślę, że powinieneś najpierw usunąć linię na serwerze zdalnym z pliku "known_hosts". Następnie na serwerze Nginx powinieneś ręcznie połączyć się ze zdalnym serwerem za pomocą tych kluczy SSH i nawiązać połączenie jednorazowo, aby dodać nową tożsamość do znanych hostów.

Później myślę, że to powinno zadziałać.

Nawet jeśli powyższe nie działa, myślę, że najlepiej jest rozwiązać ten problem, łącząc się ze zdalnym hostem ręcznie. Gdy to działa, możesz spróbować skonfigurować połączenie mysql.

+0

keypairs generuje z serwera 'MySQL'. Zmieniam po stronie klienta część. Po drugie, jeśli tworzę nowy klient-serwer z php5.3 wszystko działa jak poprzednio. Może to być problem z wersją php lub konfiguracja apache2 lub nginx. Co o tym myślisz? –

+0

Hmm nie, bummer. Przepraszam. – vrijdenker

3

Po wyszukiwaniu i czytaniu uważam, że problem wynika z faktu, że obsługa SSL została zatwierdzona od wersji PHP 5.6, a weryfikacja peer jest teraz domyślnie włączona.

Chociaż poniższy nie chodzi o mysql, ale o fsock, myślę, że to po odpowiedzi na swoje pytanie: https://stackoverflow.com/a/32366242/2459026

Można też wyłączyć weryfikacji wzajemnej (co nie wydaje się być dobrym pomysłem) lub naprawić swój korzeń certyfikaty. Wydaje mi się, że warto byłoby przetestować wyłączenie weryfikacji partnerskiej, aby upewnić się, że to rzeczywiście jest twój problem.

(Należy pamiętać, że dodałem drugą odpowiedź obok mojej poprzedniej odpowiedzi. To nie była odpowiedź na pytanie, ale nadal mogą być lub nie być odpowiednie inne)

+0

Dodano ten blok przed połączeniem z serwerem DB. 'Stream_context_set_default ([ 'ssl' => [ \t 'verify_peer_name' => false, 'verify_peer' => false ] ]);' Wciąż otrzymuję ten sam błąd. Czy czegoś brakuje? –

+0

Ten, który mi wysłałeś, jest rozwiązaniem tego błędu: 'SSL3_GET_SERVER_CERTIFICATE: certyfikat nie powiódł się' ale w moim przypadku błąd to' tls_process_server_certificate: certyfikat nie powiódł się ' –

+0

Ugh. Naprawdę robię, co w mojej mocy, ale nie tak dużo jak na razie ... – vrijdenker

0

Trzeba wygenerować nowy certyfikat SSL i przetestuj punkt końcowy na serwerze, aby upewnić się, że działa on poprawnie. Po tym nie powinieneś mieć problemu. Polecam używanie Let's Encrypt: jest bezpłatny, otwarty i wysoce wspierany. Upewnij się, że postępujesz zgodnie z instrukcjami: here posłowie.

0

Można wygenerować nowy certyfikat SSL i upewnij się, że używasz prawo „Common Name”:

CA: hostname 
Server: FQDN, e.g. hostname.example.com 
Client: somename 

Ważną częścią jest certyfikat serwera, gdzie Nazwa zwyczajowa musi być taka sama, jak gospodarz ty łączą się, na przykład hostname.example.com.

+0

Co się stanie, jeśli dwóch klientów łączy się z tym samym serwerem. Jaka powinna być nazwa zwyczajowa serwera i 2 klientów? –

+0

Po wygenerowaniu certyfikatu zostaniesz zapytany o kilka argumentów, np. Stan (S), miejscowość (L), nazwa zwyczajowa (CN). Więc CN powinien być dokładnie tym samym adresem, łącząc się z klientami. Jeśli twój MySQL działa na 'db.myhost.com', powinieneś użyć' db.myhost.com' jako CN i połączyć się z 'db.myhost.com' z klientów http://info.ssl.com/article .aspx? id = 10048 –

Powiązane problemy