gpg无需键盘交互即可加密文件


84

我正在crontab中运行下一个命令来加密文件,并且我不想键盘交互

echo "PASSPHRASE" | gpg --passphrase-fd 0 -r USER --encrypt FILENAME.TXT

但是我有这个答案:

gpg: C042XXXX: There is no assurance this key belongs to the named user

pub  40XXX/C042XXXX 2012-01-11 Name LastName. (comment) <user@email.com>
 Primary key fingerprint: XXXX XXXX XXXX XXXX XXXX  XXXX XXXX XXXX XXXX XXXX
      Subkey fingerprint: XXXX XXXX XXXX XXXX XXXX  XXXX XXXX XXXX XXXX XXXX

It is NOT certain that the key belongs to the person named
in the user ID.  If you *really* know what you are doing,
you may answer the next question with yes.

Use this key anyway? (y/N) 

由于--passphrase-fd仅读取第一行...如果运行,会发生什么echo -e "PASSPHRASE" "\nyes" | gpg --passphrase-fd 0 -r USER --encrypt FILENAME.TXT
大卫·科斯塔

手册页有人吗?--batch--yes
u0b34a0f6ae

Answers:


76

正如David暗示的那样,这里的问题是gpg不信任您用来加密的公钥。您可以按照他的解释签名。

另一种选择-特别是如果密钥可能偶尔更改-将继续执行--trust-model alwaysgpg命令。

这是手册页中的相关内容:

--trust-model pgp|classic|direct|always|auto

     Set what trust model GnuPG should follow. The models are:

     pgp    This is the Web of Trust combined with trust signatures as used in
            PGP 5.x and later. This is the default trust model when creating a
            new trust database.

     classic
            This is the standard Web of Trust as used in PGP 2.x and earlier.

     direct Key validity is set directly by the user and  not  calculated  via
            the Web of Trust.

     always Skip  key  validation  and  assume that used keys are always fully
            trusted. You generally won't use this unless you  are  using  some
            external  validation  scheme.  This  option  also  suppresses  the
            "[uncertain]" tag printed with signature checks when there  is  no
            evidence that the user ID is bound to the key.

     auto   Select  the  trust  model depending on whatever the internal trust
            database says. This is  the  default  model  if  such  a  database
            already exists.

不明白为什么系统认为那是代码。我点击了报价;不是代码。编辑时,它仅显示为引用(没有颜色)。奇怪的。
rsaw 2012年

4
这是因为文本使用空格对齐。
托马什Fejfar

这对我来说是正确的答案!谢谢
eigenfield '18

46

这是我基于gpg2的解决方案(但我敢打赌,您可以对gpg应用类似的技术)

$ gpg2 --edit-key {recipient email address}  
> trust
> 5 (select 5 if you ultimately trust the key) 
> save

这将告诉gpg2完全信任密钥,以便您无需提示即可进行加密


1
这将立即更新trust-db,并且不需要保存。
车道

12
这将设置所有者信任而不是密钥有效性。最终信任仅适用于您自己的密钥。即,最终信任身份签名的所有内容均由您自己签名处理。因此,如果这不是您的关键,请不要将信任设置为终极。问题是密钥有效性。要解决/解决此问题,您应该签署密钥。(考虑本地唯一的签名和指纹验证)
x53914年

3
x539是正确的。在gpg2 --edit-key <key-id>你做完lsignsave。我认为信任5是对此的错误用法(被误解了),并且(对于我来说)它甚至无效(无用),因为x539告诉了我。
n611x007'1

请注意,这也适用于普通模式gpg,不仅适用于gpg2:)
Markus

10

骇客方法:

echo -n PASSPHRASE > phrase
chmod 400 phrase #Make sure ONLY the user running the cron job can read the phrase
yes | gpg --passphrase-fd 3 --recipient USER --encrypt FILENAME.txt 3<phrase

潜在的问题是您对USER的密钥未签名。如果您信任它,可以使用

gpg --edit-key USER sign

根据您的配置,它可能会问几个问题。这样做一次,那么进入crontab应该很好。我仍然建议使用我提出的解决方案,将密码短语放在一个单独的文件中,并使该密码只能由命令运行时所在的一个用户读取。如果这样做,您可以杀死yes |,而只有加密行。


1
我尝试了签名密钥方法,均为gpg2 --edit-key USER签名,现在它显示它已签名,但仍然信任:未知。并且该批次仍将不运行而没有提示
nycynik 2012年

2
我认为lsign这是一个更好的主意。是不是如果你签了字。在本地签名密钥,该签名会保留在您的计算机上。但是,如果您只是简单地签名,则认为该签名是公开的,因此当您执行签名时将被发送到密钥服务器--send-keys
n611x007'1

2

使用此命令,将为您提供帮助

echo "PASSPHRASE" | gpg --passphrase-fd 0 --always-trust -r USER --encrypt FILENAME.TX

1

我也遇到了这个问题。我无法获得签名键来做任何有趣的事情。这是我所做的:

创建一个gpg密钥:

gpg --gen-key

获取长密钥ID(结果在第5列):

gpg --list-keys --with-colon name@domain.tld

将受信任的密钥行添加到〜/ gnupg / gpg.conf

trusted-key 16DIGITALPHANUMERICKEYID

备份脚本中的gpg行:

gpg -e -r name@domain.tld backup_file.tgz

调试cron:我还通过在cron命令行中将stdout和stderr发送到日志文件来捕获cron调试输出。知道是有帮助的


1
不,不要那样做。添加一个trusted-keygpg.conf会导致gpg始终相信,关键是充分为一个用户自己的钥匙这是一件坏事--trusted-key作为参数传递,并且仅在这种特定情况下可以接受(以相同的方式传递--trust-model=always)。
Blacklight Shining

这是我的钥匙。难道不是我想要的完全被标记为可信任吗?
jorfus

1
如果它实际上是您的密钥,那么可以,将其标记为最终信任(尽管我个人更喜欢使用--edit-key,而不是添加trusted-key一行)。询问者没有说抱怨的是他们自己的钥匙gpg
Blacklight Shining

1

我以为像我一样,很多人来这里讨论问题的“无需键盘交互”部分。使用gpg2和gpg-agent,在没有任何键盘交互的情况下对东西进行签名/加密/解密变得相当复杂。当您将纯文本私钥密码短语保存在文本文件中时,以下是创建签名的方法:

cat something_so_sign.xzy | gpg \
    --passphrase-file "plaintext_passphrase.txt" \
    --batch \
    --pinentry-mode loopback \
    -bsa

根据需要更改-b -s -a。其他开关是强制性的。您也可以使用--passphrase 'SECRET'。正如已经指出的那样,请当心。当然,纯文本文本文件并没有那么好。


0

或签署密钥(当然,在确认指纹之后):

gpg --sign-key <recipient email address>

之后,您完全信任密钥。

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately

5
信任所有者与这个问题无关。仅当您在签名/验证其他密钥及其所有者方面信任他时,才设置所有者信任
x539

Ianes为什么不编辑您的答案以更新有关关键信任的信息?目前可能会产生误导作用...--lsign-key可能也是一个更好的主意,不是吗?看到关于lsign的其他评论
n611x007'1

0

在此处输入图片说明

首次使用电子邮件ID创建证书时,请选择完全受信任的证书,然后每当加密任何文件时都不会问类似...的问题。有关更多信息,请在上面的链接中打开图像。

不确定密钥是否属于用户ID中指定的人。如果您真的知道自己在做什么,则可以用是回答下一个问题。

还是用这个键吗?(是/否)


0

一种不同的方法: 为了拒绝访问敏感数据(而不是使用第三方密钥对其进行加密),我仅将** PUBLIC密钥上载到要保护数据的服务器上,并使用该密钥进行加密。这就不需要交互式提示来提供便于自动化的密码,而且最重要的是,PRIVATE密钥与公共服务器不同。

gpg --batch --yes --trust-model always -r $YOURPUBKEYEMAILADDRESS -e ./file.txt

但是,如果使用您自己的公钥加密,则使用该开关--trust-model always会有点麻烦。无论如何,这是解决拒绝访问数据问题的另一种方式。HTH-特伦斯·霍拉汉

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.