SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

MariaDBバージョンアップで.NETアプリからSSL接続できなくなった

目次

MariaDBバージョンアップで.NETアプリからSSL接続できなくなった

MariaDBをバージョンアップして、SSL化。

アカウントはSSL強制アカウントで運用。

この条件で、コマンドラインmysql)からSSL接続OK。

HeidiSQLからもSSL接続OK.

PHP(PDO)からもSSL接続OK。

なのに、.NETアプリからSSL接続するとDBオープンで例外でおちた!!

こんなケースの相談を受けました。

 

MariaDBにMySqlConnector/NETを使っていると要注意

こういうケースは、.NETアプリからのMariaDBへの接続に使っているドライバに問題があると考えるのが普通です。

だって、.NETから以外はOKなんですから。

.NETアプリからの接続に使うドライバの選択肢で、主なものは以下の3つです。

1.MySQL Connector/NET

dev.mysql.com

2.MySqlConnector for ADO.NET

mariadb.com

3.dotConnect for MySQL

www.devart.com

 

現在のMariaDBのおすすめは「2.MySqlConnector for ADO.NET」みたいですが、これは2016年ころから登場しているので、少し古めの.NETアプリだと、以前からあった「1.MySQL Connector/NET」を使っているケースが多いです。

今回もそうでした。

 

MySqlConnector/NETとMariaDBのバージョン対比

MySqlConnector/NETはOracle社が開発しています。

ご存じの通り、MySQLOracle社の傘下にあり、MariaDBはそうではありません。

だから、当然目線はMySQLに向いてます。

このへんがMariaDB側から見ると、なかなか問題となります。

MySqlConnector/NETのバージョンでサポートするMySQLのバージョンは違います。

当然、対応するMariaDBのバージョンも異なることになります。

とりあえず、資料を参考に、簡単に表にしてみるとこんな感じです。

Connector/NET Version MySQL Server Version Supported MariaDB Server Version
8 8.0, 5.7, 5.6 10.0以降
7 5.7, 5.6 10.0以降
6.10 8.0, 5.7, 5.6 10.0以降
6.9 5.7, 5.6, 5.5 5.5、10.0以降
6.8 5.7, 5.6, 5.5, 5.1, 5.0 5.1-5.5、10.0以降
6.7 5.7, 5.6, 5.5, 5.1, 5.0 5.1-5.5、10.0以降
6.6 5.7, 5.6, 5.5, 5.1, 5.0 5.1-5.5、10.0以降
6.5 5.7, 5.6, 5.5, 5.1, 5.0 5.1-5.5、10.0以降
6.4 5.6, 5.5, 5.1, 5.0 5.1-5.5、10.0-10.1
6.3 5.6, 5.5, 5.1, 5.0 5.1-5.5、10.0-10.1
6.2 5.6, 5.5, 5.1, 5.0, 4.1 5.1-5.5、10.0-10.1
6.1 5.6, 5.5, 5.1, 5.0, 4.1 5.1-5.5、10.0-10.1
6 5.5, 5.1, 5.0, 4.1 5.1-5.5
5.2 5.5, 5.1, 5.0, 4.1 5.1-5.5
5.1 5.5, 5.1, 5.0, 4.1, 4.0 5.1-5.5

参考にした資料のリンクは以下の通りです。

mariadb.com

dev.mysql.com

 

MySqlConnector/NETの6.4迄を使ってるとあぶない

上記の表を見ると、MySqlConnector/NETのバージョンが6 もしくは6.4あたりがサポート範囲10.1以下か10.2以上かで切り替わるバージョンであることがわかります。

それを頭にいれて調べてみたら、相談のあったプロジェクトで使っていたMySqlConnector/NETはまさしく「6.4」でした。

そして、MariaDBのバージョンアップ前のバージョンは「10.1」でした。

これが答えです。

つまり、バージョンアップをしたということなので、間違いなく10.2以降にはなっているので、MySqlConnector/NETが「6.4」ならとMariaDBのサポートバージョンからははずれてしまいます。

解決方法は、MySqlConnector/NETのバージョンをあげるだけです。

実際それでいけたのですが、差し替えたらOKではなく、ドライバ自体の非互換がありました。

 

ドライバ非互換1:MySQL.Xプロトコルコンパイルエラー

MySqlConnector/NETを「6.4」から「8.0」にあげたそうです。

そうすると、今まで問題なかったソースでコンパイルエラーがでまくりました。

メッセージは「Xは名前空間であり、変数ではありません」とあります。

箇所は「SELECTで取得したデータをループで回して処理する際のカウンタ変数」です。

同じような処理は、そこら中にあるのですが、「x」という変数名を使っている箇所だけがコンパイルエラーになってました。

どうも、MySQLの従来の接続プロトコルとは別に、新しいプロトコルとして「MySql.X」プロトコルが追加されていて、そのために定義された名前空間と、変数「x」がバッティングしたようです。

dev.mysql.com

これは変数名を「x」以外に変更するしかありませんでした。

 

ドライバ非互換2:SSL接続指定文字列(パラメータ)の相違

MySqlConnector/NETが「6.4」の時は、SSL接続を指定するためのパラメータは「Encript=True」でした。

でも、MySqlConnector/NETを「8.0」にすると、例外で落ちます。

そんなパラメータはないよ!・・といわれます。

パラメータが変更になっているのですね。

この修正は簡単です。

SslMode=Required( Ssl Mode=Required や, Ssl-Mode=RequiredでもOK)に変更すればいいだけです。

dev.mysql.com

 

まとめ

こういうのは、知っていれば簡単に解決できるけど、知らないと「何をどうしてよいかわからなくなってパニックになる」という類の話です。

なので、それほど事例としては多くなくて、僕が再度遭遇することは2度とないだろう今回のようなケースでも、書いておく価値はあるかなと思ってます。

ではでは。