połączenie SSL z bazą danych

0

Witam, mam problem z połączeniem szyfrowanym, mianowicie gdy w stringu połączenia dodam "SSL Mode=Required" to albo program albo serwer się zawiesza. Rozmawiałem z administratorem i twierdzi że serwer jest dobrze z konfigurowany ponieważ połączył się z innego serwera połączeniem szyfrowanym. Używam MySQL Connector/NET 6.2 i VS 2010. Nie rzuca wyjątkiem, a gdy usunę linię z SSL Mode od razu działa. Korzystam z tutoriala http://dev.mysql.com/doc/refman/5.5/en/connector-net-tutorials-ssl.html. Mój kod:

StringBuilder connectionStr = new StringBuilder();
connectionStr.Append("server=host.pl;");
connectionStr.Append("user="  +data[1] + ";");
connectionStr.Append("password=" + data[2] + ";");
connectionStr.Append("database=" + data[0] + ";");
connectionStr.Append("port=3306;");
connectionStr.Append("charset=utf8;");
connectionStr.Append("CertificateFile=client.pfx;");
connectionStr.Append("CertificatePassword=pass;");
connectionStr.Append("SSL Mode=Required;");

try
{
    connection = new MySqlConnection(connectionStr.ToString());
    connection.Open();
}
catch(MySqlException e)
{
    MessageBox.Show(e.Message);
}
0

czy masz autentykować się certyfikatem? i skąd masz client.pfx?

0

Sposób z certyfikatem znalazłem na stronie MySQL jako tutorial. Jeżeli istnieje jakiś łatwiejszy sposób to proszę o wskazanie go. Plik client.pfx wygenerowałem na serwerze przez openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -certfile cacert.pem -out client.pfx

0

Nie łączyliście się nigdy z serwerem przy użyciu SSL ? Może ma ktoś jakiś przykład ?

0

Czytałem ten wątek, ale wydaje mi się on bez sensu gdyż istnieje już provider z obsługą SSL (temat jest z 2006 roku).

0

przekop się przez tą dokumentację:
http://dev.mysql.com/doc/refman/5.0/en/secure-connections.html

Ja akurat z MySQL nie łączyłem się w ten sposób nigdy, dopiero jutro wieczorem będę miał czas żeby samodzielnie coś przetestować.

0

Hej,
mam podobny problem, czy wie ktoś jak rozwiązać ten problem ?

0

Cały czas walczę z tym problem i nic, przekopał się ta dokumentację, stworzyłem nowe certyfikaty. Dalej nie działa, ale przynajmniej rzuca jakieś wyjątki. podczas wywołania metody Open().

ASN1 unexpected end of data

Może komuś coś świta ?

0

Ciekawa sprawa z MySql po SSL'u. Po zapoznaniu się z dokumentacją http://dev.mysql.com/doc/refman/5.0/en/secure-create-certs.html wyszło mi takie coś (tak na szybko):

Primo:
Stworzyłem sobie usera w ten sposób:

 
CREATE DATABASE jdoe CHARSET utf8;
GRANT ALL PRIVILEGES ON jdoe.* TO 'jdoe'@'%' IDENTIFIED BY 'Pa$$w0rd' REQUIRE SSL;
FLUSH PRIVILEGES;

Secundo:
Mój serwer MySql śmiga na Debianie (Debian Squeeze 6.0.1 + MySql 5.1.49-3) pod adresem: 10.0.0.100. Certyfikaty ca-cert.pem, server-cert.pem i client-cert.pem wygenerowane na podstawie tego: http://dev.mysql.com/doc/refman/5.0/en/secure-create-certs.html (Example 1) tak więc client-cert.pem jest bez hasła (opcja -nodes o ile się nie mylę).

Tertio:
Aplikacja konsolowa z referencjami do: MySql.Data, System, System.Core, System.Data (używam VS 2008 Pro + MySQL Connector Net 6.3.5 ale w VS 2010 nie powinno być różnicy - wszystko zależy od wersji MySQL Connector)

 
using System;
using System.Text;
using MySql.Data.MySqlClient;

namespace MysqlSslConnectionTest
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder connnectionString = new StringBuilder();
            connnectionString.Append("Server=10.0.0.100;");
            connnectionString.Append("User=jdoe;");
            connnectionString.Append("Password=Pa$$w0rd;");
            connnectionString.Append("Database=jdoe;");
            connnectionString.Append("Port=3306;");
            connnectionString.Append("Charset=utf8;");
            connnectionString.Append("CertificateFile=client-cert.pem;");
            connnectionString.Append("SSL Mode=Required;");

            // Sprawdźmy connection string
            Console.WriteLine("Connection string: ");
            Console.WriteLine(connnectionString.ToString());
            Console.WriteLine();

            // ok no to jazda
            Console.WriteLine("Connecting to MySql using SSL Connection...");
            try
            {
                // Nowe połączenie
                MySqlConnection mysqlConnection = new MySqlConnection(connnectionString.ToString());
                // Otwórzmy je
                mysqlConnection.Open();
                // Jeśli do tej pory nie wywaliło błędu to mamy połączenie
                Console.WriteLine("*** SUCCESS: Connection established...");

                // Stwórzmy nowe polecenie 
                MySqlCommand mysqlCommand = mysqlConnection.CreateCommand();
                
                // Na początek sprawdźmy datę i czas
                mysqlCommand.CommandText = "SELECT NOW();";
                mysqlCommand.Connection = mysqlConnection;

                // Stwórzmy DataReader'a
                MySqlDataReader mysqlDataReader = mysqlCommand.ExecuteReader();
                while (mysqlDataReader.Read())
                {
                    // Pętla po kolumnach
                    for (int i = 0; i < mysqlDataReader.FieldCount; i++)
                    {
                        // Wypiszmy je
                        Console.WriteLine(mysqlDataReader.GetValue(i).ToString());
                    }
                }
                // Zamykamy naszego DataReader'a bo inaczej dostaniemy błąd:
                //    There is already an open DataReader associated with this 
                //    Connection which must be closed first.
                mysqlDataReader.Close();

                Console.WriteLine();

                // Teraz sprawdźmy jaką wartość ma Ssl_cipher
                mysqlCommand.CommandText = "SHOW STATUS LIKE 'Ssl_cipher';";
                mysqlDataReader = mysqlCommand.ExecuteReader();
                while (mysqlDataReader.Read())
                {
                    for (int i = 0; i < mysqlDataReader.FieldCount; i++)
                    {
                        Console.WriteLine(mysqlDataReader.GetValue(i).ToString());
                    }
                }

                // cleanup
                mysqlDataReader.Close();
                mysqlConnection.Close();
            }
            catch (MySqlException mysqlEx)
            {
                // Jeśli napotkamy błąd MySql
                Console.WriteLine("*** ERROR [" + mysqlEx.ErrorCode.ToString() + "]: Connection failed.");
                Console.WriteLine("*** " + mysqlEx.Message);
            }
            catch (Exception ex)
            {
                // Jeśli to jest jakiś inny błąd
                Console.WriteLine("*** ERROR: Unknown error.");
                Console.WriteLine("*** " + ex.Message);
            }

            // by okienko konsoli za szybko nam nie umknęło...
            Console.ReadKey();
        }
    }
}

no i wynik:

Connection string:
Server=10.0.0.100;User=jdoe;Password=Pa$$w0rd;Database=jdoe;Port=3306;Charset=utf8;CertificateFile=client-cert.pem;SSL Mode=Required;

Connecting to MySql using SSL Connection...
*** SUCCESS: Connection established...
2011-04-14 22:50:14


Ssl_cipher
AES256-SHA

jakby co mogę zapodać zipa z programem (kody źródłowe)

0

Super! Wreszcie jakaś odp :) Może błędem jest to że używam pliku .pfx. Jutro będę miał chwilę to sprawdzę :) Jeżeli możesz to wgraj gdzieś ten programik. Z góry dzięki :)

0

Źrodła są dostępne tutaj: http://files.potyra.net/get/MysqlSslConnectionTest.zip

Można by jeszcze pomyśleć na użyciem certyfikatu z magazynu bez konieczności podawania pliku *.pem

0

Niestety dalej nie działa. Rzuca wyjątek "Wywołanie SSPI nie powiodło się. Zobacz wyjątek wewnętrzny.", a w nim "ASN1 unexpected end of data". Jak masz ustawiony plik my.cnf ? U mnie on wygląda tak:

[client]
ssl-key = /xxx/client-key.pem
ssl-cert = /xxx/client-cert.pem
ssl-ca = /xxx/ca-cert.pem

[mysqld]
ssl-key = /xxx/server-key.pem
ssl-cert = /xxx/server-cert.pem
ssl-ca = /xxx/ca-cert.pem


local-infile=0
max_connections=250


Jednak wcześniej dla client i mysqld było to samo ustawione, ja to edytowałem.

0

Troszkę poszukałem, posprawdzałem i wyszło mi, że jednak coś jest nie tak z serwerem mysql...

1 użytkowników online, w tym zalogowanych: 0, gości: 1