我如何通过OpenSSL的C++(或VC++)帮助创建域名密钥签名和DKIM签名,这可能吗?

How I can create a DomainKey-Signature and DKIM-Signature by C++(or VC++) help of OpenSSL, Is it possible?

本文关键字:DKIM 签名 密钥 域名 C++ OpenSSL 何通过 创建 帮助 VC++      更新时间:2023-10-16

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

这是我在服务器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签名和域名签名。

这是代码:

#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);
}

任何人都可以帮助我如何使用带有文本的女贞密钥来创建这个"DKIM签名和域名签名????

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

我没有"PKCS#12 证书",所以我将如何仅将我的女贞密钥与电子邮件的文本消息一起使用来创建"DKIM 签名和域密钥签名"????

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

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

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

您正在寻找的是DKIM和域名密钥。这是签名的,然后分别使用 SHA256 和 SHA1 进行哈希处理。它在计算上比 S/MIME 便宜,但在计算哈希之前需要对标头和正文进行规范化(谷歌它)。

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