2017-07-13 31 views
6

MySQLのサーバでphp5.3が動作しています。新しいwebserverはphp7.1(php5.3から移行)を実行しています。私がsslとMysqlサーバを接続しようとすると動作しません。SSLによるMySQLの接続が動作していませんPDO

try { 
$dbh = new PDO($dsn, $user, $password, array(PDO::MYSQL_ATTR_SSL_KEY => '/etc/mysql/client-key.pem', 
              PDO::MYSQL_ATTR_SSL_CERT => '/etc/mysql/client-cert.pem', 
              PDO::MYSQL_ATTR_SSL_CA => '/etc/mysql/ca-cert.pem') 
      ); 
    echo "Connestion established"; 
} catch (PDOException $e) { 
    echo 'Connection failed: ' . $e->getMessage(); 
} 

Connection failed: SQLSTATE[HY000] [2002]

PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed

しかし、私は、接続、その作業罰金からSSLブロックを削除します。私は何が起こっているのか分からない。サーバーとクライアントのバージョンが一致していない可能性があります。私は古い公開鍵と秘密鍵を使用しています。

mysqlクライアントとサーバーのバージョンが一致しないためですか?

PS:Webサーバーでのみphp7をアップグレードしました。

+0

phpのエラー報告は何ですか? SSLで有効な証明書であり、configで有効になっていますか? –

+0

@ Fred-ii- try-catchを使用しているので、 'php'エラーの何もありません。証明書を変更したことはありません。古いWebサーバーから新しいWebサーバーにコピー・ペーストするだけです。 –

+0

@ Fred-ii-:古いwebserverはapache2と新しい1つのnginxを実行していました。 nginxでmysql-sslを有効にする場所は? –

答えて

1

あなたは「あるサーバーから別のサーバーにSSLキーをコピーしました」と言います。だから新しいサーバーがありますか?新しいサーバーには新しいIDがあるため、IDが一致しないため、リモートサーバーは証明書を拒否します。

まず、 "known_hosts"ファイルからリモートサーバー上の行を削除する必要があります。 Nginxサーバでは、SSH鍵を使用してリモートサーバに手動で接続し、known_hostsに新しいアイデンティティを追加するために接続を1回行う必要があります。

その後、私はそれがうまくいくと思います。

上記がうまくいかない場合でも、手動でリモートホストに接続することでこの問題をデバッグすることをお勧めします。それがうまくいくと、mysql接続を設定しようとすることができます。

+0

鍵ペアは 'MySQL'サーバから生成されます。私は一部のクライアント側を変えるだけです。次に、php5.3で新しいクライアント/サーバを作成すると、すべてが以前と同じように動作します。そのphpのバージョンの問題か、apache2かnginxの設定かもしれません。あなたの考えはどうですか? –

+0

うーん、バマー。ごめんなさい。 – vrijdenker

3

したがって、私はこの問題はSSL処理がPHP 5.6で承認され、ピア検証がデフォルトで有効になっていることが原因であると考えています。

次は、MySQLに関するものではありませんが、fsockについて、私はこの記事があなたの質問に答えると思う一方で: https://stackoverflow.com/a/32366242/2459026

あなたは(良いアイデアではない傾向がある)ピア検証を無効にしたり、ルートを修正する可能性がどちらか証明書。 私はそれがあなたの問題であることを確かめるためにピア検証を無効にすることによってテストすることは良いと思います。

は、あなたが新しいSSL証明書を生成する必要が

+0

DBサーバーに接続する前にこのブロックを追加しました。 'stream_context_set_default([ 'verify_peer' 'SSL' => [ \t 'verify_peer_name' => falseを、 =>偽 ] ]);' さらに、同じエラーを取得します。何か不足していますか? –

+0

あなたが私に送るのは、このエラーの解決策です: 'SSL3_GET_SERVER_CERTIFICATE:証明書の検証に失敗しました 'しかし私の場合、エラーは' tls_process_server_certificate:certificate verify failed'です。 –

+0

Ugh。本当にベストを尽くしていますが、これまでのところ助けを借りているわけではありません。 – vrijdenker

0

(それはあなたの質問への答えではなかった。私は私の前の回答と一緒に第二の答えを追加したことに注意し、それでもよく、または関連する他のものではないかもしれないしてください)サーバー上のエンドポイントをテストして、サーバーが正しく機能していることを確認します。あなたは後に問題はないはずです。私はLet's Encryptを使用することをお勧めします:それは無料でオープンであり、高度にサポートされています。あとで指示hereに従ってください。

0

あなたは新しいSSL証明書を生成し、あなたは右の「一般名」を使用していることを確認してください可能性:

CA: hostname 
Server: FQDN, e.g. hostname.example.com 
Client: somename 

重要な部分は共通名がホストあなたと同じでなければならないサーバ証明書です接続している、例えばhostname.example.com。

+0

同じサーバーに接続するクライアントが2つある場合はどうなりますか。サーバーと2つのクライアントの共通名は何か。 –

+0

証明書を生成すると、いくつかの引数が必要です。州(S)、地方(L)、共通名(CN)。したがって、CNはクライアントから接続するアドレスと完全に同じである必要があります。 'db.myhost.com'でMySQLを実行している場合は、' db.myhost.com'をCNとして使用し、クライアントから 'db.myhost.com'に接続する必要があります。http://info.ssl.com/article .aspx?id = 10048 –

関連する問題