
PostgreSQL on EC2 にローカルマシンから SSL 接続してみた
今回は以下のような構成で、SSL 通信(sslmode=require)をしてみたいと思います。
ローカルPC → インターネット → EC2(パブリックIP)
なお、そもそも SSL 通信とは?については、以下3本のブログが分かりやすいのでご参照ください。
環境準備
前提として、ローカル PC では psql コマンドが使用できる状態であること、
また以下ブログなどで、パブリックサブネット配置の EC2(AL2023) に PostgreSQL はインストール済みとします。
加えて、EC2 に PostgreSQL インストール後、データベースユーザー postgres のパスワードを設定しておきます。
やり方は以下ブログの「postgres ユーザーのパスワード設定」の項目を参照してください。ALTER ROLE {role名} WITH PASSWORD {パスワード}にて設定するだけで OK です。pg_hba.conf などは現時点ではいじりません。同設定ファイルの修正は本ブログにて後述しています。
最後に、本ブログでは、PostgreSQL 17.7 を利用します。
[ec2-user@ip-10-0-13-178 ~]$ sudo -u postgres psql
psql (17.7)
Type "help" for help.
postgres=# select * from version();
version
--------------------------------------------------------------------------------------------------------------
PostgreSQL 17.7 on x86_64-amazon-linux-gnu, compiled by gcc (GCC) 11.5.0 20240719 (Red Hat 11.5.0-5), 64-bit
(1 row)
秘密鍵/公開鍵, 自己署名証明書の作成
まず EC2 に接続後、PostgreSQL サーバーが起動できているか確認します。以下の通り、Active: active (running) なので OK です。もし起動していない場合は sudo systemctl start postgresql を実行してください。
# PostgreSQL サーバーが起動しているか確認
[ec2-user@ip-10-0-13-245 ~]$ sudo systemctl status postgresql
...
Active: active (running) since Sat 2026-02-21 06:25:32 UTC; 3s ago
...
SSL 通信をするために必須となる「秘密鍵/公開鍵」「自己署名証明書(オレオレ証明書)」を作成します。
これらのコンポーネントは、openssl コマンドにて作成できます。
# EC2 インスタンスに接続後、OS ユーザー postgres に切り替え
[ec2-user@ip-10-0-13-178 ~]$ su - postgres
Password:
Last login: Sat Feb 21 06:21:32 UTC 2026 on pts/0
# PostgreSQL データディレクトリへ移動
[postgres@ip-10-0-13-178 ~]$ cd /var/lib/pgsql/data
# 移動できたか確認 -> OK
[postgres@ip-10-0-13-178 data]$ pwd
/var/lib/pgsql/data
# 証明書と秘密鍵を作成
[postgres@ip-10-0-13-178 data]$ openssl req -new -x509 -days 365 -noenc \
-out hogehoge.crt \
-keyout fugafuga.key \
-subj "/CN=HogeFuga"
..+...+++++++++++++++++++++++++++++++++++++++*...+........+.........+.....+....+..+...+
(略)
-----
# 証明書 hogehoge.crt および 秘密鍵 fugafuga.key が作成されているか確認 -> OK
[postgres@ip-10-0-13-245 data]$ ls -l
...
-rw-------. 1 postgres postgres 1704 Feb 21 06:31 fugafuga.key
...
-rw-r--r--. 1 postgres postgres 1111 Feb 21 06:31 hogehoge.crt
補足: PostgreSQL データディレクトリの確認方法
PostgreSQL データディレクトリ は以下のように確認できます。
[ec2-user@ip-10-0-13-178 ~]$ sudo -u postgres psql
psql (17.7)
Type "help" for help.
postgres=# SELECT name, setting, short_desc From pg_settings WHERE name='data_directory';
name | setting | short_desc
----------------+---------------------+-----------------------------------
data_directory | /var/lib/pgsql/`data | Sets the server's data directory.
(1 row)
openssl コマンドの各オプションについて
openssl コマンドで使用している各オプションの内容については、以下のように --help から確認すると分かりやすいため、掲載します。
以下オプションの通り、前述にて自分が実行したコマンドは認証局に CSR をリクエストせず、自己署名で X.509 形式の証明書を作成したということになります。
[postgres@ip-10-0-13-178 data]$ openssl req --help
Usage: req [options]
...
-new New request
-x509 Output an X.509 certificate structure instead of a cert request
-subj val Set or modify subject of request or cert
-days +int Number of days cert is valid for
-keyout outfile File to write private key to
-out outfile Output file
-noenc Don't encrypt private keys
上記 openssl コマンドにて、秘密鍵(fugafuga.key)と自己署名証明書(hogehoge.crt)を作成しました。
なお、コマンド実行結果として + や . の集合が表示されますが、特に気にしないで大丈夫です。(調べましたが、良い説明やドキュメントは見つかりませんでした。汗)
ただ、実行結果に明らかなエラーがなく、 かつ秘密鍵と証明書ファイルができていれば特に問題ないので気にしないで進みます。
なお公開鍵は、以下の通り証明書に含まれています。
これで SSL 通信に必要な「公開鍵/秘密鍵, 証明書」の 3 つの要素が作成できました。
# 証明書の中身を表示
[postgres@ip-10-0-13-245 data]$ openssl x509 -in hogehoge.crt -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
0e:96:b6:...
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN=HogeFuga
Validity
Not Before: Feb 21 06:31:45 2026 GMT
Not After : Feb 21 06:31:45 2027 GMT
Subject: CN=HogeFuga
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:93:0e:1c:46:... <- これが公開鍵
Exponent: 65537 (0x10001)
...
postgresql.conf の変更
続いて、前項で作成した秘密鍵および証明書ファイルを PostgreSQL サーバーに認識させるために、設定ファイルである postgresql.conf の編集を行います。
PostgreSQL にて SSL 接続を行うには ssl パラメータを on にし、ssl_cert_file と ssl_key_file に証明書と秘密鍵を指定する必要があります。
詳細は下記ドキュメントを参照ください。
ssl (boolean)
SSLによる接続を有効にします。 このパラメータは、postgresql.confファイルか、サーバのコマンドラインでのみ設定可能です。 デフォルトはoffです。
...
ssl_cert_file (string)
SSLサーバ証明書が入っているファイル名を設定します。...
...
ssl_key_file (string)
SSLサーバの秘密鍵が入っているファイル名を設定します。 ...https://www.postgresql.jp/document/17/html/runtime-config-connection.html#GUC-SSL
また PostgreSQL サーバーがローカル PC からの外部接続を受け入れるため、ホスト(今回で言うと EC2 インスタンス)のどのネットワークインターフェースから外部接続を受け入れるのかも指定が必要です。
こちらの設定は、listen_addresses パラメータで可能です。同パラメータについては以下の過去ブログを参照ください。
前提として listen_addresses とは、PostgreSQL サーバーがホスト(今回で言うと EC2 インスタンス)のどのネットワークインターフェースからの接続を受け付けるのかを決める設定です。
...
本ブログにて後述のおまけの部分で listen_addresses を EC2 のプライベート IP を指定した上での動作確認もしているので理解の助けになれば幸いです。
そのため今回変更するパラメータは 4 つになります。
今回は分かりやすく listen_addresses は利用可能な全てのネットワークインターフェースを示す * を指定しました。
========= 変更前 =========
#ssl = off
#ssl_cert_file = 'server.crt'
#ssl_key_file = 'server.key'
(略)
#listen_addresses = 'localhost'
========= 変更後 =========
ssl = on
ssl_cert_file = 'hogehoge.crt'
ssl_key_file = 'fugafuga.key'
(略)
listen_addresses = '*'
vim で実際に編集します。これで postgresql.conf ファイルの修正は完了です。
# vim で 設定ファイルを編集
[postgres@ip-10-0-13-178 data]$ vi /var/lib/pgsql/data/postgresql.conf
=== (補足) vimの使い方 ここから ===
vimでファイル開いたら /{文字列} で {文字列} パラメータを検索
i キー: 編集モード(INSERT)に入る。パラメータを変更
Esc キー: 編集モードを抜ける
:wq + Enter: 保存して終了
もしミスったりしたら、以下
:q! + Enter: 保存せずに終了
=== (補足) vimの使い方 ここまで ===
# 各種 SSL パラメータが変更およびコメント解除されているか確認 -> OK
[postgres@ip-10-0-13-178 data]$ grep "^ssl" postgresql.conf
ssl = on
ssl_cert_file = 'hogehoge.crt'
ssl_key_file = 'fugafuga.key'
# listen_addresses が変更およびコメント解除されているか確認 -> OK
[postgres@ip-10-0-13-178 data]$ grep "listen_addresses" postgresql.conf
listen_addresses = '*' # what IP address(es) to listen on;
pg_hba.conf の変更
前項にて、SSL 関連パラメータを修正し、さらに listen_addresses='*' にすることで「EC2 インスタンスのどのネットワークインタフェースから PostgreSQL サーバーへの接続を受け入れるのか」を設定しました。
一方で、「どこからのクライアント接続を許可するのか」についての設定はまだできていないので、pg_hba.conf にてそれを設定していきます。
こちらの設定は、pg_hba.conf に以下の一行を加えれば OK です。
# SSL connections from remote hosts
hostssl all all <ローカル PC の IP>/32 scram-sha-256
上記は、ローカル PC の IP アドレスからの SSL 接続(hostssl)を許可するという意味になります。
なお、hostssl オプションについては以下を参照ください。
hostssl
このレコードは、接続がSSLで暗号化されている場合にのみTCP/IPネットワークを使用する接続に対応します。
このオプションを使用するためには、サーバはSSLサポートができるように構築されていなければいけません。https://www.postgresql.jp/document/17/html/auth-pg-hba-conf.html
vim で pg_hba.conf ファイルを編集し、保存します。
# 設定ファイルを編集
[postgres@ip-10-0-13-178 data]$ vi pg_hba.conf
===ファイル末尾に以下内容を追記 ===
# SSL connections from remote hosts
hostssl all all <ローカル PC の IP>/32 scram-sha-256
===============================
# 変更できたか確認 -> OK
[postgres@ip-10-0-13-178 data]$ cat pg_hba.conf
...
# TYPE DATABASE USER ADDRESS METHOD
...
# SSL connections from remote hosts
hostssl all all <ローカル PC の IP>/32 scram-sha-256
追記した設定の意味はざっくり以下になります。
ローカル PC から(<ローカル PC の IP>/32)
SSL接続で(hostssl)
全てのデータベース(all)に
全てのユーザー(all)が
パスワード認証(scram-sha-256)で
接続できる
postgresql を再起動
これまで設定ファイルにて変更してきた内容を PostgreSQL サーバーに反映させるために、再起動をかけます。
# postgresユーザーから抜ける
[postgres@ip-10-0-13-178 data]$ exit
logout
# postgresユーザーから抜けた状態で、PostgreSQl サーバーの再起動
[ec2-user@ip-10-0-13-178 ~]$ sudo systemctl restart postgresql
EC2 のセキュリティグループの変更
ローカル PC から EC2 インスタンスへの接続を受け入れるため、EC2 のセキュリティグループにて 5432 ポートのインバウンドルールを追加します。
ソースはローカル PC の IP アドレスを設定しています。

動作確認
設定が全て完了したので、ローカル PC から EC2 に向けて sslmode=require (SSL 必須)で psql 接続してみます。うまくいきました。
% psql "host=<EC2 パブリック IP> port=5432 dbname=postgres user=postgres sslmode=require"
Password for user postgres:
psql (14.12 (Homebrew), server 17.7)
WARNING: psql major version 14, server major version 17.
Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
postgres=#
続いて、sslmode=disable(SSL を使用しないモード)で同じコマンドをやってみます。
こちらは接続が失敗しましたね。想定通りです。
% psql "host=<EC2 パブリック IP> port=5432 dbname=postgres user=postgres sslmode=disable"
psql: error: connection to server at "<EC2 パブリック IP>", port 5432 failed: FATAL: no pg_hba.conf entry for host "<EC2 パブリック IP>", user "postgres", database "postgres", no encryption
終わりに
今回は、ローカル PC から EC2 の PostgreSQL に対し、SSL 接続をやってみました。自己署名証明書の作成や sslmode の違いなど、触ってみてわかる設定などが多く、とても勉強になりました。本ブログが SSL をやってみたいという方のお役に立てば幸いです。
参考情報







