PostgreSQL trouble shooting

ERROR: Several keys given – pgcrypto does not handle keyring、またはERROR: Corrupt ascii-armor

投稿日:2019年9月24日

gpgキーストアに同じUIDで複数の鍵ペアを登録してしまうと、ファイルにexportした際に1ファイルに複数の鍵情報が入ってしまい、1ファイル1鍵を期待しているpgcryptoに怒られます。

事象

gpgで作った鍵ペアをエクスポートしてpgcryptoで使おうとして発生。cryptoテーブルのpubkeyカラムにはgpgで作った公開鍵をバイナリで入れている状態。

postgres=# select pgp_pub_encrypt('平文', (SELECT pubkey FROM crypto));
ERROR:  Several keys given - pgcrypto does not handle keyring

Ascii Armorテキストでデータ登録し直し、dearmorしようとしても以下のエラーが発生。

postgres=# select dearmor((SELECT pubkey FROM crypto));
ERROR:  Corrupt ascii-armor

原因

gpgキーストアに同じuidで複数の鍵ペアを登録してしまった為。
gpg –gen-keyを同じ内容で繰り返すとキーストアはこんな状態。
「postgres」 UIDで鍵ペアが重複登録されています。

// 秘密鍵リングの一覧を表示
-bash-4.2$ gpg -K
/var/lib/pgsql/.gnupg/secring.gpg
---------------------------------
sec   2048R/45019AF0 2019-09-23
uid                  postgres <postgres@localhost>
ssb   2048R/D8BE7B5D 2019-09-23

sec   2048R/224F2773 2019-09-23
uid                  postgres <postgres@localhost>
ssb   2048R/3E1F48ED 2019-09-23

-k(小文字)オプションで公開鍵リングを見ても同じ状態。

この状態だと「gpg -a -o public.key –export UID」などで吐かれるファイルに複数の鍵情報が入ってしまい、dearmor関数やpg_pub_encrypt関数が正常に動かない。

対処

片方の鍵ペアを削除してexportで1ファイル分の情報しかエクスポートされないようにする。

秘密鍵を一個削除。

-bash-4.2$ gpg --delete-secret-keys postgres
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


sec  2048R/45019AF0 2019-09-23 postgres <postgres@localhost>

この鍵を鍵リングから削除しますか? (y/N) Y
これは秘密鍵です! 本当に削除しますか? (y/N) Y

公開鍵を一個削除。

-bash-4.2$ gpg --delete-keys postgres
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


pub  2048R/45019AF0 2019-09-23 postgres <postgres@localhost>

この鍵を鍵リングから削除しますか? (y/N) Y

「postgres」UIDの鍵ペアが1個しかない状態でexportし、PostgreSQLテーブルカラムにインポートするなり、pg_read_file()して使うなりすれば掲題のエラーは回避可能です。

私のようにとっちらかって同じ内容のgpg –gen-keyをしてしまい、上手くエクスポート出来なくなった時はgpg -Kしてみるといいかも知れません。

-PostgreSQL, trouble shooting
-,

執筆者:

関連記事

キャッシュされているはずのServiceWorker資源にオフラインアクセス出来ない(Workbox + ionicons)

そのHTTPリクエストしたファイル資源、ひょっとしてURLパラメータついてたりしませんか? 目次1 事象2 原因3 対処 事象 ionic3(SPA)でWorkboxを使ったServiceWorker …

Angular11から12にアップデートしたらng serveがproductionモードで起動するようになってしまう

既存のAngular11のプロジェクトを12に上げた際に発生。 目次1 環境2 事象3 原因4 対処5 根本原因6 まとめ 環境 Windows 11Node.js 14.15.1Angular13リ …

開発用PostgreSQLをインストールした後の外部接続、ユーザ作成、認証周りの設定

ローカル開発用にPostgreSQLを入れた後、開発や分析をし易くする為に外部ホストからパスワード付き接続出来るようにしていきます。 また、postgresスーパーユーザは権限が強すぎて開発アプリから …

Angularのテンプレート評価式にビット演算を使うとTemplate parse errorが発生する

AngularのテンプレートHTMLでビット演算をすることは禁じられているので代替手段を考えます。 目次1 事象2 原因3 対処 事象 CSSクラスをビット演算で切り替えるテンプレートを書きました。c …

開発用PostgreSQLをCentOSにインストールしてSQLを流すまで

開発や勉強に使う為のPostgreSQLをCentOSにインストールします。 インストールから基本操作を体験して、0からデータベースを構築する経験を積んでおきます。 目次1 環境2 インストール手順を …

 

shingo.nakanishi
 

東京在勤、1977年生まれ、IT職歴2n年、生涯技術者として楽しく生きることを目指しています。デスマに負けず健康第一。