0

我有一个公钥/私钥对,我将我的公钥提交到服务器 DNS TXT 记录(在 SPF 记录中),我有一个私钥文件。我想为电子邮件创建 DKIM-Signature 和 DomainKey-Signature,所以我想通过私钥加密文本消息以将其发送到电子邮件服务器。我想使用 SHA-256 作为加密哈希和 RSA 作为公钥加密方案。我想使用 OpenSSL 和 C++ 来制作 DKIM 签名和 DomainKey-Signature 的电子邮件..

这是我在服务器 TXT 记录中的公钥:

 -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnHVS+q65lvG2xocltTYgPGt9F
    aysGZTrcOwHedo8tX1dyPrcx2I8x/cvB9nmfdAkt65aGFAlBZrofbPCr2Mq4wDdv
    IZ31KSuyMQI4T68ylWNT89GewQF6AOkpY1E2bW+oDXc+MpbtpYXY1rUJAS/Abt5v
    Xi7gwKN9FSJ3mm9bjQIDAQAB
    -----END PUBLIC KEY-----

这是我的女贞钥匙:

 -----BEGIN RSA PRIVATE KEY-----
    MIICXQIBAAKBgQCnHVS+q65lvG2xocltTYgPGt9FaysGZTrcOwHedo8tX1dyPrcx
    2I8x/cvB9nmfdAkt65aGFAlBZrofbPCr2Mq4wDdvIZ31KSuyMQI4T68ylWNT89Ge
    wQF6AOkpY1E2bW+oDXc+MpbtpYXY1rUJAS/Abt5vXi7gwKN9FSJ3mm9bjQIDAQAB
    AoGACXuxnmxRpjZOJ0FeE9TNfsXwm5jcRS2jbHHwxjYGI/YAGVyTusFmRtj3Iheh
    iTnld3SiAxPJ/qscrsHY2nef8Up60V7RF8bs+sbICnHbdz8ZoKxN9dEFCwJkIl55
    dv0GHjox6UgWUUkUAiHCM2EgG5eOOQ8PsuXY8LpPWLvfuyUCQQDbkFG9y/Q/3lmb
    CdYfBpsP3qvma+fdgCw9lRXTowhu0rKen/CC3rFkHMeHfSW9GHuR8QbPYdVA6d9H
    Y7KxYa7LAkEAwtjTEo/zAVexH/+YgiqL6w89BHlTAmwIEkXpqtAnE86kDDCekYdE
    fRIdGK1zHDOUddMAhwoJQjJzy/NJreQ8BwJBAMoJ6U3vKZjD8Ex8Jq5yE6nsyt3D
    mZ73XL5mO6l9sjrYY0kX/+dNKIro+KoyfNGef8bxtcSLUALlsnIsybf0HTUCQQCR
    DD4cvGJHJpOp4WkTxT6Bjsd6lCKyU9+yUq8/RFNC0HqYxHzWkx7uCFT2sPBXFyK2
    j4v9+v+ncs13DzZTJ+tzAkBI6UWHtsn839nrAT32M8PEPF/TuDmqebMhFOaTl4an
    W0Jr8w8iGk2gvQS2cXEPNh4XT9AgcTKDQkhui4RgxK4F
    -----END RSA PRIVATE KEY-----

我尝试了 OpenSSL 的一些代码帮助,但我无法为电子邮件创建 DKIM-Signature 和 DomainKey-Signature ..

这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <openssl/bio.h>
#include <openssl/pkcs7.h>
#include <openssl/pkcs12.h>
#include <openssl/x509.h>

/ * Arguments: to be signed email, PKCS#12 certificate with private key
 */
int main(int argc, char** argv) {

    if (argc < 3) exit(1);
    OpenSSL_add_all_algorithms();

    BIO *data = BIO_new_file(argv[1], "rb");
    if (!data) exit(1);

    BIO *p12file = BIO_new_file(argv[2], "rb");
    if (!p12file) exit(1);
    PKCS12 *p12 = d2i_PKCS12_bio(p12file, NULL);
    if (!p12) exit(1);

    X509 *signcert;
    EVP_PKEY *pkey;
    STACK_OF(X509) *ca;
    int ret = PKCS12_parse(p12, "", &pkey, &signcert, &ca);
    if (!ret) exit(1);

    PKCS7 *p7 = PKCS7_sign(signcert, pkey, ca, data, 0);
    if (!p7) exit(1);

    BIO *out = BIO_new_file("email.eml", "wb");
    if (!out) exit(1);

    ret = SMIME_write_PKCS7(out, p7, data, 0);
    if (!ret) exit(1);

    BIO_free(data);
    BIO_free(p12file);
    PKCS12_free(p12);
    PKCS7_free(p7);

    return (EXIT_SUCCESS);
}

任何人都可以帮助我如何使用我的 Privet 密钥和文本来创建这个“DKIM-Signature and DomainKey-Signature”????

This is not working : BIO *p12file = BIO_new_file(argv[2], "rb");

我没有“PKCS#12 证书”,所以我将如何只使用我的 Privet 密钥和电子邮件的短信来创建“DKIM-Signature 和 DomainKey-Signature”????

4

1 回答 1

0

您的私钥和公钥采用 PEM 格式。您可以使用 OpenSSL 将其转换为 PKCS#12。

openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt

话虽如此,这对您没有帮助。您提供的源代码用于使用 S/MIME 对电子邮件进行签名。这使用由官方证书颁发机构签名的个人证书,而不是使用自签名证书。这也提供了加密电子邮件的能力,前提是收件人的密钥链中有您的公钥。

您正在寻找的是 DKIM 和 DomainKeys。这分别使用 SHA256 和 SHA1 进行签名和散列。它在计算上比 S/MIME 便宜,但需要在计算哈希之前对标头和正文进行规范化(Google it)。

我建议你看看 Github 上的 PHPMailer projet。虽然这是 PHP 源代码,但它应该很容易适应在 C 中工作。它只涵盖了 DKIM 实现,但 DKIM 取代了 DomainKeys,所以我不会费心实现 DomainKeys。

于 2013-08-17T06:01:20.123 回答