タグ: SSL

  • 急に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再起動はしなくても、ルート証明書を使い始めた。

  • FreeBSD13.1にしたときにCertbotが消えていた

    FreeBSD13.1にアップグレードしたときに、pkgの更新も行ったためか、certbotがきえていた。Let’s Encryptの証明書が更新されているはずなのに、更新されず期限が切れたので、そこで気がついた。

    コマンドが消えて、エラーになった。(↓のコマンドが消えた)

    /usr/local/bin/certbot-3.8 renew

    pkgで探して、新しくインストール。

    pkg search certbot
    pkg install py39-certbot-1.27.0,1

    シンボリックリンクが作られていたので、そちらを利用して、証明書を更新した。そのあとに、Apacheを再起動。

    certbot renew
    httpd -k restart
  • OpenSSLでCSRを発行したときに”.rnd”が開けないというエラーが出た

    OpenSSLでCSRを発行したときに”.rnd”が開けないというエラーが出た。エラーは出たが、CSRファイル自体は出力できた。

    Can't load /root/.rnd into RNG
    140466838241728:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/root/.rnd

    毎回エラーがでると、ドキッとするので、エラーが出ないようにした。

    `/etc/ssl/openssl.cnf `を開いて、下記の行をコメントアウトした。

    RANDFILE                = $ENV::HOME/.rnd

    これでコマンドを実行してもエラーが表示されなくなった。

  • Windows Server 2019のIISで、HTTP/2の通信をする

    Windows Server 2019のIISで、HTTP/2の通信をする方法について。IISで、SSLの設定をすると、デフォルトの通信がHTTP/2になる。HTTP/2は、SSLでの通信が前提になるので、SSLの設定をしない場合とSSLで通信をしない場合は、HTTP/2で通信は行われない点が注意するポイント。

    そのため、HTTP/2で通信をしたくないときは、IISのマネージャーで「サイト バインドの編集」を開き、「HTTP/2 を無効にする」にチェックを入れる必要がある。

  • Nginxに中間CA証明書をインストールするときの注意

    Nginxは、サーバ証明書を1つしか設定できない。そのため、中間CA証明書を指定しなければならない場合は、1つのファイルに複数の証明書を記述する。

    このとき、中間CA証明書は、サーバ証明書の後に、中間CA証明書を指定する。中間CA証明書を最初に記述すると、エラーになるので、注意が必要。

  • Let’s Encryptの証明書更新に失敗していた話

    FreeBSDでLet’s Encryptを使ってWebサーバのSSL証明書を作っている。毎回、手作業で行うのはめんどくさいので、cronで自動的に実行させていた。自動更新させていたが、ある日、証明書の有効期限が切れているとブラウザが警告してきたので、調べたところ・・・pkgのアップデートを少し前にやったときに実行ファイルのバージョン(というかファイル名)が変わっていたようで、そのため、cronは実行されるがエラーになっていた模様。ついでにもともとシンボリックリンクだったはずだが、それも消えていた。

    もともと実行していたコマンド

    /usr/local/bin/certbot renew
    

    今のコマンド

    /usr/local/bin/certbot-2.7 renew
    

    凡ミス。pkgをアップデートするときは、気をつけないといけないな。

  • ELB+ACMでSSL通信を行うときのメリット・デメリット

    AWSで、SSL通信を行う設定をすることになったので、ELB(Elastic Load Balancer)+ACM(Amazon Certificate Manager)でSSLを通信を行うときのメリット・デメリットを考えてみた。癖はあったけれど、驚くほど設定が簡単。

    デメリット

    • ELBのコストがかかる、ELBは従量課金
    • ELB経由で、アクセスするためには、ELBのアドレスをCNAMEで指定する必要がある(ELBのIPアドレスは変動するから)
    • ELBでSSL通信がオフロードされるので、アプリケーション側の対応が必要(Wordpressだと、追加設定必要だった)

    メリット

    • ELBがSSL通信の終端になる
    • ELBがSSLのオフロードをしてくれるので、EC2側のSSL設定はいらない
    • EC2にSSL設定をしないので、OpenSSLの脆弱性と闘わなくていい(アップデートの手間が軽減される)
    • Amazon発行のSSL証明書が無料で使える(ELBにはコストがかかる)
    • ELBを使用するので、スケールアウトが用意になる
    • 証明書の設定が簡単にできる(認証キーとかの知識もいらないので楽ちん)
  • SSL証明書のDV、OV、EV。

    SSL証明書の種類で、DV認証、OV認証、EV認証があるが、これが何の略なのか気になった。
    調べたので、メモとして残す。

    DV認証 = Domain Validation Certificate
    OV認証 = Organization Validated Certificate
    EV認証 = Extended Validated Certificate

    日本だと、ほぼ略称のDVやOVだらけなので。