One IT Thing

IT業界で飯を食う為の学習系雑記

PostgreSQL プチハマリ解決日記

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, プチハマリ解決日記
-,

執筆者:

関連記事

PostgreSQL11に一般ユーザ権限でサンプルDB「dvdrental」をpg_restore

データベースインストール後にサンプルデータを投入することで、DBをバックエンドにして動作する他ミドルの検証が楽になったりすることがあります。 それぞれのデータベースで代表的なサンプルデータセットの存在 …

adb devicesコマンドでAndroid端末を認識しない

目次1 事象2 原因3 解決 事象 USB接続するAndroidによって以下のエラーが出たりします。 C:\src\ionic\awsomeapp>adb devices List of dev …

「Jailer Database Tool」でDB関連作業を効率化

開発時のデータベースクライアントは何を使っていますか?A5? 「Jailer Database Tool」を使っていないなら、普段使いツールに加えるとちょっとデータベースの見え方が変わるかも知れません …

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

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

pgcryptoの有効化と共通鍵暗号の動作確認

PostgreSQLで「pgcrypto」拡張機能を有効にすると、PostgreSQLに保存するデータを暗号化出来るようになります。 INSERTする際、共通鍵暗号はpgp_sym_encrypt関数 …

 

sin7k24
 

東京在勤、職歴20年越え中年ITエンジニアです。まだ開発現場で頑張っています。

19歳(1996年)から書き始めた個人日記が5,000日を超え、残りの人生は発信をして行きたいと思い、令和元日からこのサイトを開始しました。勉強と試行錯誤をしながら、自分が経験したIT関連情報を投稿しています。

私と同じく、今後IT業界で生計を立てて行きたいと考えている方や、技術共有したいけどフリーランスで孤独、といった方と一緒に成長、知識共有して行けたら楽しいな、と思っています。