IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Basculer en mode SSL ! [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 780
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 780
    Par défaut Basculer en mode SSL !
    Salut à tous.

    Je suis sous Mysql 8.0.32 et php 8.2.1. J'ai activé le mode SSL dans Mysql et j'ai l'erreur ci-après :
    Fatal error: Uncaught mysqli_sql_exception: Connections using insecure transport are prohibited while --require_secure_transport=ON. in F:\Site-01\Ex_01\PHP2\Object.php:41
    Stack trace:
    #0 F:\Site-01\Ex_01\PHP2\Object.php(41): mysqli->__construct('localhost', 'test', Object(SensitiveParameterValue), 'test')
    #1 {main}
    thrown in F:\Site-01\Ex_01\PHP2\Object.php on line 41
    Elle se produit sur cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $link = new mysqli('localhost', 'test', 'test', 'test');
    J'ai tenté d'introduire le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    if (!($db=mysqli_init()))
    {
    	die('MYSQLI_INIT failed');
    	exit();
    }
     
    if (!$db->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true))
    {
    	die('Setting MYSQLI_OPTIONS failed');
    	exit();
    }
     
    if (!($db->ssl_set(	'f:/Wamp/bin/apache/apache2.4.55/conf/certificat/Mysql/Client-key.pem',
    					'f:/Wamp/bin/apache/apache2.4.55/conf/certificat/Mysql/Client-cert.pem',
    					'f:/Wamp/bin/apache/apache2.4.55/conf/certificat/Mysql/Ca.pem',
    					'f:/Wamp/bin/apache/apache2.4.55/conf/certificat/Mysql',NULL)))
    {
    	die('MYSQLI_SSL_SET failed');
    	exit();
    }
     
    $link = $db->real_connect('localhost','test','test','test',3306,NULL,MYSQLI_CLIENT_SSL);
    et je me retrouve avec cette erreur :
    Setting MYSQLI_OPTIONS failed
    J'ai pourtant suivi les exemples trouvés sur le net, mais rien ne fonctionne.

    Il me semble avoir vu que "MYSQLI_OPT_SSL_VERIFY_SERVER_CERT" ne servait à rien.
    J'ai mis cette fonction en commentaire et maintenant j'ai cette nouvelle erreur :
    Fatal error: Uncaught mysqli_sql_exception: (trying to connect via (null)) in F:\Site-01\Ex_01\PHP2\Object.php:39
    Stack trace:
    #0 F:\Site-01\Ex_01\PHP2\Object.php(39): mysqli->real_connect('localhost', 'test', Object(SensitiveParameterValue), 'test', 3306, NULL, 2048)
    #1 {main}
    thrown in F:\Site-01\Ex_01\PHP2\Object.php on line 39
    Pouvez-vous me donner la solution pour passer en mode SSL ?

    Cordialement.
    Artemus24.
    @+

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 780
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 780
    Par défaut
    Salut à tous.

    Dans "my.ini", j'ai mis : "require-secure-transport = on" ce qui force mysql à être en mode "SSL".

    Mais pour obtenir une connexion, je dois désactiver le SSL. Avec Mysqli, je dois mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysqli_real_connect($link,'localhost','test','test','test',3306,NULL,MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT);
    et non ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysqli_real_connect($link,'localhost','test','test','test',3306,NULL,MYSQLI_CLIENT_SSL);
    Ce n'est pas du tout ce que je veux.

    Comment avez vous pu obtenir une connexion SSL pour ceux qui l'utilisent ?
    J'ai un problème de compréhension, plus que de faisabilité.
    Je pense que mon problème concerne les certificats que j'utilise dans MySql.
    Ce sont ceux par défaut de MySql.

    Est-il possible en l'état d'obtenir une connexion avec ce type de certificats ?
    Sinon, comment dois-je faire pour obtenir un bon certificat qui puisse être reconnu en apache ainsi qu'en mysql et me donner une connexion SSL ?

    Cordialement.
    Artemus24.
    @+

  3. #3
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 780
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 780
    Par défaut
    Salut à tous.

    J'ai un autre type d'accès, celui par ODBC que je teste.
    Je suis sous MySql 8.0.32 et j'ai l'ancienne version MySql ODBC 8.0.13.
    J'installe la dernière version MySql ODBC 8.0.32 afin d'être en phase avec mon SGBDR MySql d'installé.

    Je précise que dans mon fichier "my.ini", j'ai mis "require-secure-transport = on".
    Autremet dit, les accès se font obligatoirement en SSL.

    Voici comment je me connecte en ODBC pour valider l'accès par le certificat SSL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    $Driver   = "odbc:driver={MySQL ODBC 8.0 ANSI Driver};";
    $Server   = "server=localhost;";
    $Database = "database=test";
     
    $Cert     =   "sslcert=f:/Wamp/bin/apache/apache2.4.55/conf/certificat/Mysql/Client-cert.pem;";
    $Key      =    "sslkey=f:/Wamp/bin/apache/apache2.4.55/conf/certificat/Mysql/Client-key.pem;";
    $Ca       =     "sslca=f:/Wamp/bin/apache/apache2.4.55/conf/certificat/Mysql/Ca.pem;";
    $Capath   = "sslcapath=f:/Wamp/bin/apache/apache2.4.55/conf/certificat/Mysql;";
     
    $Connexion    = $Driver.$Server.$Database.$Ca.$Key.$Capath.$Cert;
    $Utilisateur  = "test";
    $Mot_de_Passe = "test";
     
    $Options         = array(
    	PDO::MYSQL_ATTR_INIT_COMMAND		=> "SET NAMES latin1",
    	PDO::ATTR_CASE				=> PDO::CASE_LOWER,
    	PDO::ATTR_ERRMODE			=> PDO::ERRMODE_EXCEPTION,
    	PDO::ATTR_PERSISTENT			=> false,
    	PDO::MYSQL_ATTR_SSL_CA			=> 'f:/Wamp/bin/apache/apache2.4.55/conf/certificat/Mysql/Ca.pem',
    	PDO::MYSQL_ATTR_SSL_KEY			=> 'f:/Wamp/bin/apache/apache2.4.55/conf/certificat/Mysql/Client-key.pem',
    	PDO::MYSQL_ATTR_SSL_CERT		=> 'f:/Wamp/bin/apache/apache2.4.55/conf/certificat/Mysql/Client-cert.pem',
    	PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT	=> true
    );
     
    try {
    	$link = new PDO($Connexion, $Utilisateur, $Mot_de_Passe, $Options);
    }
    catch (PDOException $e)
    {
    	echo "Connection à MySql impossible : ", htmlentities($e->getMessage());
    	die();
    }
    mais j'obtiens cette erreur :
    Connection à MySql impossible : SQLSTATE[HY000] SQLDriverConnect: 2026 [MySQL][ODBC 8.0(a) Driver]SSL connection error: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed
    Que je modifie l'option PDO "PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT" à true ou à false, cela ne change rien à l'erreur.

    Mais si maintenant je supprime les liens vers le certificat SSL, c'est-à-dire en mettant seulement ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Connexion    = $Driver.$Server.$Database;
    mon accès fonctionne.
    Ce qui est bizarre dans ce cas, j'ai pourtant bien précisé que l'accès se fait en mode SSL, et ODBC n'en tient pas compte.

    Après avoir fait des tas de tests avec les certificats, les accès en mode SSL ne fonctionne pas chez moi.
    Je suppose que le problème vient de mon certificat et je ne sais pas, pour l'instant, comment résoudre ce problème.

    D'une part, le certificat OpenSSL est créé auto-signé et MySql le rejette.
    D'autre part, le certificat Let's Encrypt ne me donne pas un certificat client valide.
    A vrai dire, le message d'erreur "certificate verify failed" est trop général pour connaitre l'origine du problème.
    Je suis bloqué car je n'ai pas le bon certificat SSL pour faire les tests.

    Si quelqu'un sait comment contourner ce problème, je lui serais reconnaissant.

    Cordialement.
    Artemus24.
    @+

  4. #4
    Membre éprouvé
    Homme Profil pro
    Webmaster - Développeur/intégrateur web
    Inscrit en
    Septembre 2011
    Messages
    210
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Webmaster - Développeur/intégrateur web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 210
    Par défaut
    Bonjour,

    Je ne m'y connais pas grand chose en certificat... mais à tout hasard et ce qu'il y a possibilité de le testé avec une requête HTTPS ?

    Peut-être que cela permettrait de lever le doute sur le certificat, et si le problème se produit également sur la navigateur, il y aura peut être plus de détails sur l'erreur.

  5. #5
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 780
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 780
    Par défaut
    Salut Soundboy39 et merci pour ton intervention.

    Le https concerne les échanges que tu fais au travers d'apache.
    Un nom de site se déclare dans un VirtualHost dans le fichier "httpd.conf" d'apache.
    J'utilise des certificats de chez Let's Encrypt.
    Pour le port 80 (HTTP), je fais automatiquement une redirection vers le port 443 (HTTPS).
    Au niveau du navigateur, pour mon site, je suis toujours en HTTPS et j'ai bien un cadenas.
    J'utilise le navigateur Google Chrome et si je clique sur ce cadenas, j'ai bien "la connexion est sécurisée".
    Mon certificat est valide et je n'ai pas de problème au niveau Apache.

    J'utilise les certificats Let's Encrypt suivants :
    --> server-cert.pem
    --> server-key.pem
    --> ca.pem

    Pour mes tests, je ne me trouve pas au niveau d'Apache, mais au niveau de MySql, et j'effectue des échanges de requêtes.
    Je n'utilise pas le certificat déclaré dans Apache (Let's Encrypt) mais un autre certificat déclaré dans le fichier "my.ini".
    J'ai deux sections de déclarations, l'une dans "[client]" et l'autre dans "[mysqld]".
    Je suis obligé de gérer cinq certificats qui sont :
    --> client.crt
    --> client.key
    --> server.crt
    --> server.key
    --> ca.crt.

    Quel est le problème que je rencontre ?

    Les certificats Let's Encrypt ne sont pas auto-signés, ce qui est bien.
    Mais ils ne me permettent pas de gérer un échange de type client/serveur.
    Au niveau d'apache, je ne peux pas utiliser "SSLVerifyClient Require" puisque le certificat client "PFX" ne fonctionne pas.
    Je ne sais même pas, pour les échanges MySql, si le fait de mettre "SSLVerifyClient Require" a une quelconque influence.

    Au niveau de MySql, j'utilise des certificats OpenSSL que j'ai créés moi-même, donc auto-signé.
    D'après ce que j'ai pu comprendre, MySql rejette les certificats auto-signés, mais je n'en suis pas sûr.
    Il me faut un autre type de certificat que je ne connais pas.

    En l'état dans MySql, le mode SSL "verify_ca" fonctionne correctement.
    Mais je n'arrive pas à basculrer vers le mode SSL "verify_identity".
    Et du coup, je reste dans le mode SSL "verify_ca" pour les échanges.

    Si je force le SSL dans MySql en mettant "require-secure-transport = On", mes requêtes mysql sont rejetés.
    Je suis obligé au niveau de la connexion, de dire que je ne veux pas de SSL pour qu'elles fonctionnent.

    A vrai dire, je ne sais pas où se trouve l'origine du problème.
    Je suppose que mes certificats ne sont pas valides, sauf que je ne sais pas comment obtenir de bons certificats pour finaliser mes tests.
    Ou alors, il y a une déclaration à faire dans les certificats OpenSSL pour faire en sorte que cela fonctionne.
    Mais j'ignore de quoi il s'agit.

    Là où cela se complique, je ne peux pas utiliser en l'état le certificat "ca.crt".
    Je suis obligé de créer une chaine de certification contenant le "ca.crt", mais aussi le "server.crt" ainsi que le "client.crt".
    Il paraitrait que c'est une solution pour résoudre mon problème mais cela ne change rien, mon certificat est toujours rejeté.

    A vrai dire, dans le mode SSL "verify_ca" tout fonctionne correctement, et je pourrai m'en contenter.
    Mais j'ai envie de mettre en place le plus au niveau du mode SSL "verify_identity".
    Je dois aussi faire une confusion avec le fait de force le SSL dans MySql.

    Il y a certainement quelque chose que je n'ai pas compris, mais quoi ?

    cordialement.
    Artemus24.
    @+

  6. #6
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 780
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 780
    Par défaut
    Salut à tous.

    J'ai enfin trouvé la solution à mon problème.

    Il faut concatener les trois certificats afin d'en faire un seul. Le certificat "ca.pem" ne contient que le certificat d'autorité. Comme il est auto-signé, j'ai besoin d'avoir aussi les certificats server et client dans le certificat "ca.pem". J'ai refais tous les tests et maintenant ça fonctionne !

    Quelle prise de tête.
    --> Les didacticiels ne sont pas à jour. D'où des solutions qui ne fonctionnent pas.
    --> les explications ne correspondent pas aux problèmes que j'ai rencontrés.
    --> Très peu de bonnes explications sur les certificats.

    Problème résolu.

    Cordialement.
    Artemus24.
    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Un hébergeur avec LFTP en mode ssl ?
    Par anomie dans le forum Hébergement
    Réponses: 1
    Dernier message: 06/03/2008, 14h28
  2. [Continuum] Subversion en mode SSL
    Par hel22 dans le forum Intégration Continue
    Réponses: 5
    Dernier message: 19/09/2007, 13h43
  3. Réponses: 16
    Dernier message: 26/04/2007, 14h02
  4. basculer en mode recherche
    Par pierrot67 dans le forum Bases de données
    Réponses: 8
    Dernier message: 01/06/2006, 16h27
  5. Réponses: 3
    Dernier message: 24/05/2006, 18h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo