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

執筆者:

関連記事

java.security.InvalidKeyException: IOException : DerInputStream.getLength(): lengthTag=111, too big.

目次1 事象2 原因3 対処4 得た教訓 事象 OpenSSLで作成した秘密鍵をJava(Eclipse + Maven環境)で読み込み、公開鍵で暗号化されたデータを復号しようとした際に記事名の例外が …

nvm-windows1.1.6でNode.jsを入れようとするとnpmコマンドのインストールがエラーになる

目次1 事象2 原因3 対処4 まとめ 事象 Win10、nvm-windows 1.1.6環境下でNode.js 10.16.0を入れようとした際に以下のエラーが発生。 C:\src\js\angu …

pgcryptoで公開鍵暗号の動作確認

共通鍵暗号で暗号化されたデータはパスワードが漏洩すると復号される危険が高まるのに対し、公開鍵暗号で暗号化されたデータは秘密鍵とパスワードの二つが漏洩しないと復号できません。 APサーバとDBサーバ通信 …

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

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

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

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

 

shingo.7k24
 

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

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

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