C中的SSL包装器流

时间:2009-12-03 18:44:48

标签: c ssl openssl

我在C中有一个简单的stream_t类型,具有基本的读/写操作,并且使用函数指针支持多个底层实现。因此,流可以由文件,char缓冲区等支持。

一种流类型是标准POSIX套接字,我想编写一个包装流,它将为现有流添加SSL支持,类似于.NET的SslStream。所以我可以这样写:

stream_t *socket = something();

// wrap existing stream and perform handshake as client
stream_t *ssl_stream = ssl_stream_create(socket);
ssl_stream_authenticate_as_user(ssl_stream);

// now all read/writes are encrypted and passed through to the wrapped stream

我在使用OpenSSL BIO_new_connect(...)之前编写了一些SSL套接字代码,但这是一个比我需要的更高级别的API。 OpenSSL是否公开了手动执行握手和加密所需的功能?或者我可以使用其他一些库吗?

2 个答案:

答案 0 :(得分:1)

我使用BIO_s_mem作为SSL套接字操作的封面。我会自己读取并写入套接字(而不是给OpenSSL提供句柄并让它进行读/写)。当您调用SSL_accept(在服务器端)或SSL_connect(在客户端)时,握手完成。除此之外,只需致电SSL_readSSL_write进行阅读和写作。

答案 1 :(得分:1)

我不知道你可以使用任何库,但你可以找到大量的样本。 C中的大多数应用程序必须对其TCP代码执行相同的操作,因此SSL和原始套接字版本不会有太大差异。

例如,从Pine IMAP中查看ssl_unix.c,

https://svn.cac.washington.edu/public/alpine/snapshots/imap/src/osdep/unix/

它完全符合您使用OpenSSL描述的内容。