web-dev-qa-db-ja.com

自己署名SSL証明書を使用してMySQLに接続できない

自己署名SSL証明書を作成した後、それらを使用するようにリモートMySQLサーバーを構成しました(SSLが有効になっています)

私は自分のリモートサーバーにSSH接続し、SSLを使用して独自のmysqldに接続してみます(MySQLサーバーは5.5.25です)。

mysql -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key --ssl-ca=ca.cert
Enter password: 
ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)

OK、SSL経由で同じサーバーに接続する際にいくつかの問題があることを読んだことを覚えています。クライアントのキーをローカルボックスにダウンロードして、そこからテストします...

mysql -h <server> -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key --ssl-ca=ca.cert 
Enter password: 
ERROR 2026 (HY000): SSL connection error

この「SSL接続エラー」エラーの意味はわかりませんが、-ssl-caを省略すると、SSLを使用して接続できます。

mysql -h <server> -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.5.25 MySQL Community Server (GPL)

ただし、これは接続を暗号化するだけであり、実際には証明書の有効性を検証していないと思います(つまり、man-in-middle攻撃に対して脆弱になる可能性があります)。

SSL証明書は有効です(自己署名されています)。パスフレーズはありません。だから私の質問は、何が間違っているのですか?自己署名証明書を使用して、SSL経由で接続するにはどうすればよいですか?

MySQLサーバーのバージョンは5.5.25で、サーバーとクライアントはCentOS 5です。

アドバイスをありがとう

編集:すべての場合において、コマンドはsslキーが存在する同じディレクトリから発行されることに注意してください(したがって絶対パスはありません)

編集(mgorvenへの応答):ca.certは認証局の証明書で、mysqlに私の認証局が信頼されていることを伝えることになっています。

my.cnfの設定は

[mysqld]
ssl-ca=/etc/ssl/mysql/ca.cert
ssl-cert=/etc/ssl/mysql/server.cert
ssl-key=/etc/ssl/mysql/server.key

私もssl-cipher=DHE-RSA-AES256-SHAを追加してみましたが、役に立たなかったため、削除しました。

15
carpii

はい、正しいです。--ssl-caを指定しない場合、クライアントはサーバー証明書をまったくチェックしません。このオプションがなくても機能するため、失敗の最も可能性の高い理由は、クライアントがサーバー証明書を信頼していないことです。

自己署名のクライアント証明書とサーバー証明書を使用している場合は、ca.certファイルに両方のファイルを含める必要があります。これにより、クライアントはサーバー証明書を信頼し、サーバーはクライアント証明書を信頼します。

例:
サーバーキーと証明書を生成します。

$ openssl req -x509 -newkey rsa:1024 \
         -keyout server-key-enc.pem -out server-cert.pem \
         -subj '/DC=com/DC=example/CN=server' -passout pass:qwerty

$ openssl rsa -in server-key-enc.pem -out server-key.pem \
         -passin pass:qwerty -passout pass:

クライアントキーと証明書を生成します。

$ openssl req -x509 -newkey rsa:1024 \
         -keyout client-key-enc.pem -out client-cert.pem \
         -subj '/DC=com/DC=example/CN=client' -passout pass:qwerty

$ openssl rsa -in client-key-enc.pem -out client-key.pem \
         -passin pass:qwerty -passout pass:

クライアントとサーバーの証明書をCA証明書ファイルに結合します。

$ cat server-cert.pem client-cert.pem > ca.pem
12
Keith Burdis

一方向のsslを使用するには、次のことを試してください:

mysql -u <user> -p --ssl=1 --ssl-ca=ca.cert --ssl-verify-server-cert

--ssl-certおよび--ssl-key mysqlクライアントでは、双方向SSLに使用されます。これは、証明書ベースの認証を意味します。クライアント証明書の件名はユーザー名である必要があります。

3

万が一、サーバーとクライアントの証明書に同じ共通名を入力していませんか? 「はい」の場合、共通名が異なるようにいずれかを置き換えます。

0
Dmitry Leskov