【问题标题】:SSL BIO and FFISSL BIO 和 FFI
【发布时间】:2013-01-01 04:45:15
【问题描述】:

我在 Haskell 中有一个流式 API(与 OpenSSL 的 BIO 不同),我想将 SSL/TLS“代理”注入其中。更具体地说,假设我有一个网络模型

Server| <---> |Logger>| <---> |<Logger| <---> |Client

(我在这里写 Logger> 表示“下游”记录器)并且我想编写一个 FFI 来调用 OpenSSL 以将 TLS 注入此处的中心

Server| <---> |Logger>| <---> |TLS>| <---> |<TLS| <---> |<Logger| <---> |Client

这样TLS><TLS 之间的通信就会被加密。可以让我构建<TLS 的最简单的 OpenSSL 接口是什么?那么,构建TLS>最简单的接口是什么?

换句话说,我的项目与我读过的大多数教程都不同,因为我希望能够同时使用 SSL 结构 BIO_getsBIO_puts。这类似于我为 SSL 客户端连接管理自己的传输,但“传输”是通过将 C 指针向上提升到 Haskell 来执行的。

(我确信我完全遗漏了有关 SSL+BIO 交互的基本知识。)


来自http://www.openssl.org/docs/crypto/BIO_s_bio.html 我看到一个应用程序,就像我正在拍摄的那样:

BIO *internal_bio, *network_bio;
...
BIO_new_bio_pair(internal_bio, 0, network_bio, 0);
SSL_set_bio(ssl, internal_bio, internal_bio);
SSL_operations();

这似乎大致正确。我可以在network_bio 上同时使用putsgets

【问题讨论】:

    标签: c haskell ssl openssl


    【解决方案1】:

    如果您的项目不需要 openssl 并且您可以使用任何 TLS 库, 您可以使用更简单的tls,它更好地与Haskell 集成,并通过Backend 类型内置了对自定义传输的支持。这将比通过 Haskell 处理 openssl 低级 API 简单得多。

    【讨论】:

    • 虽然这有点像图书馆的广告,但非常真实。让 OpenSSL 在非*NIX 平台上工作很麻烦,而纯 Haskell tls 包可以在 Haskell 工作的任何地方工作。顺便说一句,它也更容易扩展。 OpenSSL 是一个该死的单片混乱,而 tls 将许多任务(加密、散列、编组)委托给其他包。
    • 是的,我最初是出于这个原因建议的;很多年前,我不得不在 OCaml 中处理 openssl,这不是一次愉快的经历。 tls 不一定是众所周知的,很多人都在尝试处理 openssl,因为这是他们唯一知道的;但是我现在才意识到,同一个人在他在这里发帖前几个小时在 tls 错误跟踪器上打开了一个错误,所以他可能知道 tls,因此我的提议有点不合适,我没有帮助解决他的问题。对不起!
    • 哦,嗨!我首先尝试了tls,但是 TLS 是在通信流、一些固定的证书/密钥状态和随机生成的上下文中的纯计算,所以我不想绑定到 IO monad 并且不得不担心异常。我试图在tls 的分支上稍微解除 IO 限制,但这似乎是一个比仅仅解除纯 C 计算更复杂的项目。最后,我不太关心跨平台兼容性,并且可以更轻松地捍卫一个古老的、经过严格审查的安全库。由于这些原因,tls 并不合适。
    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 2018-04-20
    • 2012-06-13
    • 2019-03-26
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多