我正在尝试诊断 OpenDKIM 验证错误(请参阅这个问题)。在最深处,我正试图确保生成的密钥确实正确。
我正在使用 生成密钥opendkim-genkey -r -d example.com
。这将生成两个文件。一个是 RSA 私钥(文件default.private
):
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDJy9S18vHtrIQNep9PogJfrKNLKKf2VSOvUwOzItlWkY3cRCFx
scSNjfC4QHREcMeUuNO78wvQ+oOk+exLdyl2BggcA659Wi6v8X/+awLXpa9sB6vi
GPi8Zx560GbZu6jGLlEzcOaGDCYqdUxZIdAaOICDORFa3XAywHi87eQPMwIDAQAB
AoGAVSjAvnwlHqEEJVAPNSLwj4Gic9BXeXwakB2fXRSi1YadcEwMNRfJE9fHs2n3
5v4VK60IJbP+05U0wwV5c6t5AgZqpP0GBW8CKUr3BwaF2cJbd+uOXlAm4cx6/S1E
Ocoku0c/vrr3mkO41IuBkB+FRm0y7WXFi7e7M32Tictt0CkCQQDzE08wRLNXxkaM
LyUDMvCtlNzACcmkU73NAHDHhwtrJMMLp7q/s4VIDbmhysoNBblNHJQvA/7zVd13
1CGxbh8/AkEA1IajRLNJ6XTuv9RmK1622BDWix4ogEvbev/zR8ti2JifO6A5gv+L
na5hVAATo563pWjtNZW3sAVKqN7juN5HDQJAP1xKKP/Pa9LQMtxbHoFZwTVrcVdb
y0zUzaoOu8PU0yHrAY/AGxY1aLnDKIxOrKRQT+xiJ/s3qsA4EXMnMTPOSwJBAK5N
dl6EBRyZsK5YDyuG1MNEnBEhPOpsTKgGf4rkfj9SfVYzxLdxyxoZyO1R2smZBNl+
wv3tuud8j40MsQwQEYkCQBCzH+1IaxoMsSggutvEvqz2SqkFbD5rq/+uL6P6xyYg
PHCYIWomK8zOlmnO+bfbRIzQb7I81vOFq2sr0yQLK+0=
-----END RSA PRIVATE KEY-----
然后生成 DKIM DNS 条目,我假设它包含公钥:
default._domainkey IN TXT ( "v=DKIM1; k=rsa; s=email; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJy9S18vHtrIQNep9PogJfrKNLKKf2VSOvUwOzItlWkY3cRCFxscSNjfC4QHREcMeUuNO78wvQ+oOk+exLdyl2BggcA659Wi6v8X/+awLXpa9sB6viGPi8Zx560GbZu6jGLlEzcOaGDCYqdUxZIdAaOICDORFa3XAywHi87eQPMwIDAQAB" ) ; ----- DKIM key default for example.com
我假设“p=”条目是公钥,但如果是的话,我不知道如何验证它们是否匹配。我以为我可以用 来做到这一点ssh-keygen -y -f default.private
,但是,它的输出与 DNS 条目的“p=”部分明显不同(甚至长度也不相同):
# ssh-keygen -y -f default.private
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDJy9S18vHtrIQNep9PogJfrKNLKKf2VSOvUwOzItlWkY3cRCFxscSNjfC4QHREcMeUuNO78wvQ+oOk+exLdyl2BggcA659Wi6v8X/+awLXpa9sB6viGPi8Zx560GbZu6jGLlEzcOaGDCYqdUxZIdAaOICDORFa3XAywHi87eQPMw==
那么,这是怎么回事? ssh-keygen 是不是正确的方法(也许我应该用 OpenSSL 做些什么?)?“p=”不是公钥吗?或者,事实上,我的私钥和公钥不匹配?
谢谢!
PS,说点可能不相关的题外话,我假设 opendkim 生成的公钥的前 34 个字符总是相同的——MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQ
并且总是以 结尾IDAQAB
。
答案1
您可以比较两者的模量,如下所示:
从 DNS 记录中获取公钥。p=
正如您所说,这是 内的字符串。请注意,它有时会返回两个字符串,您需要将它们连接起来。您只需要内容,减去双引号。将其保存在本地,如下所示public.key.b64
。
转换为 DER 格式:
openssl enc -base64 -d -in public.key.b64 -out public.key
使用以下命令查看此公钥的模数:
openssl rsa -pubin -inform DER -in public.key -noout -modulus
使用以下命令查看私钥的模数:
openssl rsa -in private.key -noout -modulus
两者的输出将类似于以下内容并且必须匹配:
Modulus=B475A0F01B6DE62AB578E27CF2DF8F760C9C10DF52E69F4ED2FEA6912D8528F5860F6C1AB3F7DD88D4C63A1DA5A848D7655192FF6040E0405826648047EB25ECB0F56FDCB825987D48FA3953DCB04F78521F607137179C7EE081C48AF7DFB2F130E3001B80433977E962D900B9AFC9808F39B3D041213D39B5FA447EE39E838E67D5CD2EA373D68CFDB2DF3CD0260C6D7C88A7415195EEB85DBD31594E11D4BAD49C52098A8E77B56D034B04234A9064C92DBEB6A7B745EB9821446A56FF34284A0AA27768E55BF263E8D2F3B7BE52ECBE3F4590BAF7AD33DDECAD997DC61B8EAD2854714B13FAF7035758A21651740A9B36077ABC715080243626A1B3661233