OpenDKIM 提供的工具不提供可用于 DKIM 的密钥对

OpenDKIM 提供的工具不提供可用于 DKIM 的密钥对

我使用opendkim-genkey -b 2048 -t -s default -d mydomain.com,结果文件default.privatedefault.txt。是的,default.private以 开头(正确,SFAIK)-----BEGIN RSA PRIVATE KEY-----并且default.txt每段不超过 256 个字符(不违反 DNS 编码要求。)此外,不opendkim-testkey返回任何内容(没有-v)并且-v -v -v它说Key not secure(但我没有使用 DNSSEC)并且还有Key OK,所以根据 opendkim 本身,密钥至少是最低限度正确的。

我得到了错误

Sep 26 22:41:49 mydomain opendkim[1793958]: 18R2fhko1843765: SSL error:0909006C:PEM routines:get_name:no start line
Sep 26 22:41:49 mydomain opendkim[1793958]: 18R2fhko1843765: dkim_eom(): resource unavailable: PEM_read_bio_PrivateKey() failed
Sep 26 22:41:49 mydomain sm-mta[1843765]: 18R2fhko1843765: milter=opendkim, reject=451 4.7.0 resource unavailable
Sep 26 22:41:49 mydomain sm-mta[1843765]: 18R2fhko1843765: Milter: data, reject=451 4.7.0 resource unavailable
Sep 26 22:41:49 mydomain sm-mta[1843765]: 18R2fhko1843765: to=<[email protected]>, delay=00:00:00, pri=30408, stat=resource unavailable

我看到很多网络搜索都提到了错误SSL error:0909006C:PEM routines:get_name:no start linedkim_eom(): resource unavailable: PEM_read_bio_PrivateKey() failed,但都没有什么帮助。当我看到“结案”时,这是因为用户实施错误,例如权限错误、文件位置规范错误或密钥/txt 格式错误,提交者通常会说“抱歉打扰了”,但事实并非如此。我完全按照文档中指定的方式处理上面记录的故障。

对于那些想知道的人,我正在使用 Ubuntu 20.04 LTS 和 sendmail 8.15.2。投诉源自 opendkim milter 与 SSL 例程,因此外部上下文并不重要。

我本想在 opendkim 邮件列表上询问,但“lists.opendkim.org”已关闭。我需要让 OpenDKIM 运行,以遵守 Master Goo(此外,这是最佳实践,哦,好吧。)如果有人遇到过这种情况,并能给出可行的答案,我将不胜感激。

我使用的输出正是“opendkim-genkey”输出的,没有其他地方描述的格式错误,并且 opendkim-testkey 很正常,所以请原谅我没有包含实际数据。

ps: opendkim 安装如下apt install opendkim

opendkim -p /var/run/opendkim.sock -V opendkim:
OpenDKIM Filter v2.11.0 Compiled with OpenSSL 1.1.1f 31 Mar 2020  
SMFI_VERSION 0x1000001  
libmilter version 1.0.1  
Supported signing algorithms: rsa-sha1 rsa-sha256 ed25519-sha256  
Supported canonicalization algorithms: relaxed simple  
Active code options: QUERY_CACHE USE_DB USE_LDAP USE_LUA USE_ODBX USE_UNBOUND _FFR_ATPS _FFR_RBL _FFR_REPLACE_RULES _FFR_SENDER_MACRO _FFR_STATS _FFR_VBR  
libopendkim 2.11.0: atps query_cache

opendkim-tool 生成的密钥和手动生成的(根据 OpenDKIM 文档)密钥都无法绕过错误。

答案1

我已经验证了密钥是正确的(私有<==>公共),并且可以通过两种不同的方式访问。我没有使用 KeyTable。我的 /etc/opendkim.conf(伪装的实际域)是:

Syslog          yes
UMask           007
Domain          mydomain.sometld
KeyFile         /etc/dkimkeys/10191.private
Selector        10191
Mode            v
Socket          inet:8892@localhost
#@Socket        local:/run/opendkim/opendkim.sock
PidFile         /run/opendkim/opendkim.pid
OversignHeaders From
TrustAnchorFile /usr/share/dns/root.key
UserID          opendkim

我让过滤器处于“v”模式,因为“sv”会失败,我只需要用“sv”重新启动过滤器进行测试。使用从 opendkim.org 获得的 opendkim-2.10.3:我破解了过滤器使用的 libopendkim/dkim.c,以便在下次失败时(在无人关心的清晨时分)显示正在尝试的密钥的前 96 个字符 (*)。(*) 96 = 标题行 + 密钥数据的第一个“行”。

1135         if (strncmp((char *) dkim->dkim_key, "-----", 5) == 0)
1136         {                                               /* PEM */
1137                 rsa->rsa_pkey = PEM_read_bio_PrivateKey(rsa->rsa_keydata, NULL,
1138                                                         NULL, NULL);
1139 
1140                 if (rsa->rsa_pkey == NULL)
1141                 {
1142                         dkim_load_ssl_errors(dkim, 0);
1143                         dkim_error(dkim, "PEM_read_bio_PrivateKey() failed");
1144                         // ecsd: we want to see what failed:
1145                         char dbuf[128]; sprintf(dbuf,"dkim_key %96.96s\n",dkim->dkim_key);
1146                         dkim_error(dkim, dbuf);
1147                         // end extra debug
1148                         BIO_free(rsa->rsa_keydata);
1149                         rsa->rsa_keydata = NULL;
1150                         return DKIM_STAT_NORESOURCE;
1151                 }
1152         }

我应该调试 PEM_read_bio_PrivateKey(以找出它在抱怨什么),但重新编译整个子系统又太过担心,此外,抱怨的原因是标头不好,所以我只需要了解“替代”尝试了什么,因为私钥的内容是正确的。与此同时,opendkim.org 的邮件列表怎么了,opendkim.org 和 dkim.org 上列出的联系人不起作用?好像每个人都无聊了就回家了。对于您希望普遍采用的协议来说,这可不是什么好事。至少代码尝试了,但例如,我不得不破解“configure”以阻止它需要包含 SSL_library_init() 的库,而(外部世界)文档说这是可以避免的(因此 opendkim 代码似乎没有得到妥善维护。)

configure:
16846 fi
16847 rm conftest.$ac_ext
16848 LIBS=$ac_func_search_save_LIBS
16849 fi
16850 #ecsd
16851 $as_echo "for libssl, LIBS:$LIBS"
16852 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_SSL_library_init" >&5
16853 $as_echo "$ac_cv_search_SSL_library_init" >&6; }
16854 ac_res=$ac_cv_search_SSL_library_init
16855 #ecsd:
16856 #if test "$ac_res" != no; then :
16857 #  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
16858 #else
16859 #  as_fn_error $? "libssl not found" "$LINENO" 5
16860 #fi
16861 
16862 
16863 
16864 fi

答案2

希望这是一个答案:我尝试从源代码编译 OpenDKIM,但毫无进展:PEM 错误消失了,但过滤器在其他方面失败了,这对其使用来说是致命的。所以我得到了“dk-filter”,它的最新版本已经过时了,因为它只使用 SHA1,将“relaxed”称为“nofws”,只处理一个规范化(relaxed 或 simple,而不是像“relaxed/simple”那样的两个规范化,并且使用“dns”而不是“dns/txt”。我根据 RFC8301(没有人引用)对其进行了破解,它可能正在运行;它处理入站邮件,最后给了我一个 DKIM 签名:

DomainKey-Signature: a=rsa-sha256; s=10191; d=mydarneddomain.com; c=relaxed/simple; q=dns/txt;
    h=to:from:subject:message-id:date:user-agent:mime-version:
    content-type:content-transfer-encoding:content-language:x-uctc:x-sdmilter-detected;
    b=kldIuC9j/EIB7ouhRrhxmZBkC7xAazd8RiWHUA/1R0FZK265yeFgf+TPqbfTjErps
    CrkoCn1I2gdMpq8k9ZrdF8RsQk8FeZBVLGE9iY3D2Rkj/ozjdOyHgNaNDCHKfdnpiNp
    4uV/w7ZG8fAEdDwfSoQ3IBvCmxoszV2bzGvzKz+DuT17G8ES3aJcKsdm9+MEHz0VxrB
    EHdOd9ij/EBZFHTMwcLqBWVi+kTvUvzjFK1ssPEO9CHXIWqjBE1gKtfiIDkeJ7kx0w4
    ft8TiPvMb5Z1WyOPWoI6a+tNNz2at1URSYvxMcDi77m93GH5Tcda1fNN/shx9ze9Igw
    DwPHc6mFA==

由于我已将其破解为合规性和可工作性(尚未在实践中得到确认,但很快就会得到确认),并且它可能适用于所有 OpenDKIM 无法使用的人,因此值得分享,比如在 github 上。我还不知道该怎么做;如果有人愿意帮忙,请告诉我。

这个东西真的很原始,甚至没有“dk-filter.conf”文件,而是必须使用命令行;我使用

dk-filter -p inet:8892@localhost -b sv -c relaxed -d mydarneddomain.com -D -h -H -l -S 10191 -s /etc/dkimkeys/10191.private

尽管 -d 可以引用列出要签名的主机的文件(尚未测试)。它也不是“服务”。如果有人可以引用一本书来解释如何将其打包为服务,例如 Ubuntu,请告诉我。

附言:RFC8301授权具体价值观和禁止SHA1 的使用。检查 DKIM 密钥的站点可能会有过时的评论,指出可以使用 sha1 或 sha256。现在只能使用 sha256,这些评论已经过时了。

相关内容