从不透明的pkcs7 p7m转换为分离的smime

时间:2011-09-19 19:34:14

标签: openssl digital-signature pkcs#7 smime

您好我找不到一种方法来在明文deatached smime中转换不透明的pkcs#7(p7m),以便签名的内容可以由常规的mime库处理。

我想把p7m文件转换成一个有效签名的smime消息。

步骤应该是:

  • 从p7m提取签名内容

  • 从p7m中提取cms结构

  • 将所有内容打包在具有分离签名的新smime结构中

此操作可以吗?

我搜索过openssl手册,但我找不到办法。

1 个答案:

答案 0 :(得分:1)

我能够使用以下代码将opaque签名的消息转换为分离的消息:

#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/pkcs7.h>

int main(int argc, char **argv)
{
    BIO *data = NULL, *bin = NULL, *bout = NULL;
    PKCS7 *p7, *p7b;

    OpenSSL_add_all_algorithms();

    bin = BIO_new_file("opaque.p7m", "rb");
    p7 = SMIME_read_PKCS7(bin, &data);
    p7b = PKCS7_dup(p7);

    data = PKCS7_dataInit(p7, NULL);

    PKCS7_set_detached(p7b, 1);

    bout = BIO_new_file("detached.p7m", "wb");
    SMIME_write_PKCS7(bout, p7b, data, PKCS7_BINARY | SMIME_DETACHED);
}

要测试程序,我使用以下命令生成opaque.p7m:

$ openssl smime -sign -in foo.txt -signer my.crt -inkey my.key -nodetach -out opaque.p7m

简而言之,上面的代码没有检查。要接受不同的输入格式,您可以将SMIME_read_PKCS7更改为PEM_read_bio_PKCS7(PEM)或d2i_PKCS7_bio(DER)。