小编M.V*_*.V.的帖子

使用SNI在一个盒子中提供多个域

我在FreeBSD-8.2中使用OpenSSL 0.9.8q.我的系统上有3个虚拟主机,并希望在一台服务器上实现SNI以服务所有3个虚拟主机.

我每个都有3个单独的证书,在我的ssl-server代码中,我必须以某种方式找出客户端请求的域名是什么,并使用相应的证书文件.为此,我编写了一个名为的函数,get_ssl_servername_cb并将其作为回调函数传递给SSL_CTX_set_tlsext_servername_callback.这样,在回调函数中,我可以得到客户端请求的域名.

但我的问题是,这个回调函数正在执行函数后执行SSL_accept,但我必须在使用SSL_new命令之前选择并使用相应的证书,这是执行之前的方式SSL_accept.

所以我的问题是,我如何使用SSL_CTX_set_tlsext_servername_callbackSNI函数?

c openssl sni

4
推荐指数
1
解决办法
3260
查看次数

如何确定数据何时在 SSL 套接字上完成

我正在编写一个应用程序,该应用程序创建多个到 https 服务器的非阻塞 SSL 连接,在每个连接中我发送一个请求并读取服务器的响应。我的问题是,无论我做什么,我都无法确定响应数据何时完成。这是我负责发送和接收数据的代码的一部分:

....
fd_set connectionfds;
struct timeval timeout2;
FD_ZERO(&connectionfds);
FD_SET(socket_server, &connectionfds);
timeout2.tv_usec = 0;
timeout2.tv_sec = 1;
while(1)
{
    r=BIO_read(io,buf,BUFSIZZ-1);
    if (r>0){
        //gather data
        continue;
    }
    else if (SSL_get_error(ssl, r)==SSL_ERROR_WANT_READ){
        int ret = select(socket_server + 1, &connectionfds, NULL, NULL, &timeout2);
        if (ret <= 0){
            break;
        }
        continue;
    }
    else{
        break;
    }
}
// use whole gathered data
....
Run Code Online (Sandbox Code Playgroud)

我上面代码的问题是,如果我将 select timeout 设置的时间很短,我不能保证接收到所有数据(因为有些服务器真的很慢),如果我将超时设置为很长的时间(5-10 秒) ),我的套接字长时间处于等待状态,在此之前我无法使用响应。我试图通过使用“BIO_should_read()”或“BIO_pending()”函数来完成这项工作,但它们都没有给我想要的东西。那么,有没有办法确定什么时候在 SSL 套接字上没有其他东西可以读取?

c sockets ssl select timeout

1
推荐指数
1
解决办法
1246
查看次数

标签 统计

c ×2

openssl ×1

select ×1

sni ×1

sockets ×1

ssl ×1

timeout ×1