急にNpgsqlからAzure Database for PostgreSQLへの接続ができなくなった

急に.NET6(.NET 3.1~7も)のNpgsqlからAzure Database for PostgreSQLへの接続ができなくなった。

アプリケーション側からみると、Azure側のPostgreSQLに強制切断されているようにみえるログが出ている。

 ---> Npgsql.NpgsqlException (0x80004005): Exception while writing to stream
 ---> System.IO.IOException: Unable to write data to the transport connection: 既存の接続はリモート ホストに強制的に切断されました。.
 ---> System.Net.Sockets.SocketException (10054): 既存の接続はリモート ホストに強制的に切断されました。
   at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 count)

こうなると、通常考えるのは、AzureのPostgreSQLで、コネクション数があふれているとか、高負荷状態とか、DBaaSの制約(PostgreSQL設定の外側)が原因じゃないかということ。これを1つ1つ調べていくと、異常なし。Azure側には問題が見当たらず。DBのログをAzureの管理ページがダウンロードして確認してみると、下記のログがあり。

could not receive data from client: An existing connection was forcibly closed by the remote host.

AzureのPostgreSQLからみると、クライアント側が切断しているとのこと。

調べてみると、「Azure Database for PostgreSQL Single server」は、ルート証明書が変更されていることがわかった。.NETで、Ngpsqlを使っている場合は、「Baltimore CyberTrust Root」と「DigiCert Global Root G2」が使うWindows(Windows Server含む)にインストールされている必要があるとのこと。ルート証明書の確認をすると、「DigiCert Global Root G2」が存在していなかった。これが原因なので、下記のマイクロソフトの内容に従い、確認して作業した。

Understanding the changes in the Root CA change for Azure Database for PostgreSQL Single server
https://learn.microsoft.com/en-us/azure/postgresql/single-server/concepts-certificate-rotation#what-do-i-need-to-do-to-maintain-connectivity

今回足りていなかったのは、「DigiCert Global Root G2」なので、Digicertのサイトからルート証明書をダウンロードした。

https://www.digicert.com/kb/digicert-root-certificates.htm#roots
(「Download DER/CRT」をクリックして、CRTファイルをダウンロード)

CRTファイルを、ルート証明書が足りていないサーバに持っていき、ダブルクリックして、ウィザードからルート証明書をインストールした。配置場所は自動選択させることでルートのところにインストールされた。

なお、ルート証明書のインストール後のOS再起動はしなくても、ルート証明書を使い始めた。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする