Как я могу создать DomainKey-Signature и DKIM-Signature с помощью C++ (или VC++) OpenSSL, возможно ли это?

У меня есть пара открытый/закрытый ключ, я отправил свой открытый ключ в запись 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);
}

Кто-нибудь может мне помочь, как я буду использовать свой закрытый ключ с текстом для создания этой «DKIM-Signature и DomainKey-Signature»????

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

У меня нет «сертификата PKCS # 12», так как я буду использовать только свой закрытый ключ с текстовым сообщением электронной почты для создания «DKIM-Signature и DomainKey-Signature» ????


person Community    schedule 01.02.2013    source источник


Ответы (1)


Ваш закрытый и открытый ключи находятся в формате 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, но требует канонизации (погуглите) заголовка и тела, прежде чем можно будет вычислить хэши.

Я рекомендую вам взглянуть на проект PHPMailer на Github. Хотя это исходный код PHP, его легко адаптировать для работы на C. Он охватывает только реализацию DKIM, но DKIM заменяет DomainKeys, поэтому я бы не стал заморачиваться реализацией DomainKeys.

person Stephan Edelman    schedule 17.08.2013