使用.NET OpenSSL包装器签名文件

时间:2014-02-18 09:34:00

标签: c# .net openssl pkcs#7 x509

我试图复制这一行

openssl smime -sign -signer <chain_crt_file> -in <infile> -out <outfile> -inkey <privatekey> -outform der

进入C#然而它并没有像我想象的那么容易。到目前为止,我只是这一点

OpenSSL.Core.BIO crtBio = OpenSSL.Core.BIO.File("C:/asl/chain.crt", "r");
OpenSSL.Core.BIO keyBio = OpenSSL.Core.BIO.File("C:/asl/keydec.txt", "r");
OpenSSL.X509.X509Chain crt = new OpenSSL.X509.X509Chain(crtBio);
OpenSSL.Crypto.RSA key = OpenSSL.Crypto.RSA.FromPrivateKey(keyBio);

String str = "test";
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);

在哪里(希望)我正在导入链证书和解码私钥。 现在问题是如何签署文件并导出为DER。 OpenSSL.NET包装器缺少文档,我在互联网上找到的例子是“如何使用公钥/私钥加密和解密邮件”,这不是一个例子。

要开始,我尝试签署这个“测试”字符串(因为文件输入/输出应该是非常直接的)但我不知道从哪里开始。

问题是我需要签署这个字符串,因此我需要密钥和证书链。

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

  

要开始,我尝试签署这个“测试”字符串(因为文件输入/输出应该是非常直接的)但我不知道从哪里开始。

OpenSSL源可能是一个很好的起点。 OpenSSL为smime中的<openssl dir>/apps/smime.c提供了源代码。

OpenSSL的smime实用程序只使用适当的参数调用PKCS7_sign。从688左右开始:

else if (operation & SMIME_SIGNERS)
    {
    int i;
    /* If detached data content we only enable streaming if
     * S/MIME output format.
     */
    if (operation == SMIME_SIGN)
        {
        if (flags & PKCS7_DETACHED)
            {
            if (outformat == FORMAT_SMIME)
                flags |= PKCS7_STREAM;
            }
            else if (indef)
                flags |= PKCS7_STREAM;

           flags |= PKCS7_PARTIAL;
           p7 = PKCS7_sign(NULL, NULL, other, in, flags);
           if (!p7)
               goto end;
        }
        ...

了解PKCS7_sign,您可以访问PKCS7_sign(3)的OpenSSL文档。或者,你可以寻找一个例子。

我不知道你正在使用的包装器。