加密离线 IMAP 密码

加密离线 IMAP 密码

我正在尝试设置 OfflineIMAP 通过 gpg 加密文件进行身份验证(这样我可以将所有加密合并到我的 gpg-agent 进程中)。

从文档来看,加密服务器密码的唯一方法似乎是使用 gnome-keyring (我不希望在无头服务器上运行它)。有没有办法像使用 mutt 一样从 gpg 文件中输入我的密码?

我知道你可以使用扩展名为 python 文件的离线地图添加额外的功能,但我担心我不知道从哪里开始。

答案1

我使用以下方法,效果相当好:

1) 将您的密码存储在单独的 gpg 加密文件中。例如~/.passwd/<accountname>.gpg

2) 使用您选择的名称(例如~/.offlineimap.py)创建一个 python 扩展文件,其中包含以下内容:

def mailpasswd(acct):
  acct = os.path.basename(acct)
  path = "/home/<username>/.passwd/%s.gpg" % acct
  args = ["gpg", "--use-agent", "--quiet", "--batch", "-d", path]
  try:
    return subprocess.check_output(args).strip()
  except subprocess.CalledProcessError:
    return ""

3) 修改您的 .offlineimaprc 文件以告诉它有关 python 文件的信息,并告诉它如何读取您的密码

[general]
pythonfile = ~/.offlineimap.py
# ...

[Repository <reponame>]
# add this line for each remote repository
remotepasseval = mailpasswd("<accountname>")

如果您有多个帐户同时检查(单独的线程),并且您使用 gpg-agent,那么它会要求您输入每个帐户的密码。我通过创建一个文件 ( ) 来启动代理,并通过在离线地图启动时解密该文件来启动 gpg 代理。为此,请将以下内容添加到 的末尾:echo "prime" | gpg -e -r [email protected] > ~/.passwd/prime.gpg~/.offlineimap.py

def prime_gpg_agent():
  ret = False
  i = 1
  while not ret:
    ret = (mailpasswd("prime") == "prime")
    if i > 2:
      from offlineimap.ui import getglobalui
      sys.stderr.write("Error reading in passwords. Terminating.\n")
      getglobalui().terminate()
    i += 1
  return ret

prime_gpg_agent()

答案2

另一种让 Offlineimap 在知道密码的情况下运行但不将密码保存在磁盘上的方法是,让 Offlineimap 在 tmux/screen 中运行,并autorefresh在您的文件中启用该设置。~/.offlineimaprc

您需要添加autorefresh = 10[Account X]offlineimaprc 文件的部分,以使其每10 分钟检查一次。同时删除任何带有password或 的配置行passwordeval

然后运行offlineimap - 它会询问您的密码并将其缓存在内存中。第一次运行后不会退出,但会休眠 10 分钟。然后它会醒来并再次运行,但它仍然会记住您的密码。

因此,您可以让 tmux 会话与离线映射一起运行,输入一次密码,然后离线映射就可以了。

答案3

喜欢@kbeta 的回答。然而subprocess.check_output()只在 python 2.7 中引入 - 所以这里有一个offlineimap.py可以与旧版本的 python 一起使用的版本:

import os
import subprocess

def mailpasswd(acct):
    acct = os.path.basename(acct)
    path = "/home/hamish/.passwd/%s.gpg" % acct
    args = ["gpg", "--use-agent", "--quiet", "--batch", "-d", path]
    proc = subprocess.Popen(args, stdout=subprocess.PIPE)
    output = proc.communicate()[0].strip()
    retcode = proc.wait()
    if retcode == 0:
        return output
    else:
        return ''

答案4

ArchLinux wiki 有一些好信息

我能够将密码存储到 KDE 钱包中,如下所示本指南

〜/离线imaprc

[general]
accounts = main
pythonfile = ~/offlineimap.py

[Account main]
# Identifier for the local repository; e.g. the maildir to be synced via IMAP.
localrepository = main-local
# Identifier for the remote repository; i.e. the actual IMAP, usually non-local.
remoterepository = main-remote

[Repository main-local]
# OfflineIMAP supports Maildir, GmailMaildir, and IMAP for local repositories.
type = Maildir
# Where should the mail be placed?
localfolders = ~/imap-backup

[Repository main-remote]
type = IMAP
sslcacertfile = /etc/ssl/certs/ca-certificates.crt
remotehost = my.host
remoteuser = my.user
remotepasseval = get_password()

〜/离线imap.py

#! /usr/bin/env python2
from subprocess import check_output

def get_password():
    return check_output('qdbus org.kde.kwalletd5 /modules/kwalletd5 readPassword "$(qdbus org.kde.kwalletd5 /modules/kwalletd5 org.kde.KWallet.open kdewallet 0 "kde-service-menu-nowardev-scanner")" "imap" "akonadi_imap_resource_0rc" "kde-service-menu-nowardev-scanner"', shell=True).splitlines()[0]

相关内容