- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
为了理解SSL/TLS
,我在Windows-7
上下载了OpenSSL-1.0.2k
并用Cygwin编译
gcc
64 位
编译器。我从 OpenSSL server/client example in c 中获取了服务器/客户端的 现成
示例并用 cygwin gcc
编译。第一次编译就成功了。我使用以下命令从 cmd
执行服务器和客户端。
(Server) D:\>ssl-server.exe 5000
(Client) D:\>ssl-client.exe 127.0.0.1 5000
客户端没有任何响应退出,但另一方面,服务器显示它已建立连接,例如;
Connection: 127.0.0.1:50475
并无限期地等待下一行。
然后我开始调试服务器端,发现 void Servlet(SSL* ssl)
过程中的 SSL_accept()
返回值 -1
,这不是预期的。我查阅了 OpenSSL
的文档 openSSL DOC ;
The TLS/SSL handshake was not successful because a fatal error occurred either at the protocol level or a connection failure occurred. The shutdown was not clean. It can also occur of action is need to continue the operation for non-blocking BIOs. Call SSL_get_error() with the return value ret to find out the reason.
SSL_get_error()
返回 SSL_ERROR_SYSCALL
。我在这次调用后立即检查了 errno
的值,我看到 no error
。 Servlet
方法的完整代码如下。其余代码与链接中的相同。
void Servlet(SSL* ssl) /* Serve the connection -- threadable */
{ char buf[1024];
char reply[1024];
int sd, bytes;
const char* HTMLecho="<html><body><pre>%s</pre></body></html>\n\n";
int ret;
ret = SSL_accept(ssl); /* do SSL-protocol accept */
if ( ret == -1 )
{
// printf(" SSL_accept() returned -1\n");
switch(SSL_get_error(ssl, ret) )
{
case SSL_ERROR_SYSCALL:
perror("errno");
break;
default:
printf( "default" );
break;
}
exit(-1);
}
else if ( ret == 0)
{
printf(" SSL_accept() returned 0\n");
exit(-1);
}
else if ( ret == 1) // The TLS/SSL connection has been established.
{
ShowCerts(ssl); /* get any certificates */
bytes = SSL_read(ssl, buf, sizeof(buf)); /* get request */
if ( bytes > 0 )
{
buf[bytes] = 0;
printf("Client msg: \"%s\"\n", buf);
sprintf(reply, HTMLecho, buf); /* construct reply */
SSL_write(ssl, reply, strlen(reply)); /* send reply */
}
else
ERR_print_errors_fp(stderr);
}
sd = SSL_get_fd(ssl); /* get socket connection */
SSL_free(ssl); /* release SSL state */
close(sd); /* close connection */
}
最佳答案
SSL_get_error()
的值这样你就可以开始调试了。而不是只是举手。SSL_ERROR_SYSCALL
.你没有在你认为应该的地方捕获它,因为 case (SSL_ERROR_SYSCALL || SSL_ERROR_SSL || SSL_ERROR_WANT_CONNECT || SSL_ERROR_WANT_ACCEPT):
没有按照你的想法去做。它将变成 case 1
因为 ||
的语义.应该有单独的 case
每个值的语句。SSL_ERROR_SYSCALL
表示潜在错误在 errno
中,根据您自己引用的文档,这意味着您应该随后跟踪 that。而不是只是举手。请注意,您必须在调用任何其他系统调用(例如 write()
通过 printf()
)之前执行此操作,因此可能有助于保存 errno
立即。errno
直接与 printf("errno=%d\n", errno)
, 但打印错误消息会更有用,你可以用 perror()
或 printf("error=%s\n", strerror(errno))
.SSL_get_error()
的值不是 errno
值,而且您开始使用的原始 -1 也不是。一个errno
值来自 errno
变量。SSL_accept()
返回 -1,此处没有实际证据。所以完全有可能这里完全没有错误。
关于sockets - SSL_accept() 失败,返回值 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44259683/
我已经研究了一段时间,并没有在任何地方看到我完全相同的问题。我只是有一个特定的、非常简单的问题:每当我的 echo_server 尝试运行 SSL_accept() 函数时,它不会阻止服务器等待客户端
我制作了一个带有 SSL 和阻塞套接字的服务器。当我连接 telnet 时(因此它不进行握手),SSL_accept 会无限期地阻塞并阻塞每个新的握手/接受(以及根据定义的新连接)。 我该如何解决这个
我有一个需要升级到 SSL 通信的客户端/服务器通信。目前我有一个发送和接收 tcp 数据的网络套接字。 客户端向服务器发出一个 tcp connect()。 服务器已经实现了接受部分,接受连接后服务
我正在用 C++ 开发客户端和线程服务器,但我遇到了 OpenSSL/TLS 集成的问题。 到目前为止,我已经按照 ThriftServer.cpp 和 ThriftClient.cpp 进行了操作,
几天来,我一直在努力解决这个问题,想弄清楚它们是如何工作的。我已经阅读了文档并查看了一些示例,但我仍然需要指导。 具体来说,当客户端调用 connect() 并成功连接到服务器主机时,我是否应该在它之
我有一个工作的 C++ 系统,我在客户端和服务器之间使用 C openssl 库在两侧建立了 ssl 连接。 系统通过要求客户端证书作为连接的一部分来使用客户端身份验证。客户端证书是自签名的,由签署自
我已经搜索过 Stack Overflow 和互联网,但我无法找到为什么 ssl_accept() 不断返回的答案: [DEBUG] SSL_accept() : Failed with return
为了理解SSL/TLS,我在Windows-7上下载了OpenSSL-1.0.2k并用Cygwin编译 gcc 64 位 编译器。我从 OpenSSL server/client example in
我正在使用 openssl 在 C++ 中编写应用程序,但我似乎无法使 ssl 套接字连接正常工作。 我有一个抽象类,通过继承类使用各种协议(protocol)实现了多个功能,简单的 TCP 和 UD
我正在尝试创建一个客户端/服务器程序,但我发现继续使用数量稀少的 OpenSSL 文档有些困难。 我的问题:SSL_accept 在执行以下代码(简化)时抛出“无效参数”: SSL* ssl = SS
我是 SSL 套接字编程的新手,我的首要任务是让 SSL 服务器客户端正常工作和理解。 我已经获得了网络上的服务器和客户端源代码,并根据我的 openssl 库(从源代码编译)编译了它们。 当我启动服
SSL_accept(ssl) 200ms 正常吗? 作为 Windows 服务运行,用 C++ 编写,使用 MFC 和 Boost。在英特尔至强 e5620 2.4G、4GB 内存和 Win 7 P
我们有 3 个人致力于将 SSL 添加到基于 epoll 的服务器,但在 3 天的沮丧之后,我们决定向全世界寻求帮助。 问题是 SSL_accept() 总是返回 SSL_ERROR_WANT_REA
我使用 Delphi 10.1 Update 2 和 Indy 10.6.2.5341。 我们在 SSL_accept 中遇到访问冲突。如果使用 SSL 设置 TIdTCPServer 并且在 TId
我正在尝试写入 openssl 服务器,但 SSL_Accept 失败并出现错误:FFFFFFFF:lib(255):func(4095):reason(4095)。这个错误代码是什么意思?如何获取
我在尝试接受来自客户端应用程序的 SSL 连接时收到以下错误。我在 HP-UX IA 上使用 openssl 版本 0.9.8。 SSL_accept(40107e50) -1 err: 336285
我是一名优秀的程序员,十分优秀!