【问题标题】:Compilable C++ code to implement a secure SLL/TLS client using MS SSPI使用 MS SSPI 实现安全 SSL/TLS 客户端的可编译 C++ 代码
【发布时间】:2010-01-09 02:05:20
【问题描述】:

如此处所述 http://www.ddj.com/cpp/184401688

我没有时间从头开始写这篇文章。

问但未回答 https://stackoverflow.com/questions/434961/implementing-ssl

问题是:

我正在寻找一些实现 MS SSPI 的可编译工作源代码(如上面的线程中提到的),程序不是 OOP 首选。

我在这里查看了代码项目示例:

http://www.codeproject.com/KB/IP/sslclasses.aspx

但这是 C# OOP。将其转换为 C++ 代码并非易事。

OpenSSL

SChannel 调用遵循 GSS API 标准。当然,还有一些替代方案——例如 OpenSSL。这个包是协议的完整和彻底的实现,对于非常熟悉 UNIX 的人来说无疑是最好的选择。该软件包最初面向 UNIX 社区,并且依赖于 Perl 运行时进行编译,因此对于从未使用过 UNIX 类型系统的 Windows 开发人员来说,需要一定的学习曲线。

除此之外,OpenSLL 还做了一些非常不标准的事情

尼古拉, 贡献了很多可编译的源代码 (www.coastrd.com) 我希望找到愿意这样做的人。

【问题讨论】:

  • 你不会在这里找到答案.. 可能只是一个笑话答案,其中包含将 ssl 编码的零流写入 /dev/null 的代码
  • Bump,你获得了第二次反对票。请提出一个更好的问题。你不想要 OpenSSL,没关系。然后,使用 MS SSPI。或者编写自己的 SSL/TLS 实现。
  • 请阅读问题。我正在寻求使用 MS SSPI 的解决方案...
  • 感谢您的反馈,我会尽量写出我的问题,以免它们听起来那样。这当然不是我的本意。
  • 如果它需要 Perl 怎么办,perl 是免费的,在 windows 上安装很容易而且没有问题。

标签: c++ ssl sspi


【解决方案1】:

此 SSPI SChannel SMTPS 示例应按原样在 Visual Studio 2008 中编译和运行

http://www.coastrd.com/c-schannel-smtp (the original site seems dead; fortunately WaybackMachine has it archived)

SChannel 是封装 SSL/TLS 协议的 GSS API 的 Microsoft 实现。

利用 SChannel 的优势:

  • SSPI 向开发人员屏蔽了血腥细节。
  • 无需额外设置即可运行最终应用程序:
  • SChannel 是操作系统不可分割的一部分
  • 在 Windows ME/2000/XP/... 平台上,默认安装和配置 SChannel
  • SChannel 调用遵循 GSS API 标准。
  • 您不需要创建/安装任何证书
  • 无需提供和安装第三方 dll(1MB 或更大)

代码应生成如下所示的会话:

----- SSPI 已初始化
----- WinSock 已初始化
----- 凭据已初始化
----- 连接到服务器
已发送 70 字节的握手数据
收到 974 字节的握手数据
发送了 182 字节的握手数据
收到 43 字节的握手数据
握手成功
----- 已执行客户端握手
----- 服务器凭据经过身份验证

服务器主题:C=US、S=California、L=Mountain View、O=Google Inc、CN=smtp.gmail.com
服务器颁发者:C=ZA、S=Western Cape、L=Cape Town、O=Thawte Consulting cc、OU=Certification Services Division、CN=Thawte Premium Server CA、E=premium-server@thawte.com

----- 显示证书链
----- 服务器证书已验证
----- 服务器证书上下文发布

协议:TLS1
密码:RC4
密码强度:128
哈希:MD5
哈希强度:128
密钥交换:RSA
密钥交换强度:1024
----- 安全连接信息
收到 64 字节(加密)应用程序数据
解密数据:43字节
220 mx.google.com ESMTP 6sm17740567yxg.66

发送 7 个字节的明文:
EHLO

28 字节的加密数据发送
收到 169 字节(加密)应用程序数据
解密数据:148 字节
250-mx.google.com 为您服务,[22.33.111.222]
250 尺寸 35651584
250-8BITMIME
250-AUTH 普通登录
250 个增强状态代码
250 流水线

发送 7 个字节的明文:
退出

28 字节的加密数据发送
收到 69 字节(加密)应用程序数据
解密数据:48字节
221 2.0.0 关闭连接 6sm17740567yxg.66

----- SMTP 会话完成
发送关闭通知
发送了 23 字节的握手数据
----- 与服务器断开连接
----- 开始清理
----- 全部完成 -----

【讨论】:

  • 如何使用 Schannel 发送大数据。我们尝试过,但如果数据增加超过 16432 则失败
【解决方案2】:

也许this link 是一个很好的起点。它包含使用 MS SSPI 的实际工作示例代码(虽然它看起来非常特定于 MSVC,但是好的,它只是它的窗口)。只需忽略 OpenSSL 示例;-)

【讨论】:

  • 谢谢。我忘了提那个。见上文
  • 好吧,那我也帮不上忙了。但是将这些转换为命令式代码应该不会太难。
【解决方案3】:

在我之后重复:“我想使用OpenSSL”。

这个问题太严重了,太容易搞砸了,以至于每次你想解决它时都要自己动手。如果您在使用 OpenSSL 时遇到问题,请尝试通过对话和 OpenSSL 补丁来解决。

(没有人能避免搞砸它,即使是微软,甚至是 OpenSSL。使用您可以查看源代码并在出现问题时进行修补的东西。使用 OpenSSL。)

【讨论】:

  • 如果您对 Windows 如此着迷,那么您肯定必须拥有 MSDN 帐户和/或开发合同。如果是这样,这似乎正是我们付钱给微软来回答的那种问题。
  • 几乎,这是真正开发了解决方案的人可能会喜欢回答的问题。见上面我的 OpenSLL cmets
  • 不幸的是,OpenSSL 没有与 Windows Cryptography 存储集成,因此如果您拥有只能通过 WinSCrypt API 访问的安全 USB 令牌,那么 SChannel 是必不可少的。否则,OpenSSL 是更好的选择。
【解决方案4】:

您愿意为这种可编译的工作源代码支付多少费用?或者你期待有人把它给你吗? OpenSSL 的人已经做到了。很丑,但价格合适。

【讨论】:

  • 我的代码现在可用。价格一样,但我希望你觉得它不那么难看。
猜你喜欢
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 2014-04-23
相关资源
最近更新 更多