<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>guzik &#187; mysql_ssl_set</title>
	<atom:link href="http://guzik.net.pl/blog/tag/mysql_ssl_set/feed/" rel="self" type="application/rss+xml" />
	<link>http://guzik.net.pl/blog</link>
	<description>Mój blog</description>
	<lastBuildDate>Wed, 23 May 2012 21:15:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Bezpieczne połączenia z MySQL (C API)</title>
		<link>http://guzik.net.pl/blog/2008/08/bezpieczne-polaczenia-z-mysql-c-api/</link>
		<comments>http://guzik.net.pl/blog/2008/08/bezpieczne-polaczenia-z-mysql-c-api/#comments</comments>
		<pubDate>Sun, 10 Aug 2008 20:40:16 +0000</pubDate>
		<dc:creator>guzik</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[C API]]></category>
		<category><![CDATA[mysql_ssl_set]]></category>
		<category><![CDATA[SSL]]></category>

		<guid isPermaLink="false">http://guzik.net.pl/blog/?p=158</guid>
		<description><![CDATA[Ostatnio coraz więcej kodu w C piszę z użyciem MySQL API, a że dane przy jednym z projektów są poufne i serwer nie jest lokalny, przyjrzałem się połączeniom SSL. W zasadzie po stronie kodu to nic wielkiego &#8211; wystarczy wywołać mysql_ssl_set() przed mysql_real_connect() (mysql_connect() jest deprecated). Oczywiście pod warunkiem, że klient jest skompilowany ze wsparciem [...]]]></description>
			<content:encoded><![CDATA[<p>Ostatnio coraz więcej kodu w C piszę z użyciem <a title="http://dev.mysql.com/doc/refman/5.0/en/c.html" href="http://dev.mysql.com/doc/refman/5.0/en/c.html">MySQL API</a>, a że dane przy jednym z projektów są poufne i serwer nie jest lokalny, przyjrzałem się połączeniom SSL. W zasadzie po stronie kodu to nic wielkiego &#8211; wystarczy wywołać <a title="http://dev.mysql.com/doc/refman/5.0/en/mysql-ssl-set.html" href="http://dev.mysql.com/doc/refman/5.0/en/mysql-ssl-set.html"><code>mysql_ssl_set()</code></a> przed <a title="http://dev.mysql.com/doc/refman/5.0/en/mysql-real-connect.html" href="http://dev.mysql.com/doc/refman/5.0/en/mysql-real-connect.html"><code>mysql_real_connect()</code></a> (<code>mysql_connect()</code> jest <em>deprecated</em>). Oczywiście pod warunkiem, że klient jest skompilowany ze wsparciem <a title="http://openssl.org/" href="http://openssl.org/">OpenSSL</a> (lub <a title="http://www.yassl.com/" href="http://www.yassl.com/">yaSSL</a>, ale nigdy nie testowałem).</p>
<p>Uruchomienie samego serwera (również przy założeniu, że skompilowany ze wsparciem SSL) sprowadza się do podania <a title="http://dev.mysql.com/doc/refman/5.0/en/ssl-options.html" href="http://dev.mysql.com/doc/refman/5.0/en/ssl-options.html">dodatkowych parametrów</a> w linii komend. Przykładowo może to wyglądać tak:</p>
<blockquote><p><code>mysqld --defaults-file=/etc/mysql/my.cnf --ssl --ssl-ca=&lt;/path/to/CA.crt&gt; --ssl-cert=&lt;/path/to/file.crt&gt; --ssl-key=&lt;/path/to/file.key&gt;</code></p></blockquote>
<p>Ewentualnie odpowiednie parametry podać w pliku konfiguracyjnym (<code>my.cnf</code>):</p>
<blockquote><p><code>ssl-ca = &lt;/path/to/CA.crt&gt;<br />
ssl-cert =&lt;/path/to/file.crt&gt;<br />
ssl-key =&lt;/path/to/file.key&gt;</code></p></blockquote>
<p>Pamiętać należy, że w przypadku, gdy certyfikat jest zabezpieczony hasłem, MySQL może być jedynie uruchomiony ręcznie. Korzystając ze skryptów startowych (na pewno w Gentoo Linux) czy nawet wrzucając proces w tło (<code>&amp;</code>) serwer nie skorzysta z certyfikatu i nie nawiążemy szyfrowanej transmisji. Próba takiego uruchomienia zakończy się podobnym wpisem w logach:</p>
<blockquote><p><code>[Warning] Failed to setup SSL</code></p></blockquote>
<p>Testowe połączenie do serwera z konsoli mysql możemy wykonać podając jedynie ścieżkę do certyfikatu CA (format PEM), np.</p>
<blockquote><p><code>mysql -h &lt;host&gt; -u &lt;user&gt; -p --ssl-ca=&lt;/path/to/CA.crt&gt; &lt;database&gt;</code></p></blockquote>
<p>Wywołując <code>STATUS </code>możemy sprawdzić czy bieżące połączenie ma wsparcie SSL:</p>
<blockquote><p><code>SSL:            Cipher in use is DHE-RSA-AES256-SHA</code></p></blockquote>
<p>czy też nie:</p>
<blockquote><p><code>SSL:            Not in use</code></p></blockquote>
<p>Wymuszanie szyfrowanych połączeń możliwe tylko poprzez <code>REQUIRE SSL</code> przy nadawaniu praw użytkownikowi (<a title="http://dev.mysql.com/doc/refman/5.0/en/grant.html" href="http://dev.mysql.com/doc/refman/5.0/en/grant.html"><code>GRANT</code></a>). W takim przypadku połączenie bez SSL zakończy się komunikatem podobnym jak w przypadku np. podania błędnego hasła:</p>
<blockquote><p><code>ERROR 1045 (28000): Access denied for user 'exg'@'192.168.1.101' (using p assword: YES)</code></p></blockquote>
<p>Więcej o używaniu SSL w MySQL można poczytać tutaj:</p>
<ul>
<li><a title="http://dev.mysql.com/doc/refman/5.0/en/secure-using-ssl.html" href="http://dev.mysql.com/doc/refman/5.0/en/secure-using-ssl.html">MySQL 5.0 Reference Manual :: 5.5.7.2 Using SSL Connections</a></li>
</ul>
<p>Wracając do samej funkcji <code>mysql_ssl_set()</code>, to jako parametry przyjmuje: uchwyt połączenia zwrócony przez <a title="http://dev.mysql.com/doc/refman/5.0/en/mysql-init.html" href="http://dev.mysql.com/doc/refman/5.0/en/mysql-init.html"><code>mysql_init()</code></a>, ścieżkę do pliku klucza, certyfikatu i certyfikatu CA oraz ścieżkę do katalogu z certyfikatami CA w formacie PEM, a także listę wspieranych algorytmów.<br />
Nieużywane parametry powinny przyjmować wartość <code>NULL</code>.<br />
Funkcja zawsze zwraca <code>0</code>, o błędach SSL informuje <code>mysql_real_connect()</code>.</p>
<blockquote><p><code>ERROR 2026 (HY000): SSL connection error</code></p></blockquote>
<p>Na koniec łyżka dziegciu &#8211; libmysql (i klient mysql) dla Windows (ten z binarnej paczki) nie jest skompilowany z obsługą SSL. Aby korzystać z bezpiecznych połączeń należy pobrać źródła i samodzielnie dokonać kompilacji. Mi się nie udało&#8230; Może przez zbyt stare Visual C++.</p>
]]></content:encoded>
			<wfw:commentRss>http://guzik.net.pl/blog/2008/08/bezpieczne-polaczenia-z-mysql-c-api/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

