不需键盘交互的方式对文件进行GPG加密

89

我正在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会发生什么? - David Costa
文档手册?使用 --batch--yes 参数。 - u0b34a0f6ae
9个回答

86

正如David所暗示的,这里的问题是gpg不信任你用来加密的公钥。你可以像他解释的那样对该密钥进行签名。

另一种选择——特别是如果该密钥可能会偶尔更改——是在你的gpg命令中添加 --trust-model always

以下是手册页中相关的部分:

--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
4
这是因为该文本使用空格进行对齐。 - Tomáš Fejfar
这对我来说是正确的答案!谢谢 - daparic

46

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

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

这将完全信任该密钥,使您可以无需提示进行加密


1
这将立即更新信任数据库,无需保存。 - lanes
14
这个操作设定所有者信任度,而非密钥有效性。最终信任度仅适用于您自己的密钥。也就是说,任何由最终受信任身份签名的内容都被视为由您本人签署。因此,如果不是您的密钥,请勿将信任设置为最终信任。问题出在密钥的有效性上。为了解决/规避这个问题,您应该对密钥进行签名(可以考虑进行本地签名和指纹验证)。 - x539
4
x539是正确的。在执行“gpg2 --edit-key <key-id>”命令后,您需要使用“lsign”和“save”命令。我认为对于这个任务而言,信任等级5的使用是错误的(误解),并且对于我来说它甚至是无效的(无用的),因为x539所说的原因。 - n611x007
请注意,这对于普通的 gpg 也适用,不仅仅是针对 gpg2 :) - Markus

11

hack的方法:

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 sign 命令,现在它显示已签名,但仍然是信任状态:未知。批处理仍然无法在不提示的情况下运行。 - nycynik
2
我认为lsign是一个更好的选择。如果你使用lsign即本地签名密钥,那么签名将保留在你的计算机上。但如果你只是简单地签名,那就被视为公开的,因此当你执行--send-keys时会被发送到密钥服务器上。 - n611x007

5

使用这个命令,它能帮助你

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

2
我也遇到了这个问题。我无法让sign-key执行任何有趣的操作。这是我所做的:
创建一个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: 我还通过将stdout和stderr发送到cron命令行中的日志文件来捕获cron调试输出。这很有帮助。


1
不要这样做。在gpg.conf中添加一个“trusted-key”行会导致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

0

另一种方法:

这个解决方案可以在没有用户输入的情况下工作。

为了拒绝访问敏感数据(而不是使用第三方密钥对其进行加密),我仅上传*我的公共密钥到我想要保护数据的服务器上,并使用该密钥进行加密。这消除了需要交互式提示来提供密码以便自动化,最重要的是,私有密钥与公共服务器分离。

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

然而,如果不使用自己的公钥进行加密,则使用开关--trust-model always有点不可靠。总之,这是解决拒绝访问数据问题的另一种方法。希望对您有所帮助- Terrence Houlahan


0

enter image description here

当您第一次使用电子邮件ID创建证书时,请选择完全信任的证书,然后无论何时加密任何文件,都不会询问问题,例如...有关更多信息,请在上面的链接中打开图像。

不能确定该密钥属于用户ID中命名的人。如果您确实知道自己在做什么,可以用“是”回答下一个问题。

无论如何都要使用这个密钥吗?(y / N)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接