Openssl

如何驗證 opendkim 生成的 RSA 密鑰

  • October 2, 2021

我正在嘗試診斷 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.

您可以比較兩者的模數,如下所示:

從您的 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

引用自:https://serverfault.com/questions/1079356