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


15

自己署名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)

ただし、これは接続の暗号化のみであり、実際に証明書の有効性を検証するものではないと考えています(つまり、中間者攻撃に対して潜在的に脆弱であることを意味します)

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たが、役に立たなかったため削除しました。


2
なにca.cert?サーバーの自己署名証明書ですか?認証にクライアント証明書を使用していますか?サーバーにSSL関連の構成を提供してください。
mgorven

ありがとう、Iveはサーバーからの応答とssl configで質問を更新しました。接続しようとしたときにコマンドラインで渡される証明書は、実際にはクライアント証明書です。
-carpii

それは良い質問です。後知恵では、クライアントがサーバーssl-caを指定することが理にかなっているとは思えません。しかし、その後イムなしimrepssionの下で暗号化された接続はstricly認証されていない
carpii

回答:


12

はい。指定--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

どうもありがとうございます!欠けているステップは、サーバー証明書とクライアント証明書をca.pemに連結していなかったことです。代わりに、最初に生成されたca.certを渡していました(そして、クライアントとサーバーの証明書を生成するときに--CA-keyとして渡されました)
-carpii

奇妙なことですが、それは常に1つのCA証明書で機能しました-クライアントとサーバーで同じです。
ドミトリーレスコフ

はい、DNに特別な要件(CNが特定の値であるなど)がない限り、クライアントとサーバーで同じキーと自己署名証明書を使用できます。
キースバーディス

3

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

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

mysqlクライアントでは、2ウェイのSSLのために使用されています。これは、証明書ベースの認証を意味します。クライアント証明書の件名はユーザー名である必要があります。--ssl-cert--ssl-key


2
また、ソケット接続を作成し--ssl-verify-server-cert、サーバー証明書のCNを使用するときは、-hコマンドラインオプションで指定したホストと同じでなければならないことに注意してください。
キースバーディス

0

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


私にとっては、Dmitry Leskovのソリューションが有効でした。MySQLのSSLドキュメントごと:(dev.mysql.com/doc/refman/5.0/en/creating-ssl-certs.html)>証明書とキーファイルを生成するために使用する方法、サーバーに使用される共通名の値、クライアント証明書/キーはそれぞれ、CA証明書に使用される共通名の値と異なる必要があります。そうしないと、OpenSSLを使用してコンパイルされたサーバーで証明書とキーファイルが機能しません。この場合の一般的なエラーは次のとおりです。エラー2026(HY000):SSL接続エラー:error:00000001:lib(0):func(0):reason(1)
gmas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.