无需键盘交互的gpg加密文件[关闭]

Posted

技术标签:

【中文标题】无需键盘交互的gpg加密文件[关闭]【英文标题】:gpg encrypt file without keyboard interaction [closed] 【发布时间】:2012-03-16 15:18:42 【问题描述】:

我正在 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. 【参考方案1】:

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

另一种选择——特别是如果密钥可能偶尔更改——将--trust-model always 添加到您的 gpg 命令。

这是手册页中的相关部分:

--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.

【讨论】:

不明白为什么系统认为那是代码。我点击了报价;不是代码。编辑时,它仅显示为引用(没有颜色)。很奇怪。 因为文字使用了空格来对齐。 这对我来说是正确的答案!谢谢【参考方案2】:

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

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

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

【讨论】:

这会立即更新 trust-db,不需要保存。 这设置了所有者信任而不是密钥有效性。 Ultimate Trust 仅适用于您自己的密钥。即,由最终可信身份签名的所有内容都按照您自己的签名处理。所以不要 SET TRUST TO ULTIMATE 如果它不是你的钥匙。问题是密钥有效性。要解决/解决此问题,您应该签署密钥。 (考虑仅本地签名和指纹验证) x539 是对的。在gpg2 --edit-key &lt;key-id&gt; 之后,您执行lsignsave。我认为 trust 5 对此的使用是错误的(被误解),而且(对我来说)它甚至无效(没用),因为 x539 告诉我们。 请注意,这也适用于普通gpg,不仅适用于gpg2 :)【参考方案3】:

破解方法:

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 |,然后只使用加密行。

【讨论】:

我尝试了签名密钥的方法,都是 gpg2 --edit-key USER 签名,现在显示它已签名,但仍然信任:未知。并且批处理仍然不会在没有提示的情况下运行 我认为lsign 会是一个更好的主意。是不是如果你 lsign 即。本地签名密钥,该签名保留在您的计算机上。但是,如果您只是简单地签名,这将被认为是公开的,因此在您执行 --send-keys 时将被发送到密钥服务器?【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

创建一个 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 调试输出。了解会很有帮助

【讨论】:

不,不要那样做。将trusted-key 行添加到gpg.conf 将导致gpg始终信任该密钥就像用户自己的密钥之一,which is a bad thing。将--trusted-key 作为参数 传递,并且仅在这种特定情况 是可以接受的(passing --trust-model=always in the same way 也是如此)。 这是我的钥匙。将其标记为可信不正是我想要的吗? 如果它实际上是您的密钥,那么是的,将其标记为最终受信任(尽管我个人更喜欢使用--edit-key 来做到这一点,而不是通过添加trusted-key 行)。提问者并没有说gpg 抱怨的是他们自己的键。【参考方案6】:

我假设很多人都像我一样来这里是为了“没有键盘交互”的问题。使用 gpg2 和 gpg-agent 在没有任何键盘交互的情况下签名/加密/解密内容变得非常复杂。当您的明文私钥密码短语保存在文本文件中时,您将如何创建签名:

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

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

【讨论】:

【参考方案7】:

或者在密钥上签名(当然是在你验证指纹之后):

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

【讨论】:

信任所有者与此问题无关。仅当您在签署/验证其他密钥及其所有者方面信任他时才设置所有者信任 Ianes 为什么不编辑您的答案以更新有关密钥信任的信息?目前可能具有误导性......另外--lsign-key 可能是一个更好的主意,不是吗?请参阅my other comment 关于 lsign【参考方案8】:

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

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

仍然使用这个键吗? (是/否)

【讨论】:

【参考方案9】:

另一种方法:

此解决方案无需用户输入即可工作。

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

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

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

【讨论】:

以上是关于无需键盘交互的gpg加密文件[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Linux实用工具之GPG

加密解密:文件加密

利用Gpg4win来打造一个安全的加密文件

OpenSSL vs GPG 用于加密异地备份? [关闭]

使用 nemo 右键菜单加密 GPG 文件

gpg在上传时加密消息和文件,然后发送电子邮件