2016-08-02 53 views
1

Wir haben einen Server mit MySQL auf Port 3306. Wir haben Sertifikationen und Schlüssel und wir versuchen es Stellen Sie eine Verbindung zu diesem Server her. Aber wir sehen ein solches Problem:php 5.x 7.x, ssl pdo Fehler: Peer-Zertifikat CN = `someName 'nicht erwartet CN =' someIP '

Peer certificate CN='SomeName' did not match expected CN='someIP'

ich viele Artikel gelesen haben und können nicht Antwort für PDO PHP finden. Das Interessanteste ist, dass der SQLYog mit allen Einstellungen verbunden werden kann.

Ich habe gelesen, dass ich verify_peer_names deaktiviert werden kann (ich hoffe, ich verstehe was peer_names ... ist), aber nur wenn wir openssl_ {functions} oder mysqli, nicht PDO verwenden. Beide Optionen sind für mich nicht geeignet. Ich brauche PDO.

Was ich zu tun versucht: zwischen den Versionen von PHP

  • Schalter. Es hat mir geholfen, aber ich brauche 5,6 oder mehr. Für PHP 7.0 der gleiche Fehler.
  • finden Sie eine andere Versionen von OpenSSL und PDO; schnell habe ich verstanden, dass es eine schlechte Idee ist :)
  • finde einige Einstellungen in php.ini, aber keine Einstellungen für mein Problem, nur für die Erstellung von ssl.

Mein Code für den Anschluss:

$dbInfo = array 
(
'dsn' => 'mysql:host=123.45.67.890;dbname=someDB;port=3306', 
'user' => 'user', 
'pass' => 'userpassword' 
); 

$con = new PDO 
    (
    $dbInfo['dsn'], $dbInfo['user'], $dbInfo['pass'], 
    array(
     PDO::MYSQL_ATTR_SSL_CIPHER => 'AES256-SHA', 
     PDO::MYSQL_ATTR_SSL_CA  => 'SSLCert/ca-cert.pem', 
     PDO::MYSQL_ATTR_SSL_KEY => 'SSLCert/client-key.pem', 
     PDO::MYSQL_ATTR_SSL_CERT => 'SSLCert/client-cert.pem', 
    ) 
    ); 

echo 'Connection OK!'; 
+1

Es ist ein bekanntes Problem, siehe: [PHP Fehler # 71003] (https://bugs.php.net/bug.php?id=71003) –

+2

Danke Mann! Aber ich verstehe immer noch nicht, was ich mit SSL-Verbindung zu tun habe. Ich lese, dass sie es in irgendeinem Patch reparieren, sie grasen openssl lib, aber zuerst bin ich nicht gut darin, in einer lib zu graben, zweitens - es ist keine gute Idee, lib selbst zu reparieren. Vielleicht bin ich carelles und habe die Antwort nicht gefunden ... Wenn du gearbeitet hast und dieses Problem für dich selbst gelöst hast - kannst du mir irgendwie aufzeigen, was zu tun ist? –

Antwort

1

Wir haben es für unsere internen selbstsignierte Zertifikate arbeiten von nicht IP-Adressen verwenden, aber Maschine (+ domain) Namen wie die CN und Verbindungseinstellungen.

Setzen Sie also als CN für das Serverzertifikat und verwenden Sie dieselbe Adresse als Host-Teil des DSN für die PDO-Verbindung. Wenn Sie möchten, können Sie einfach 'dbServer1' verwenden, aber stellen Sie sicher, dass Sie es an beiden Orten verwenden.

Dies wird erhalten Sie gehen:

$pdo_options = array(
    PDO::MYSQL_ATTR_SSL_KEY => 'path/to/client-key.pem', 
    PDO::MYSQL_ATTR_SSL_CERT => 'path/to/client-cert.pem', 
    PDO::MYSQL_ATTR_SSL_CA => 'path/to/ca.pem' 
); 

PDO::__construct('mysql:host=dbServer1.company.local;dbname=someDB','someUser', 'somePass', $pdo_options); 

Wir verwalten unsere eigenen DNS dbServer1.company.local so zu lösen ist kein Problem, aber wenn Ihr Webserver kann es Ihnen nicht auflösen oder Sie nicht/kann den DNS-Eintrag nicht verwalten hacken, dann in etwa wie folgt auf Ihre etc/hosts Datei:

10.5.5.20 dbServer1.company.local 

oder

10.5.5.20 dbServer1 
+0

Ich kann nicht sagen, dass du recht hast oder du falsch liegst, weil ich dieses Projekt ein halbes Jahr lang nicht halte. Aber ich denke du sagst richtige Dinge. –

+0

Ich schrieb diese Antwort für jeden anderen, der die Seite besucht. Ich nehme an, du wärst jetzt schon weitergezogen. – PadraigD

+0

Sicher weitergezogen! :) Ich schreibe nur, dass ich nicht überprüfen kann, was du geschrieben hast. –