直接将字节写入OpenSSL连接,无需TCP
我正在实现一个支持EAP(PEAP)身份验证的服务器。RADIUS依赖于UDP,每个数据包将包含带有身份验证数据的EAP消息。为了简化,每个EAP(PEAP)消息都包含TLS数据包,因此客户机首先将发送一个包含TLS客户机握手的EAP数据包,服务器将处理该数据包,然后返回TLS服务器握手,依此类推 我已经能够通过TCP实现一个简单的TLS服务器,但我需要的是直接在SSL连接中写入TLS字节直接将字节写入OpenSSL连接,无需TCP,c,ssl,openssl,radius,C,Ssl,Openssl,Radius,我正在实现一个支持EAP(PEAP)身份验证的服务器。RADIUS依赖于UDP,每个数据包将包含带有身份验证数据的EAP消息。为了简化,每个EAP(PEAP)消息都包含TLS数据包,因此客户机首先将发送一个包含TLS客户机握手的EAP数据包,服务器将处理该数据包,然后返回TLS服务器握手,依此类推 我已经能够通过TCP实现一个简单的TLS服务器,但我需要的是直接在SSL连接中写入TLS字节 SSLConn_init_thread(); SSL_load_error_strings(); ERR_
SSLConn_init_thread();
SSL_load_error_strings();
ERR_load_crypto_strings();
SSL_library_init();
SSL_CTX *ctx;
...
ctx = SSL_CTX_new(SSLv23_server_method());
SSL_CTX_use_PrivateKey(...);
SSL_CTX_use_certificate(...);
ssl = SSL_new(ctx); // I want to read/write TLS packets directly with this object
我已经研究过OpenSSL,但它没有很好的文档记录。在指南中说,人们可以使用带有SSL读取和SSL写入的SSL\u set\u accept\u state()
如果您有任何关于在不依赖TCP的情况下处理OpenSSL连接的建议,我将不胜感激。我最终阅读了这本书,发现这正是我所需要的
使用OpenSSL的网络安全性
内存BIO将内存段视为文件或套接字,可以使用
BIO_s_mem获取适合与BIO_new和BIO_set一起使用的BIO_方法对象
BIO_s_mem()返回memory BIO method函数
内存BIO是使用内存进行I/O的源/汇BIO。写入内存BIO的数据存储在BUF_MEM结构中,该结构可适当扩展以容纳存储的数据
任何写入内存的数据都可以通过读取来调用。除非内存BIO是只读的,否则从中读取的任何数据都将从BIO中删除
基本上,您可以使用内存BIOs将加密数据直接读/写到SSL连接:
// setup SSL_context...
ssl = SSL_new(ctx);
// Create read/write BIOs
rbio = BIO_new(BIO_s_mem());
wbio = BIO_new(BIO_s_mem());
SSL_set_bio(ssl, rbio, wbio);
if (/* Server */) {
SSL_set_accept_state(ssl);
} else {
SSL_set_connect_state(ssl);
}
要从BIOs中删除,请执行以下操作:
BIO_read(wbio, buffer, strlen(buffer));
BIO_write(wbio, buffer, strlen(buffer));
在ascii图表中,字节流循环是这样的。SSL_读取/SSL_写入用于将未加密字节传入/传出SSL对象,而BIO_读取/BIO_写入用于将相应的加密字节传入/传出SSL对象。然后由您通过网络连接传输加密的字节
SSLConn_init_thread();
SSL_load_error_strings();
ERR_load_crypto_strings();
SSL_library_init();
SSL_CTX *ctx;
...
ctx = SSL_CTX_new(SSLv23_server_method());
SSL_CTX_use_PrivateKey(...);
SSL_CTX_use_certificate(...);
ssl = SSL_new(ctx); // I want to read/write TLS packets directly with this object
()
+----++-----+
|……读取(fd)-->BIO写入(rbio)-->………-->-->SSL读取(SSL)-->IN
|......| |.....|
|.sock.| |.SSL|
|......| |.....|
|……请查看BIO_new和SSL_set_BIO您正在寻找的DTL或。请参阅OpenSSL用户列表。@noloader谢谢,但TLS数据不会直接进入UDP数据报,而是进入RADIUS EAP消息(通过UDP传输)。@SteffenUllrich谢谢,我正在研究这一点,这似乎是正确的做法。这个问题出了问题。没有“TLS数据包”这样的东西。TLS是在TCP上分层的,TCP是一种字节流协议。TLS协议数据单元到数据包的映射完全是任意的。在这种情况下,你确定这个解决方案是安全的吗?好吧,只要你有一个不易受攻击的OpenSSL版本,它就是安全的(你说的“情况”是对的?)。