MySQLデータベースに接続するときのSSL接続に関する警告


312

以下の2つのクラスを使用して、MySQLデータベースに接続してみました。ただし、私は常にこのエラーを受け取ります:

Wed Dec 09 22:46:52 CET 2015警告:サーバーのID検証なしでSSL接続を確立することは推奨されません。MySQL 5.5.45 +、5.6.26 +および5.7.6+の要件によると、明示的なオプションが設定されていない場合、デフォルトでSSL接続を確立する必要があります。SSLを使用しない既存のアプリケーションに準拠するために、verifyServerCertificateプロパティは「false」に設定されています。useSSL = falseを設定してSSLを明示的に無効にするか、useSSL = trueを設定してサーバー証明書検証用のトラストストアを提供する必要があります。

これはmainメソッドを持つテストクラスです:

public class TestDatabase {

    public static void main(String[] args) {
        Database db = new Database();
        try {
            db.connect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        db.close();
    }
}

これはDatabaseクラスです:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Database {

    private Connection con;

    public void connect() throws Exception{

        if(con != null) return;

        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            throw new Exception("No database");
        }

        String connectionURL = "jdbc:mysql://localhost:3306/Peoples";

        con = DriverManager.getConnection(connectionURL, "root", "milos23");        
    }

    public void close(){
        if(con != null){
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

2
返信ありがとうございます。大丈夫です。StringconnectionURLの最後にssl = trueまたはfalseを付ける必要があることを知りませんでした。
Milos86

おかげで、新しいconnectionURLはどうですか?
user3290180

4
これはエラーではなく、警告です。
Fernando Silveira 2017年

回答:


577

接続URLは次のようになります。

jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false

これにより、SSLが無効になり、SSLエラーも抑制されます。


41
jdbcの接続文字列はセミコロンで終了してはいけません
Amith

8
Tomcatコンテキストファイルjdbc:mysql:// localhost:3306 / databaseName?autoReconnect = true; useSSL = false;
Amith、2016

27
セミコロンとの混同は、XML構成で?autoReconnect = true& useSSL = falseにする必要があるという事実が原因である可能性があります。そうでない場合、パーサーは、「;」で終了する必要がある奇妙なエンティティがあると考えます。
Bostone

25
私は休止状態で同じ問題があったが、このようにURLによって解決: jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false 私が使用& &の
Saqib Ahmed 2017

2
ネットワークが安全な場合、SSLを無効にする場合があります。たとえば、同じ物理ハードウェア上のクライアントだけがアクセスするコンテナでSQLサーバーを実行しています。
ロドニー

131

SSLを使用してサーバーの検証をオフにする方法(自分のコンピューターで開発モードになっている場合など):

jdbc:mysql://localhost:3306/Peoples?verifyServerCertificate=false&useSSL=true

これは、IntelliJ / DataGrip経由でSSLを介してMySQLデータベースに接続するために必要なものです
Swaraj

23

いいurlね!

jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&useSSL=false

しかし、XML構成で&記号に言及すると、IDEは以下のエラーを表示します。

エンティティ「useSSL」への参照は「;」で終了する必要があります デリミタ。

そして、あなたが明示的に使用する必要が&代わりにし&て決定すべき&xmlで、その後、xmlあなたのこのようなXML設定にURLを与えることがあります。

<property name="connection.url">jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&amp;useSSL=false</property>

22

別の方法は次のとおりです。

Properties properties = new Properties();
properties.setProperty("user", "root");
properties.setProperty("password", "milos23);
properties.setProperty("useSSL", "false");

try (Connection conn = DriverManager.getConnection(connectionUrl, properties)) {
...
} catch (SQLException e) {
...
}

いい感じですが、これを私のgrails-appのapplication.ymlにどのように取り込むのですか?
ソフトウェア

12

この警告も見つけたので、このサンプルコードのように、接続文字列にSSL = falseサフィックスを使用して修正しました。

例:

connectionString = "jdbc:mysql://{server-name}:3306/%s?useUnicode=yes&characterEncoding=UTF-8&useSSL=false"

11

MySQLサーバーへの接続を開始するためのデフォルトは最近変更されました(スタックオーバーフローに関する最も一般的な質問と回答をざっと見てみると)、新しい値は多くの混乱を引き起こしています。さらに悪いことに、標準的なアドバイスはSSLを完全に無効にすることであるように思われます。

接続が本当にネットワークに公開されていない場合(localhostのみ)、または実際のデータがない非本番環境で作業している場合は、オプションを含めてSSLを無効にしても害はありません。 useSSL=false

他のすべての人にとって、証明書とホスト検証でSSLを機能させるには、次のオプションのセットが必要です。

  • useSSL = true
  • sslMode = VERIFY_IDENTITY
  • trustCertificateKeyStoreUrl = file:path_to_keystore
  • trustCertificateKeyStorePassword = password

追加のボーナスとして、すでにオプションを試してみているので、弱いSSLプロトコルを無効にすることも簡単です。

  • enabledTLSProtocols = TLSv1.2

したがって、実際の例として、次の大まかな手順に従う必要があります。

最初に、MySQLサーバーホストに対して有効な証明書が生成されていること、およびCA証明書がクライアントホストにインストールされていることを確認します(自己署名を使用している場合は、これを手動で行う必要がありますが、人気のあるパブリックCA(既に存在します)。

次に、JavaキーストアにすべてのCA証明書が含まれていることを確認します。Debian / Ubuntuでは、次のコマンドを実行してこれを実現します。

update-ca-certificates -f
chmod 644 /etc/ssl/certs/java/cacerts

最後に、接続文字列を更新して、必要なすべてのオプションを含めます。これは、Debian / Ubuntuでは少し似ています(必要に応じて調整)。

jdbc:mysql://{mysql_server}/confluence?useSSL=true&sslMode=VERIFY_IDENTITY&trustCertificateKeyStoreUrl=file%3A%2Fetc%2Fssl%2Fcerts%2Fjava%2Fcacerts&trustCertificateKeyStorePassword=changeit&enabledTLSProtocols=TLSv1.2&useUnicode=true&characterEncoding=utf8

リファレンス:https : //beansandanicechianti.blogspot.com/2019/11/mysql-ssl-configuration.html


これは正しい答えであるだけでなく、最も詳細かつ安全です。SSLに関する警告が表示された場合は、スキップしないでください(サンドボックスおよびローカルインストールを除く)。Azure MySQLに接続するKubernetes Keycloack 9.0.2クラスターの適切なソリューションを私に指摘しました。どうもありがとう!
iakko

10

次のようにmysqlパスを使用する必要があります。

<property name="url" value="jdbc:mysql://localhost:3306/world?useSSL=true"/>

9

これは私にとっては問題ありませんでした:

this.conn = (Connection)DriverManager
    .getConnection(url + dbName + "?useSSL=false", userName, password);

9

これを使用して、MySQLとの接続中にハイブの問題を解決します

<property>
   <name>javax.jdo.option.ConnectionURL</name>
   <value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true&amp;autoReconnect=true&amp;useSSL=false</value>
   <description>metadata is stored in a MySQL server</description>
</property>

しかし、なぜand演算子を使用しないのですか?のようなものがありましたjdbc:mysql://localhost/metastore?useSSL=false&createDatabaseIfNotExist=true。なしで、それはうまくいきます。
クラサンガー2017年

私にとって、投稿された値はスムーズに機能したため、2017年12月末に回答としてフラグを立て、hive-2.1.1 hive-site.xmlを使用します。
ArifMustafa 2017

7

このプロパティを構成XMLの休止状態に使用します

<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/bookshop?serverTimezone=UTC&amp;useSSL=false
</property>

なし-serverTimezone = UTC- 機能しません


4

解決策これを修正するには、MySQL接続文字列の最後にuseSSL = falseを追加します。

例。

application.properties

mysqlデータソース

spring.datasource.url=jdbc:mysql://localhost/dbname?useSSL=false
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

2

mysql-connectorの新しいバージョンは、デフォルトでSSL接続を確立します...それを解決するために:

mysql-connector-java-5.0.8.zipなどの古いバージョンのmysql-connectorをダウンロードします。

。。または。。OpenSSL for Windowsをダウンロードし、設定方法の指示に従ってください


0

私は現在開発モードなので、tomSSLではなくmysqlサーバー構成でuseSSLをNoに設定します。ワークベンチからアクセス設定の管理\サーバー接続の管理に移動しました->私の接続を選択しました。内部接続タブはSSLタブに行き、設定を無効にしました。私のために働いた。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.