Ressources informatiques

Ressources informatiques

Ressources informatiques

Mettre en oeuvre l'accès SSL à Maria DB

Installer le connecteur C - MariaDB

adminX@clientX:~$ su - root
Mot de passe :
root@debian:~# apt install libmariadbd-dev

Configurer le serveur MariaDb

Effectuer des requêtes sur la base

Affichage sans contraintes : affichage de tous les fournisseurs

Dans ce cas, il n'est pas nécessaire d'utiliser les requêtes préparées

Programme source
/**
 * @file selectEnCMysqlSsl.c
 * Compilation: gcc -o selectEnCMysqlSsl selectEnCMysqlSsl.c `mariadb_config --cflags --libs`
 * Exécution : ./selectEnCMysqlSsl -u <user> -p <password>
 * Ce programme affiche les fournisseurs de la ville de Brétigny en utilisant une connexion SSL
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <mysql.h>

#define HOTE "192.168.56.61"
#define NOM_BASE "meubleFournisseur"

// Chemins vers les certificats SSL
#define CA_CERT "ca.crt"
#define CLIENT_CERT "client1.crt"
#define CLIENT_KEY "client1.key"

void usage(const char *prog_name) {
    fprintf(stderr, "Usage: %s -u <user> -p <password>\n", prog_name);
    exit(1);
}

int main(int argc, char *argv[]) {
    MYSQL *pMysql;
    MYSQL_STMT *stmt;

    char *user = NULL, *password = NULL;
    int opt;

    while ((opt = getopt(argc, argv, "u:p:")) != -1) {
        switch (opt) {
            case 'u':
                user = optarg;
                break;
            case 'p':
                password = optarg;
                break;
            default:
                usage(argv[0]);
        }
    }

    if (user == NULL || password == NULL ) {
        usage(argv[0]);
    }

    if ((pMysql = mysql_init(NULL)) == NULL) {
        fprintf(stderr, "mysql_init() échoué : %s\n", mysql_error(pMysql));
        return -1;
    }

    // Configuration SSL avant la connexion
    if (mysql_ssl_set(pMysql, CLIENT_KEY, CLIENT_CERT, CA_CERT, NULL, NULL) != 0) {
        fprintf(stderr, "mysql_ssl_set() échoué : %s\n", mysql_error(pMysql));
        mysql_close(pMysql);
        return -1;
    }

    // Connexion avec forçage SSL
    if (mysql_real_connect(pMysql, HOTE, user, password, NOM_BASE, 0, NULL, CLIENT_SSL) == NULL) {
        fprintf(stderr, "mysql_real_connect() échoué : %s\n", mysql_error(pMysql));
        mysql_close(pMysql);
        return -1;
    }

    // Vérification SSL effective
    const char *ssl_cipher = mysql_get_ssl_cipher(pMysql);
    if (ssl_cipher == NULL || strlen(ssl_cipher) == 0) {
        fprintf(stderr, "Connexion NON sécurisée (SSL non utilisé)\n");
        mysql_close(pMysql);
        return -1;
    } else {
        printf("Connexion SSL sécurisée (chiffrement : %s)\n", ssl_cipher);
    }

    // Préparer la requête avec un paramètre
    const char *sql = "SELECT fou_nom, fou_ville FROM fournisseur WHERE fou_ville = ?";
    stmt = mysql_stmt_init(pMysql);
    if (!stmt) {
        fprintf(stderr, "mysql_stmt_init() échoué\n");
        mysql_close(pMysql);
        return -1;
    }
    if (mysql_stmt_prepare(stmt, sql, strlen(sql)) != 0) {
        fprintf(stderr, "mysql_stmt_prepare() échoué : %s\n", mysql_stmt_error(stmt));
        mysql_stmt_close(stmt);
        mysql_close(pMysql);
        return -1;
    }

    // Lier le paramètre (ville)
    MYSQL_BIND bind_param[1];
    memset(bind_param, 0, sizeof(bind_param));
    char ville[] = "Brétigny";
    bind_param[0].buffer_type = MYSQL_TYPE_STRING;
    bind_param[0].buffer = ville;
    bind_param[0].buffer_length = strlen(ville);

    if (mysql_stmt_bind_param(stmt, bind_param) != 0) {
        fprintf(stderr, "mysql_stmt_bind_param() échoué : %s\n", mysql_stmt_error(stmt));
        mysql_stmt_close(stmt);
        mysql_close(pMysql);
        return -1;
    }

    // Préparer les buffers de sortie
    MYSQL_BIND result_bind[2];
    memset(result_bind, 0, sizeof(result_bind));
    char fou_nom[100];
    unsigned long fou_nom_length;
    my_bool fou_nom_is_null;

    char fou_ville[100];
    unsigned long fou_ville_length;
    my_bool fou_ville_is_null;

    result_bind[0].buffer_type =
Compilation
adminX@clientX:~$ gcc -o selectEnCMysqlSsl selectEnCMysqlSsl.c `mariadb_config --cflags --libs`

Remarque : il peut être nécessaire de remplacer mariadb_config par mysql_config

Exécution
adminX@clientX:~$ ./selectEnCMysqlSsl -u adminBaseMeuble3 -p bonjour
Connexion SSL sécurisée (chiffrement : TLS_AES_256_GCM_SHA384)
fou_nom         fou_ville
-----------------------------
B Meubles               Brétigny