【问题标题】:S/MIME libraries for .net?.net 的 S/MIME 库?
【发布时间】:2010-09-12 17:52:39
【问题描述】:

我需要使用 C# 创建 S/MIME 消息(如 RFC 2633、“S/MIME 第 3 版消息规范”和 RFC 3335 中所指定)。 我能找到的唯一 S/MIME 库是一个商业库 (http://www.example-code.com/csharp/smime.asp),这对我们没有好处。

是否有任何现有的库来完成创建 S/MIME 消息,尤其是 .p7s 文件?

我有所有需要进入此文件的加密和签名元素,但我想创建 .p7s 文件,而无需借助 RFC 文档手动处理我自己的库...


编辑: 我找到了另一个commercial S/MIME library,这仍然不符合我们的要求。 它看起来越来越像我将不得不手动滚动一个 S/MIME 库,这很可悲。 .net 中需要 S/MIME 的每个人都使用商业的封闭源代码库来实现吗?

【问题讨论】:

    标签: c# encryption mime


    【解决方案1】:

    我编写了自己的 MIME 库,支持名为 MimeKit 的 S/MIME,它比任何基于 System.Net.Mail 的任何东西都要强大得多,后者被严重破坏了。

    它支持原始 8 位标头、rfc822 组地址、从地址标头中的 rfc822 cmets 中抓取名称(To/Ccc/Bcc/etc),解析 mbox 格式的消息假脱机(包括支持基于 Content-Length 的 SunOS 格式)它比任何其他 C# MIME 解析器快一个数量级,因为它基于字节流而不是基于 TextReader(这也是它比任何其他 C# 解析器更好地支持原始 8 位标头的方式)。

    【讨论】:

    • 我刚开始使用您的库,非常棒,谢谢!不过,我注意到的一件事是,Android 或 iOS 上似乎不存在 MimeKit.Cryptography 命名空间(还没有?)。是否也计划在 Android 和 iOS 上支持 S/MIME?我问是因为我寻找 S/MIME 库的主要目的是在移动平台上编写应用程序。谢谢!
    • 是的,我只是还没开始。我会尽快解决这个问题。
    • 刚刚向 MimeKit 提交了一个补丁,以构建对 iOS 和 Android 的所有 S/MIME 和 PGP 支持 :-)
    • 很棒的图书馆,而且文档也很完善 - 谢谢!
    【解决方案2】:

    看看Rebex Secure Mail。这是我使用多年的一个非常稳定的库。它是 100% 托管代码,并且还提供源代码。

    【讨论】:

      【解决方案3】:

      我花了很多时间为 .NET 寻找一个好的 S/MIME 库,但没有成功。我最终创建了自己的 OpaqueMail。

      它是开源的并且完全免费。它继承自 System.Net.Mail.SmtpClient 类,因此移植现有代码很简单。它还包括使用 POP3 和 IMAP 的类。

      查看http://opaquemail.org/

      发送 S/MIME 三重包装消息(经过数字签名、加密,然后再次进行数字签名)的示例如下:

      // Instantiate a new SMTP connection to Gmail using TLS/SSL protection.
      SmtpClient smtpClient = new SmtpClient("smtp.gmail.com", 587);
      smtpClient.Credentials = new NetworkCredential("username@gmail.com", "Pass@word1");
      smtpClient.EnableSsl = true;
      
      // Create a new MailMessage class with lorem ipsum.
      MailMessage message = new MailMessage("username@gmail.com", "user@example.com", "Example subject", "Lorem ipsum body.");
      
      // Specify that the message should be signed, have its envelope encrypted, and then be signed again (triple-wrapped).
      message.SmimeSigned = true;
      message.SmimeEncryptedEnvelope = true;
      message.SmimeTripleWrapped = true;
      
      // Specify that the message should be timestamped.
      message.SmimeSigningOptionFlags = SmimeSigningOptionFlags.SignTime;
      
      // Load the signing certificate from the Local Machine store.            
      message.SmimeSigningCertificate = CertHelper.GetCertificateBySubjectName(StoreLocation.LocalMachine, "username@gmail.com");
      
      // Send the message.
      await smtpClient.SendAsync(message);
      

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        CodeProject 上有一个相当不错的 S/MIME 类。

        http://www.codeproject.com/KB/security/CPI_NET_SecureMail.aspx

        【讨论】:

          【解决方案5】:

          我没有使用过这个 S/MIME 库,但我的应用程序使用了来自同一供应商的另一个库,并且运行良好:

          http://www.chilkatsoft.com/mime-dotnet.asp

          他们的 p7s 签名库是独立的,这可能是一个问题,具体取决于您的预算:

          http://www.chilkatsoft.com/crypt-dotnet.asp

          【讨论】:

          • 即使成本不是问题(我敢肯定会这样),另一个问题是 chilkatsoft 如何提供库。我敢打赌他只是提供了一些 dll,您可以愉快地与 Visual Studio 一起使用吗?我的老板太便宜了vs.net,我们用microsoft.com/express/vwd
          • 就像我说的,我们使用可视化 Web 开发,它的 DLL 功能相当有限。具体来说,没有编译到 DLL,而且我认为它与一般外部 DLL 的互操作性非常有限,尽管我可能是错的。哦,我多么渴望视觉工作室!
          【解决方案6】:

          实现完整的 s/mime 非常困难,因为它需要大量额外的工作。您可以使用SMIME components in SecureBlackbox 来完成您的任务。

          更新:SecureBlackbox 是我们的产品。它完全支持 Silverlight 和 Windows Phone(包括 Mango)。

          【讨论】:

            猜你喜欢
            • 2012-03-15
            • 2011-04-25
            • 2011-09-07
            • 2016-11-20
            • 2012-10-04
            • 2019-03-04
            • 1970-01-01
            • 2011-01-28
            • 2014-09-16
            相关资源
            最近更新 更多