質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Solaris

Solarisは、SunSoft社が開発・販売を行っているUnix系のOSです。Sun Microsystems社製コンピュータで動作し、またPC/AT互換機で動作するバージョンもあります。旧名称は「SunOS」ですが、現在はSolarisのカーネル部分をSunOSと呼んでいます。

Q&A

解決済

1回答

7292閲覧

シェルでGnuPGのデータ復号化を行う際にパスフレーズを手入力せずに実行したい

m_takahumi

総合スコア3

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

暗号化

ネットワークを通じてデジタルデータをやり取りする際に、第三者に解読されることのないよう、アルゴリズムを用いてデータを変換すること。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Solaris

Solarisは、SunSoft社が開発・販売を行っているUnix系のOSです。Sun Microsystems社製コンピュータで動作し、またPC/AT互換機で動作するバージョンもあります。旧名称は「SunOS」ですが、現在はSolarisのカーネル部分をSunOSと呼んでいます。

0グッド

0クリップ

投稿2021/06/11 01:27

SolarisサーバからLinuxサーバへのマイグレーションを行っており、現行サーバ化で運用しているGnuPGデータ復号化シェルの稼働検証を行っているのですが、うまくいかず困っています。
どなたかお知恵を拝借できないでしょうか。よろしくお願いいたします。

経緯

  1. 現行サーバのデータを新サーバに移管。

  (エクスポートコマンドなどは用いず、~/.gnupg/下のデータをすべてファイルとしてコピー)
0. 新サーバで基幹システムからシェルを実行したところ異常終了。
0. コマンドラインから上記コマンドを手で実行したところ、"OpenPGPの秘密鍵のロックを解除するためにパスフレーズを入力してください:"とパスフレーズの入力を求める画面が表示されたため、それが原因でシェルが異常終了していると推測。
(なおこの画面で"passphrase.txt"のパスフレーズを手入力すると復号化に成功する)
0. 上記3.でパスフレーズを手入力して復号化に成功したのち、基幹システムから2.を再度実行すると今度は正常終了する。だが、しばらく時間をあけて再度2.を実行すると再び異常終了する。以降何度実行しても同様。

前提・実現したいこと

 基幹システムからシェルを実行してGnuPGでパスフレーズを手入力せずにデータの復号化を行いたい。
gnuPGの設定の問題(秘密鍵の認証など?)なのか、Linux側の設定の問題(環境変数あたり?)なのか分からないが、まずは動くようにしたい。

発生している問題・エラーメッセージ

そもそも当初現行のシェルをそのまま実行した際には以下のようなエラーが表示された。

gpg: 2048-ビットRSA鍵, ID XXXXXXXXXXXXXXXX, 日付2009-11-25に暗号化されました "hoge <hoge@fuga.co.jp>" gpg: 公開鍵の復号に失敗しました: デバイスに対する不適切なioctlです gpg: 復号に失敗しました: 秘密鍵がありません

シェルに以下の2点を追記したところパスフレーズを手入力すれば復元には成功するようになった
(これも手探りなので、対応として正解なのか分かりませんが・・・)

  •  export GPG_TTY=$(tty) を追加
  •  復元化コマンドに"--batch "オプションを追加

※現行環境でシェル内で上記二点を宣言していないにも関わらず正常に稼働しているということも関係している?

該当のソースコード

■hoge.sh
(略)
export GPG_TTY=$(tty)
/usr/bin/gpg --passphrase-fd 0 --batch --no-tty --yes -o "out.dat" -d "in.dat" < "passphrase.txt"
(略)

試したこと

gpg-agentを再起動したが変わらず。そもそも現行Solaris環境ではgpg-agentは起動していない?ように見える
envコマンドで環境変数を表示したところ、現行環境では"GPG_TTY"は見当たらず。

補足情報(FW/ツールのバージョンなど)

 ■現行 OS:Solaris
Oracle Corporation SunOS 5.11 11.2
gpg (GnuPG) 1.4.10

 ■移行先 OS:Linux
gpg (GnuPG) 2.2.9
libgcrypt 1.8.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

SolarisサーバからLinuxサーバへのマイグレーションを行っており、現行サーバ化で運用しているGnuPGデータ復号化シェルの稼働検証を行っているのですが、うまくいかず困っています。

/usr/bin/gpg --passphrase-fd 0 --batch --no-tty --yes -o "out.dat" -d "in.dat" < "passphrase.txt"

GnuPG のバージョンが、 1.4.x から 2.2.x にバージョンアップした影響ですね。

GnuPG ドキュメント--passphrase-fd の説明に

--passphrase-fd n
Read the passphrase from le descriptor n. Only the rst line will be read from le descriptor n. If you use 0 for n, the passphrase will be read from STDIN. This can only be used if only one passphrase is supplied.

Note that since Version 2.0 this passphrase is only used if the option ‘--batch’ has also been given. Since Version 2.1 the ‘--pinentry-mode’ also needs to be set to loopback.

とあるように

2.0 以降は、 --passphrase-fd 等のコマンドラインオプションで、パスフレーズを入力している場合に --batch を指定していない場合は、パスフレーズはキー入力を求めるように変更されています。

さらに 2.1 以降の場合は、--pinentry-mode オプションの指定も必要と記載されています。

ドキュメントの記載を参考に GnuPG を呼び出す記述を変更してみてください。


一応、GnuPG 1.4.23 もまだサポートされているみたいですので、従来のシェルをそのまま動かす、一番簡単な方法は、GnuPG を 1.4.23 にダウングレードする方法かもしれません。

投稿2021/06/11 02:29

編集2021/06/11 02:29
CHERRY

総合スコア25216

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m_takahumi

2021/06/11 02:47

ご指摘いただいたようにコマンドに--pinentry-mode loopbackオプションを追加したところ正常に稼働いたしました。本当に困り果てていたため感謝してもしきれません!誠にありがとうございます!! なお補足ですが、(そもそもコマンドの中で--no-ttyオプションを入れているため)この修正に合わせてexport GPG_TTY=$(tty)の環境変数宣言を外しましたが問題なく動いたため私の場合この宣言は不要でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問