SSL_accept() 不工作

SSL_accept() Not Working

提问人:Display Name 提问时间:6/18/2014 最后编辑:Display Name 更新时间:6/19/2014 访问量:3121

问:

我已经研究了一段时间,但在任何地方都没有看到完全相同的问题。我只是遇到了一个具体的、非常简单的问题:每当我的echo_server尝试运行函数时,它都不会阻止等待客户端连接的服务器,函数只会返回 0,如果我进入,它会给我,所以我猜问题是,引用手册中的一句话,“观察到违反协议的 EOF。SSL_accept()SSL_get_error()SSL_ERROR_SYSCALL

事实是,我不知道这意味着什么,这真的很令人沮丧,因为我认为我错过了一些非常简单的东西,但我不知道是什么。

这是我的接受函数的代码(SSL_ctx之前初始化并打开了套接字):

SSL * sslconnection;

if((sslconnection = SSL_new(ctx)) == NULL){
    return NULL;
}

if(SSL_set_fd(sslconnection, socketd) != 1){
    return NULL;
}

if(SSL_accept(sslconnection) != 1){
    return NULL;
}

return sslconnection;

另外,我尝试使用“openssl verify -verbose -purpose sslserver -CAfile 'CACertificate' 'ServerCertificate'”检查我的证书,但它会说我的服务器证书没问题。

欢迎任何帮助,提前致谢。希望这是一件非常愚蠢的事情,我只是太模糊了,我看不到它。

C 套接字 SSL openSSL EOF

评论


答:

7赞 Maxim Egorushkin 6/18/2014 #1

每当我的echo_server尝试运行 SSL_accept() 函数时,它都不会阻止等待客户端连接的服务器

SSL_accept不召唤你。它期望已经调用了。acceptaccept

正确的调用顺序是:

  1. socket
  2. bind
  3. listen
  4. accept
  5. SSL_new
  6. SSL_set_fd
  7. SSL_accept

https://www.openssl.org/source/ 下载 openssl 源代码并查看 demos/ssl/serv.cpp。

评论

0赞 Display Name 6/18/2014
你救了我的命!在调用 accept() 并且服务器被阻止后,您怎么可能仍然可以执行诸如 SSL_new() 之类的操作?不会被屏蔽吗?或者这就是目的?我的意思是,在找到新连接之前阻止它,然后执行SSL部分?
0赞 Maxim Egorushkin 6/18/2014
@DisplayName 返回后,您有一个新的客户端连接,并且操作系统开始在后台接收来自客户端的数据(如果有)到内核套接字缓冲区中,您最终将使用 // 读取这些数据。acceptreadrecvrecvmsg