Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
C OpenSSL生成TLS警报:不支持的\u协议_C_Sockets_Ssl_Openssl_Wireshark - Fatal编程技术网

C OpenSSL生成TLS警报:不支持的\u协议

C OpenSSL生成TLS警报:不支持的\u协议,c,sockets,ssl,openssl,wireshark,C,Sockets,Ssl,Openssl,Wireshark,我正在尝试构建一个EAP-TLS客户端。我正在使用OpenSSL构建数据的TLS部分。由于EAP在较低的层上工作,所以我使用内存BIOs和OpenSSL,使用原始套接字将信息发送到Freeradius服务器。这是我生成客户机hello的代码 ctx = SSL_CTX_new(TLSv1_client_method()); SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL); ssl = SSL_new(ctx); rbio = BIO_new(BIO_

我正在尝试构建一个EAP-TLS客户端。我正在使用OpenSSL构建数据的TLS部分。由于EAP在较低的层上工作,所以我使用内存BIOs和OpenSSL,使用原始套接字将信息发送到Freeradius服务器。这是我生成客户机hello的代码

ctx = SSL_CTX_new(TLSv1_client_method());
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
ssl = SSL_new(ctx);
rbio = BIO_new(BIO_s_mem());
wbio = BIO_new(BIO_s_mem());
SSL_set_bio(ssl, rbio, wbio);
SSL_set_connect_state(ssl);
SSL_do_handshake(ssl);
readbytes = BIO_read(wbio, buf, BUF_SIZ);
这就是我试图将服务器的回复读入相同的
ssl

BIO_write(rbio, temp, numbytes);
SSL_do_handshake(ssl);
readbytes = BIO_read(wbio, read, BUF_SIZ); // read is a buffer

然而,当我尝试使用read中保存的数据发送数据包时,wireshark将数据包显示为:有人知道为什么会发生这种情况吗?这是因为RADIUS服务器的配置不正确吗?还是我在读取数据时出错了?根据我读到的,SSL\u do\u握手应该被调用,直到所有握手步骤都完成,所以我不认为这是一个错误。谢谢!完整数据包序列(使用筛选器EAP):

我已删除我的回答,因为我没有正确阅读您的问题。为什么在读取服务器的回复时再次进行SSL_握手?也许你应该给整个对话框一个pcap,而不是只给wireshark的一个图像,而不给以前的数据包任何上下文。编辑:)我不知道如何继续,这就是为什么尝试SSL_do_handshake(),这似乎也是合乎逻辑的。我是不是做错了?我没有看pcap的图片,因为pcap文件作为数据而不是图片会更好,我不想仅仅为了访问该文件而发送电子邮件。除此之外,“man SSL_握手:……如果连接处于客户端模式,握手将启动”。因此,它不会完成现有的握手,它将启动一个新的握手,这可能不是服务器所期望的。只有当BIO是非阻塞的时,您可能需要再次调用它以继续握手,但是您必须确保在再次调用它之前对SSL_ERROR_WANT_(READ | WRITE)做出正确的反应。好的,那么如何将服务器数据获取到SSL上下文?我看不到完整的代码,但因为您使用的是自己的缓冲区(BIO_s|mem)作为基础BIO,如果输出BIO中有内容,则必须将其写入服务器,如果收到SSL_ERROR_WANT_READ,则必须使用来自服务器的新数据填充输入BIO,然后才能再次调用SSL_握手。当然,只要SSL_握手返回错误,您就应该只重复调用SSL_握手。