我用C编写了一个基于事件的网络库,现在我想通过OpenSSL添加SSL / TLS支持 . 我不想使用 SSL_read()
和 SSL_write()
,而是希望OpenSSL只执行传出/传入数据的加密/解密,让我自己传输/接收数据 .
我是SSL / TLS和OpenSSL的新手,所以:
有没有办法让OpenSSL只执行 char
数组的加密/解密?
像 size_t SSL_encrypt(const char *buf_in, size_t size_in, char *buf_out)
这样的东西会很棒 .
1 回答
正是你所要求的是不可能的,因为在TLS中,在应用层发送内容和在网络套接字上发送内容之间没有一对一的对应关系 . 重新协商等事件意味着SSL有时需要从网络读取数据以便在发送数据方面取得进展,反之亦然 .
但是,您仍然可以使用OpenSSL执行SSL,但要自己负责从网络读取和写入 . 您可以通过在
SSL
指针上调用SSL_set_bio()
而不是SSL_set_fd()
来执行此操作:使用BIO_new_bio_pair()创建连接的BIO对 . 一个BIO将由SSL例程读取和写入,另一个BIO将由您的应用程序读取和写入(允许它通过任何方法将数据传递到另一端) .
在新的SSL对象上使用SSL_set_bio()将读取和写入BIO都设置为生成的对中的一个BIO .
在对中的另一个BIO上使用
BIO_read()
和BIO_write()
来读取和写入SSL协议数据 .在SSL对象上正常使用
SSL_accept()
,SSL_connect()
,SSL_read()
和SSL_write()
.(目前尚不清楚这会给你的应用程序带来什么好处:在这种情况下你除了读写OpenSSL传递给你的东西之外你什么也做不了,所以你也可以让它做读书和写作) .