Managing SSL certificates
=========================

PEMはSSL証明書を使用します。

- ユーザーインターフェイスとREST APIを提供する :ref:`Webサーバー証明書 <Webサーバー証明書>` 
  への要求を保護するため。

- :ref:`PEMバックエンドデータベースサーバーとエージェントの接続証明書 <PEMバックエンドデータベースサーバーとエージェントの接続証明書>` を保護および認証するため。

Webサーバー証明書
-----------------

PEMは、初期構成中にWebサーバーのSSL証明書とキーファイルを生成します。証明書は自己署名であるため、ユーザーがブラウザーでPEM
WebアプリケーションのURLを開くと、サイトが安全でないことを示す警告が表示されます。

セキュリティを強化し、この警告を削除するには、自己署名SSL証明書を、信頼できる認証局によって署名された証明書に置き換えることができます。

Webサーバー証明書NGINXの置き換え
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

NGINXで独自のSSL証明書を使用するには、構成ファイルを更新します。

- RHEL同様のシステムの場合 ``/etc/nginx/conf.d/edb-pem.conf``

- Debian系システムの場合 ``/etc/nginx/sites-available/edb-pem.conf``

証明書ファイルと一致するように、構成ファイルのサーバー名とファイルパスを変更します。

.. code:: text

   server {
      # lines omitted here
      server_name  <yourdomain.com>;
      # lines omitted here
   }

   server {
      # lines omitted here
      server_name  <yourdomain.com>;

      ssl_certificate /path/to/your_domain_name.crt
      ssl_certificate_key /path/to/your_private.key
      # lines omitted here
   }

Webサーバー証明書の置き換えApache HTTPD
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Apache HTTPDで独自のSSL証明書を使用するには、構成ファイル
``edb-ssl-pem.conf``
を更新します。証明書ファイルと一致するように、構成ファイルのサーバー名とファイルパスを変更します。

.. code:: shell

   ServerName yourdomain.com

   #  lines omitted here

   SSLCertificateFile /path/to/your_domain_name.crt
   SSLCertificateKeyFile /path/to/your_private.key

..  Note "Example"::
   実際の例については、 `Replacing httpd self-signed SSL certificates <https://www.enterprisedb.com/postgres-tutorials/how-replacing-httpd-self-signed-ssl-certificates-trusted-ca-signed-certificates>`_ を参照してください。

PEMバックエンドデータベースサーバーとエージェントの接続証明書
-------------------------------------------------------------

PEMは、PEMエージェントとバックエンドデータベース間に安全なSSL/TLS接続を実装します。
各エージェントには、サーバーとの通信の暗号化と、パスワードの代わりにサーバーでの認証の両方に使用されるSSL証明書があります。

PEMはsslutils拡張機能を使用して、PEMサーバーがSSL証明書とキーを生成および署名できるようにします。新しいエージェントが登録されると、PEMサーバーは証明書を発行します。
PEMサーバーによって発行された証明書はPEMサーバーによって署名されます。つまり、PEMサーバーが認証局CAとして機能することを意味します。

このアプローチが適切でない場合は、PEMの外部で生成され、信頼できるCAによって署名されたSSL証明書とキーを使用できます。
詳細については、 :ref:`信頼できるCAによって署名された証明書とキーを使用する <信頼できるCAによって署名された証明書とキーを使用する>` を参照してください。

PEMサーバー上の証明書とキーファイル
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

PEMサーバーの初期構成中に、次のファイルがPEMサーバーのPostgresデータディレクトリに生成されます。

- ``ca_certificate.crt``

- ``ca_key.key``

- ``root.crt``

- ``root.crl``

- ``server.crt``

- ``server.key``

``ca_certificate.crt`` および\ ``ca_key.key``
ファイルは、PEMサーバーがエージェント登録中にエージェントに対して生成された証明書に署名するために使用されます。これらは\ ``server.crt``
の署名にも使用されます。手動で置き換えない限り、
’ca_certificate.crt’ファイルはルートCAとして機能するため、自己署名証明書です。

``root.crt`` ファイルは、\ ``ca_certificate.crt`` ファイルのコピーです。
``postgresql.conf`` ファイルの\ ``ssl_ca_file``
パラメーターは、このファイルをポイントしています。

``root.crl``
は、実際の有効期限または割り当てられた有効期限の前に発行CAによって失効された証明書の証明書失効リストCRLです。
``postgresql.conf`` ファイルの\ ``ssl_crl_file``
パラメーターは、このファイルをポイントしています。

``server.crt`` ファイルはPEMサーバーの署名された証明書であり、
``server.key`` ファイルは証明書のプライベートキーです。
``postgresql.conf`` ファイルの\ ``ssl_cert_file``
パラメーターは、このファイルをポイントしています。

これらのファイルは、有効期限が近づくと自動的に更新されます。
:ref:`PEM証明書の更新 <PEM証明書の更新>` を参照してください。

PEMエージェントの証明書とキーファイル
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

各エージェントのSSL証明書とキーは、 :ref:`Registering a PEM agent <Registering a PEM agent>` 中に生成されます。
PEMエージェントは、libpqインターフェイスを使用してPEMバックエンドデータベースサーバーに接続し、バックエンドデータベースサーバーのクライアントとして機能します。
PEMエージェントは、\ ``cert``
認証方法を使用し、sslを有効にしてサーバーに接続します。これは、接続がエージェントのキーを使用して暗号化され、パスワードなどの代わりにエージェントの証明書を使用して認証されることを意味します。

各エージェントには一意の識別子があり、エージェントの証明書とキーには対応する識別子があります。

必要に応じて、エージェントごとに1つの証明書を使用するのではなく、すべてのエージェントに同じ証明書を使用できます。詳細については、
:ref:`共通エージェント証明書とキーペアを生成する <共通エージェント証明書とキーペアを生成する>` を参照してください。

SSL証明書を使用してPostgresで接続する方法の詳細については、
Postgresドキュメントの `Securing TCP/IP connections with SSL <https://www.postgresql.org/docs/current/ssl-tcp.html>`_ を参照してください。

PEM証明書の更新
^^^^^^^^^^^^^^^

SSL証明書には有効期限があります。
PEMによって生成された証明書とキーを使用している場合、PEMは有効期限が前にそれらを置き換えます。
PEMサーバーと共にインストールされるPEMエージェントは、\ ``ca_certificate.crt``
ファイルの有効期限を監視します。証明書の有効期限が間もなくエキスパイアと、PEMは次のことを行います。

- 既存の証明書ファイルのバックアップを作成します。

- 新しい証明書ファイルを作成し、新しいCA証明書ファイルをPEMサーバー上の\ ``root.crt``
  ファイルに追加します。

- アクティブなエージェントの証明書ファイルを更新するジョブを作成します。

- PEMサーバーを再起動します。

..  Important::
   独自の証明書を提供するか、すべてのエージェントに単一の証明書を使用する場合、自動更新ジョブを無効にします。 PEMサーバーで、次のSQLを実行します。

.. code:: sql

   UPDATE pem.job 
   SET jobenabled=false 
   WHERE jobname = Check CA certificate expiry;

.. ::
   サーバーまたはエージェントの証明書を手動で再生成する必要がある場合は、以下を参照してください。 - :ref:`Regenerating the server SSL certificates <Regenerating the server SSL certificates>` 

- :ref:`Regenerating the agent SSL certificates <Regenerating the agent SSL certificates>` 

共通エージェント証明書とキーペアを生成する
------------------------------------------

エージェントごとに1ユーザーデフォルトではなく、すべてのPEMエージェントに単一のPostgresユーザーを作成して使用することにより、すべてのエージェントに同じ証明書を使用できます。

ユーザーを作成し、エージェント証明書とキーペアを生成し、すべてのPEMエージェントにそれらを使用します。

1. PEMバックエンドデータベースに1つの共通エージェントユーザーを作成します。ユーザーにpem_agentロールを付与します。

.. code:: shell

      # Running as enterprisedb
      psql -p 5444 -U enterprisedb -d pem
      CREATE USER pem_agent_common_user;
      GRANT pem_agent TO pem_agent_common_user;

1. エージェントキーを生成します。

.. code:: shell

      # Running as root
      openssl genrsa -out agent.key 4096 

1. エージェントのCSRを生成します。

.. code:: shell

      openssl req -new -key agent.key -out agent.csr -subj /C=IN/ST=MH/L=Pune/O=PEM/CN=<agent_user>

``-subj`` は、要件に従って提供されます。

1. ``openssl x509``
   コマンドを使用してCSRに署名し、エージェント証明書を生成します。

.. code:: shell

      openssl x509 -req -days 365 -in agent.csr -CA ca_certificate.crt -CAkey ca_key.key -CAcreateserial -out agent.crt

1. ``agent.crt`` および\ ``agent.key``
   ファイルのアクセス許可を変更します。

.. code:: shell

      chmod 600 agent.crt agent.key

1. 次のエージェント証明書とキーペアを使用します。

- 新しいPEMエージェントをリモートホストからPEMサーバーに登録するため。

a.エージェント証明書とキーペアをリモートエージェントホストにコピーし、エージェントを登録します。

.. code:: shell

           export PEM_SERVER_PASSWORD=edb

           /usr/edb/pem/agent/bin/pemworker --register-agent \
           --pem-server 192.168.99.130 \
           --pem-user enterprisedb \
           --pem-port 5444 \
           --pem-agent-user pem_agent_common_user \
           -o agent_ssl_crt= agent.crt \
           -o agent_ssl_key= agent.key

b. pemagentサービスを有効にして開始します。

.. code:: shell

           systemctl enable pemagent
           systemctl start pemagent

- エージェント証明書とキーペアを登録済みのエージェントに置き換えます。
  a.エージェントホストの\ ``agent.cfg`` ファイルの\ ``agent_user``
  、\ ``agent_ssl_key`` 、および\ ``agent_ssl_crt``
  パラメーターを編集します。

.. code:: shell

           vi /usr/edb/pem/agent/etc/agent.cfg
           # Edit the agent username
           agent_user=pem_agent_common_user
           # Edit the ssl parameters with new certificate and key file location
           agent_ssl_key=<new_location>/agent.key
           agent_ssl_crt=<new_location>/agent.crt

b. pemagentサービスを再起動します。

.. code:: shell

           systemctl restart pemagent

信頼できるCAによって署名された証明書とキーを使用する
----------------------------------------------------

PEM
SSL証明書とキーを、信頼できるCAによって署名された証明書とキーに置き換えることができます。

信頼できるCA証明書とキーを取得した後、
:ref:`サーバーSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。 <サーバーSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。>` および :ref:`エージェントSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。 <エージェントSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。>` 証明書とキーを置き換えます。

サーバーSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

1. 古いサーバー証明書とキーファイルをバックアップします。

.. code:: shell

      # Running as root
      mkdir /var/lib/edb/as<x>/data/certs
      cd /var/lib/edb/as<x>/data/
      mv server. *root.*  ca_* /var/lib/edb/as<x>/data/certs

1. サーバーのプライベートキーを生成します。

.. code:: shell

      openssl genrsa -out server.key 4096 

1. サーバーのCSRを生成します。

.. code:: shell

      openssl req -new -key server.key -out server.csr -subj /C=IN/ST=MH/L=Pune/O=EDB/CN=PEM

``-subj`` は、要件に従って提供されます。 ``CN``
には、PEMサーバーホストのホスト名またはドメイン修飾フルネームを使用することをお勧めします。

1. 信頼できるCAからCA証明書 ``trusted_ca.crt`` を取得します。

2. CAにCSRに署名し、サーバー証明書を生成するように依頼します。

3. 新しいサーバー証明書の詳細が改ざんされていないこと、指定された詳細と一致することを確認します。

.. code:: shell

      openssl x509 -noout -text -in server.crt

1. CAから取得した新しい証明書を\ ``root.crt`` ファイルとして使用します。

.. code:: shell

      cp trusted_ca.crt root.crt

1. 信頼できるCAがCRLを提供しない場合、サーバーによるCRLの使用を無効にします。
   CRLの使用を無効にするには、 ``postgresql.conf``
   ファイルの\ ``ssl_crl_file`` パラメーターをコメント化します。

..  Note::
   以前のCAからのCRLをそのままにして、`ssl_crl_file` をコメントアウトしない場合、サーバーは起動します。ただし、認証はSSLエラーメッセージ`tlsv1 alert unknown ca` で失敗します。エラーは、CRLが原因であることを指定していないため、この問題はコンテキスト外で発生した場合、デバッグが難しい場合があります。

1. 新しい\ ``root.crt`` 、\ ``server.key`` 、および\ ``server.crt``
   ファイルをバックエンドデータベースサーバーのデータディレクトリにコピーします。

.. code:: shell

      cp root.crt server.key server.crt /var/lib/edb/as<x>/data

1. 新しい証明書とキーファイルの所有者と権限をデータディレクトリと同じ名前に変更します。

.. code:: shell

      cd /var/lib/edb/as<x>/data/
      chown enterprisedb server.* root.crt ca_certificate.crt
      chmod 600 server.* root.crt ca_certificate.crt

..  Note::
   今はPEMサーバーを再起動しないでください。 PEMサーバーを再起動すると、登録されているすべてのエージェントが動作を停止します。

1. 各PEMエージェントのSSL証明書を、信頼できるCA証明書に置き換えます。詳細については、これらの
   :ref:`エージェントSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。 <エージェントSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。>`  を参照してください。

2. PEMバックエンドデータベースサーバーを再起動します。

エージェントSSL証明書を、信頼できるCAによって署名された証明書に置き換えます。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

サーバー証明書\ ``server.crt`` および\ ``server.key``
とCA証明書\ ``root.crt``
を置き換えた後にのみ、エージェントSSL証明書を置き換えます。

1. psqlを使用して、SSL証明書の置き換えに必要なすべてのエージェント識別子IDを見つけます。

.. code:: shell

      psql -U enterprisedb -d pem --no-psqlrc -t -A -c "SELECT id FROM pem.agent WHERE active=true"

1. 2.キーファイルを必要とするエージェントを特定した後、各エージェントに対して\ ``agent<ID>.key``
   を生成します。

.. code:: shell

      openssl genrsa -out agent<ID>.key 4096 

``<ID>`` はエージェント識別子です。

1. 各エージェントのCSRを生成します。

.. code:: shell

      openssl req -new -key agent<ID>.key -out agent<ID>.csr -subj /C=IN/ST=MH/L=Pune/O=PEM/CN=agent<ID>

``-subj`` は、要件に従って提供されます。 ``CN`` の\ ``<ID>``
を適切なエージェント識別子に置き換えます。

..  Note::
   エージェントごとに1つではなく、すべてのPEMエージェントに単一の証明書を使用する場合、共通のPostgresユーザーを作成し、 `ID` の代わりにこのユーザー名を指定します。 :ref:`共通エージェント証明書とキーペアを生成する <共通エージェント証明書とキーペアを生成する>` を参照してください。

1. CAにCSRに署名し、エージェント証明書を生成するように依頼します。

2. 各ホストに証明書とキーファイルをコピーします。ここで、 ``<ID>``
   は、\ ``/usr/edb/pem/agent/etc/agent.cfg`` ファイルの\ ``agent_id``
   と一致します。

3. 新しい\ ``agent<ID>.crt`` および\ ``agent<ID>.key``
   ファイルの所有権と権限を変更します。

.. code:: shell

       chown root agent<ID>.crt agent<ID>.key
       chmod 600 agent<ID>.crt agent<ID>.key

1. 古いエージェント証明書とキーファイルをバックアップします。

.. code:: shell

      # Running as root
      mkdir root/.pem/certs
      mv root/.pem/agent<ID>.* root/.pem/certs

1. 各エージェントの証明書とキーファイルを、新しく生成されたファイルに置き換えます。

.. code:: shell

      cp agent<ID>.key agent<ID>.crt root/.pem

7. PEMエージェントサービスを再起動します。

- Linuxの場合

.. code:: shell

      # Running as root
      systemctl restart pemagent

- Windowsの場合
  サービスアプレットを使用してPEMエージェントを再起動します。
  PEMエージェントサービスの名前はPostgres Enterprise Manager Agentです。
  [ Services ]ダイアログボックスでサービス名を選択し、[ **Restart the
  service** ]を選択します。

..  Note::
   前述のプロセスに従って登録されたエージェントの場合、 `Providing an existing SSL certificate and key <https://www.enterprisedb.com/docs/pem/latest/registering_agent/#providing-an-existing-ssl-certificate-and-key>`_ に示すように、登録時にエージェントに証明書を提供できます。

!!!note 新しいエージェント証明書にパスフレーズが必要な場合、
``agent_ssl_passphrase_script``
パラメーターを使用してパスフレーズを返すスクリプトへのパスを指定します。パラメーターの詳細については、
:ref:`Modifying agent configuration <Modifying agent configuration>` を参照してください。

証明書のテスト
--------------

認証の問題が発生した場合は、これらのテストを使用して証明書を検証できます。

ルート証明書と照合して証明書を検証する
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

サーバーの\ ``root.crt``
に従ってPEMエージェント証明書が信頼されるかどうかを確認するには、両方の証明書を同じマシンにコピーします。次に、次のコマンドを実行します。

.. code:: shell

   openssl verify -verbose -CAfile root.crt  agent1.crt

このコマンドは、成功した場合は\ ``agent1.crt: OK``
、失敗した場合は説明メッセージを返します。

PEMバックエンドデータベースへのテスト接続を作成する
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

エージェントユーザーが証明書を使用して接続できるかどうかを確認するには、エージェントが存在するサーバーのrootとして、次のコマンドを実行します。

.. code:: shell

   PGHOST=<pem_host>
   PGPORT=<pem_db_port>
   PGUSER=agent<ID>
   PGSSLCERT=/root/.pem/agent<ID>.crt
   PGSSLKEY=/root/.pem/agent<ID>.key
   PGSSLMODE=require

   export PGHOST PGPORT PGUSER PGSSLCERT PGSSLKEY PGSSLMODE

   <psql_path> -A -t -c "SELECT version()"

そこで

- ``<psql_path>`` は、 psql実行可能ファイル、たとえば
  ``/usr/edb/as15/bin/psql`` へのフルパスです。

- ``<pem_host>`` は、PEMサーバーのホスト名またはIPアドレスです。

- ``<pem_db_port>`` は、PEMバックエンドデータベースサーバーポートです。

- ``<ID>``
  は、テストするエージェントのIDです。\ ``/usr/edb/pem/agent/etc/agent.cfg``
  ファイルで定義されています。

..  Note::
   :ref:`共通エージェント証明書とキーペアを生成する <共通エージェント証明書とキーペアを生成する>` の指示を使用した場合、 `PGUSER` を共通エージェントのユーザー名に設定する必要があります。

接続が成功すると、データベースサーバーのPostgresバージョンを結果ます。成功は、証明書が有効で、Postgresユーザーが正しく構成されていることを意味します。

.. toctree::
  :maxdepth: 3

  Administering--certificates--replacing_ssl_certificates
  Administering--certificates--regenerating_agent_certificates
