Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
直接将字节写入OpenSSL连接,无需TCP_C_Ssl_Openssl_Radius - Fatal编程技术网

直接将字节写入OpenSSL连接,无需TCP

直接将字节写入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_

我正在实现一个支持EAP(PEAP)身份验证的服务器。RADIUS依赖于UDP,每个数据包将包含带有身份验证数据的EAP消息。为了简化,每个EAP(PEAP)消息都包含TLS数据包,因此客户机首先将发送一个包含TLS客户机握手的EAP数据包,服务器将处理该数据包,然后返回TLS服务器握手,依此类推

我已经能够通过TCP实现一个简单的TLS服务器,但我需要的是直接在SSL连接中写入TLS字节

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版本,它就是安全的(你说的“情况”是对的?)。