我如何通过OpenSSL的C++(或VC++)帮助创建域名密钥签名和DKIM签名,这可能吗?
How I can create a DomainKey-Signature and DKIM-Signature by C++(or VC++) help of OpenSSL, Is it possible?
我有一个公钥/私钥对,我把我的公钥提交到服务器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。
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 使用 C/C++ 宏生成函数签名
- 如何使用模板函数的函数签名进行SFINAE
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- C++Builder中的OnClick事件签名存在问题
- 加密++验证大文件签名
- 具有所表示类的相同构造函数签名的代理类模板
- 获取隐式转换溢出从无符号到已签名的警告
- 为什么签名字符可以保存大于 127 的值?
- 使用不同算法的 PKCS1v15 填充进行加密 ++ 签名
- 模板签名解析为 void(void) 被 GCC 拒绝;这是否有效C++?
- 将具有固定签名的自定义函数名称注入 CRTP
- RSA_PKCS1签名验证
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- 如何解释GDB中回溯的模板函数签名?
- 如何从参数中获取函数签名?
- 我能否根据其运算符()的签名专门化可变参数模板参数
- 由于签名差异,调用了错误的子类函数
- 我如何通过OpenSSL的C++(或VC++)帮助创建域名密钥签名和DKIM签名,这可能吗?