2016-11-18 4 views
3

Ich habe ein seltsames Problem mit der Einrichtung von SSL-Verbindung mit PHP. Ich habe Web-und Datenbankserver. Bei beiden habe ich Zertifikate über openssl generiert. Sie sind genau gleich.MYSQLi und SSL-Verbindung zu Db-Server

mysql -h 10.1.1.1 -uroot -p 
Password 
Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 71 
Server version: 5.5.5-10.1.19-MariaDB MariaDB Server 

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. 

Oracle is a registered trademark of Oracle Corporation and/or its 
affiliates. Other names may be trademarks of their respective 
owners. 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

mysql> 

So, jetzt will ich sehen, ob es wirklich ssl ist:

mysql> status; 
-------------- 
mysql Ver 14.14 Distrib 5.6.33, for Linux (x86_64) using EditLine wrapper 

Connection id:   71 
Current database: 
Current user:   [email protected] 
SSL:     Cipher in use is DHE-RSA-AES256-SHA 
Current pager:   stdout 
Using outfile:   '' 
Using delimiter:  ; 
Server version:   5.5.5-10.1.19-MariaDB MariaDB Server 
Protocol version:  10 
Connection:    10.1.1.1 via TCP/IP 
Server characterset: latin1 
Db  characterset: latin1 
Client characterset: utf8 
Conn. characterset: utf8 
TCP port:    3306 
Uptime:     1 hour 6 min 51 sec 

Threads: 1 Questions: 153 Slow queries: 0 Opens: 21 Flush tables: 1 Open tables: 15 Queries per second avg: 0.038 
-------------- 

mysql> 

So sehe ich, dass die Verbindung hergestellt ist

So vom Webserver mit MySQL Befehl zu verbinden Ich versuche, . Ich schrieb einige PHP-Skript zu meiner Datenbank verbinden:

<?php 
ini_set ('error_reporting', E_ALL); 
ini_set ('display_errors', '1'); 
error_reporting (E_ALL|E_STRICT); 

$db = mysqli_init(); 
mysqli_options ($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true); 

$db->ssl_set('/etc/mysql/newcerts/client-key-rsa.pem', '/etc/mysql/newcerts/client-cert.pem', '/etc/mysql/newcerts/ca-cert.pem', NULL, NULL); 
$link = mysqli_real_connect ($db, '10.1.1.1', 'root', 'xxxxxx', 'mysql', 3306, NULL, MYSQLI_CLIENT_SSL); 
if (!$link) 
{ 
    die ('Connect error (' . mysqli_connect_errno() . '): ' . mysqli_connect_error() . "\n"); 
} else { 
    $res = $db->query('SHOW TABLES;'); 
    print_r ($res); 
    $db->close(); 
} 
?> 

Aber jetzt, wenn ich renne dieses Skript auf meinem Webserver Ich erhalte diese Fehlermeldung:

[[email protected] config]# php test.php 

Warning: mysqli_real_connect(): Unable to locate peer certificate CN in /home/extranet/app/config/test.php on line 10 

Warning: mysqli_real_connect(): Cannot connect to MySQL by using SSL in /home/extranet/app/config/test.php on line 10 

Warning: mysqli_real_connect(): [2002] (trying to connect via tcp://10.1.1.1:3306) in /home/extranet/app/config/test.php on line 10 

Warning: mysqli_real_connect(): (HY000/2002): in /home/extranet/app/config/test.php on line 10 
Connect error (2002): 

Das ist so seltsam. Ich habe mysql_connet() ausprobiert und es funktioniert ...

Irgendwelche Ideen ??

Ich bin mit PHP 5.6.25

EDIT: Natürlich habe ich auch hinzugefügt Zeilen zu meinem Webserver .my.cnf Datei:

[client] 
port=3306 
ssl-ca=/etc/mysql/newcerts/ca-cert.pem 
ssl-cert=/etc/mysql/newcerts/client-cert.pem 
ssl-key=/etc/mysql/newcerts/client-key-rsa.pem 

Diese vom web server fein wie gut funktioniert Befehlszeile:

mysql -h 10.1.1.1 -u root --password \ 
    --ssl \ 
    --ssl-ca /etc/mysql/newcerts/ca-cert.pem \ 
    --ssl-cert /etc/mysql/newcerts/client-cert.pem \ 
    --ssl-key /etc/mysql/newcerts/client-key-rsa.pem \ 

Cert Benutzer/Gruppen/Berechtigungen

[[email protected] newcerts]# ls -alZ 
drwxr-xr-x root root ?        . 
drwxr-xr-x root root ?        .. 
-rw-r--r-- root root ?        ca-cert.pem 
-rw-r--r-- root root ?        ca-key.pem 
-rw-r--r-- root root ?        client-cert.pem 
-rw-r--r-- root root ?        client-key.pem 
-rw-r--r-- root root ?        client-key-rsa.pem 
-rw-r--r-- root root ?        client-req.pem 
-rw-r--r-- root root ?        server-cert.pem 
-rw-r--r-- root root ?        server-key.pem 
-rw-r--r-- root root ?        server-req.pem 

SELinux deaktiviert ist:

# This file controls the state of SELinux on the system. 
# SELINUX= can take one of these three values: 
#  enforcing - SELinux security policy is enforced. 
#  permissive - SELinux prints warnings instead of enforcing. 
#  disabled - No SELinux policy is loaded. 
SELINUX=disabled 
# SELINUXTYPE= can take one of these two values: 
#  targeted - Targeted processes are protected, 
#  minimum - Modification of targeted policy. Only selected processes are protected. 
#  mls - Multi Level Security protection. 
SELINUXTYPE=targeted 
+0

Da der Fehler besagt, dass "Peer-Zertifikat CN" nicht gefunden werden kann, können Sie den allgemeinen Namen auf dem Cert chech? 'openssl x509 -in * cert.pem -text -noout' –

Antwort

0

Ich war auch gleichen Fehler auftreten ich unten Tweets tat und arbeitete für mich.

$link = mysqli_real_connect ($db, '10.1.1.1', 'root', 'xxxxxx', 'mysql', 3306, NULL, MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT); 
0

PHP 7.1 (. Die CN Servername andere IP-Adresse I IP-Adresse verbinden ...), dieser Code zu funktionieren scheint:

<?php 
ini_set ('error_reporting', E_ALL); 
ini_set ('display_errors', '1'); 
error_reporting (E_ALL|E_STRICT); 
$db = mysqli_init(); 
mysqli_options ($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true); 
$db->ssl_set('client-key.pem', 'client-cert.pem', 'ca-cert.pem', NULL, NULL); 
if (!mysqli_real_connect($db, 'serverip', 'user', 'userpass', 'databbasename', serverportonlynumbernoapostro, NULL, MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT)) 
{ 
die("Connect Error: " . mysqli_connect_error()); 
} 
?> 

In meinem Beispiel: Zert folder = PHP-Datei