当我们完成响应的传送,我们需要发送一个close_notify。如前所述,这是通过SSL_shutdown()完成的。不幸的是,当server先关闭时事情会有一些麻烦,我们第一次调用SSL_shutdown()时发送了close_notify但是另一端却没有处理它。因此,它会立刻返回一个0,表明关闭动作并没有完成。这样的话,程序就必须再次调用SSL_shutdown()。
这里可能会有两种看法:
1. 我们已经得到了我们关心的所有HTTP请求。我们不在关心其他的任何事情。因此,我们不关心client是否发送了close_notify。
2. 我们严格遵守协议,并且希望其他人也如此。所以,我们需要一个close_notify。
如果我们拥有第一种态度,那么就简单多了:我们调用SSL_shutdown()发送close_notify然后立刻退出,不管client是否发送了close_notify。如果我们抱着第二种态度,那么事情就会变得复杂得多,因为client经常表现的不正常。
我们面对的第一个问题是通常client不发送close_notify。事实上,一些client在他们读取了整个HTTP回应后立刻关闭连接(一些版本的IE正是如此)。当我们发送close_notify,另一端会发送一个TCP_RST字段,这时程序会捕捉到SIGPIPE。我们在initialize_ctx()中安装一个假的SIGPIPE句柄来避免这种情况的发生。
我们面对的第二个问题是client可能不会立刻发送close_notify以回应我们发出的close_notify。一些版本的Netscape要求你先发送一个TCP FIN。因此,我们在第二次调用SSL_shutdown()之前调用shutdown(s,1)。当把“how”这个参数设置为1后,shutdown()会发送FIN并且不关闭socket。server端的shutdown如下:
r=SSL_shutdown(ssl);
if(!r){
/* If we called SSL_shutdown() first then
we always get return value of ’0’. In
this case, try again, but first send a
TCP FIN to trigger the other side’s
close_notify*/
shutdown(s,1);
r=SSL_shutdown(ssl);
}
switch(r){
case 1:
break; /* Success */
case 0:
case -1:
default:
berr_exit("Shutdown failed");
}
分享到:
相关推荐
9. 关闭连接:在完成通信后,使用`SSL_shutdown()`和`close()`关闭连接。 在"sslClient"项目中,流程大致相同,但会从客户端的角度进行: 1. 初始化OpenSSL库。 2. 创建SSL上下文,这次是客户端上下文。 3. 设置...
8. **关闭连接**:使用`SSL_shutdown()`优雅地关闭SSL连接,然后关闭SOCKET。 在提供的压缩包文件中,`cli.cpp`很可能是实现上述步骤的源代码。开发者可能已经编写了一个简单的SSL客户端示例,演示了如何使用...
10. 关闭连接:完成数据传输后,调用`SSL_shutdown()`和`close()`关闭连接。 **SSL服务器(ssl_server.c)** SSL服务器程序则是等待客户端连接并提供安全服务的一端,其流程大致如下: 1. 同样进行OpenSSL库的初始...
9. **关闭SSL连接**:当通信完成后,调用`SSL_shutdown`进行安全关闭,然后关闭套接字。 10. **清理资源**:最后,释放SSL对象和SSL_CTX对象,释放占用的内存资源。 在压缩包文件中,"client"和"server"可能分别...
9. **关闭连接**:当通信结束时,先使用`SSL_shutdown()`进行关闭前的清理,然后关闭TCP套接字。 在"Client"这个子文件中,可能包含了实现上述步骤的C代码示例,包括头文件、变量声明、函数调用等。通过阅读和理解...
6. **关闭连接**:当通信结束时,应用`SSL_shutdown()`来关闭SSL连接,然后再关闭TCP套接字。 在"IO-Socket-SSL-0.999"这个压缩包中,可能包含的文件有源代码、示例程序、文档、测试脚本等,它们可以帮助开发者学习...
9. **清理资源**:在完成通信后,使用`SSL_shutdown()`关闭连接,最后使用`SSL_CTX_free()`释放SSL上下文。 在Windows 64位环境下,开发者需要特别注意库文件的兼容性问题,确保使用的库与编译的目标平台一致。不...
`ssl_free`函数用于释放分配的资源,包括调用`SSL_shutdown`关闭SSL连接,如果`shutdown`标志被设置,还会调用`SSL_free`释放SSL句柄,并清理`BIO`结构。 `ssl_read`函数执行SSL的读操作。它首先检查是否已完成SSL...
7. **关闭连接**:当通信结束,使用 `SSL_shutdown()` 来优雅地关闭连接,并释放相关资源。 在“openssl-example-master”压缩包中的客户端和服务器端源码,可以帮助开发者了解如何在实际项目中运用这些步骤。通过...
- `SSL_shutdown()`: 安全地关闭SSL连接。 5. **数据传输** - `SSL_write()`: 向SSL连接写入数据。 - `SSL_read()`: 从SSL连接读取数据。 6. **错误处理** - `ERR_get_error()`: 获取最近的错误代码。 - `ERR...
11. SSL/TLS 协议关闭:使用 `SSL_shutdown` 函数关闭 SSL/TLS 协议,並释放资源。 在 OpenSSL 编程实例复习过程中,我们需要了解这些重要知识点,以便正确地使用 OpenSSL 库实现加密和解密功能。
6. **关闭和清理**:当不再需要连接时,执行`SSL_shutdown`来优雅地结束SSL会话,然后关闭TCP连接,最后释放`SSL_CTX`和`SSL`对象。 在实际应用中,这样的类可能还会处理异常情况,比如证书验证失败、网络中断、...
SSL_shutdown(ssl); SSL_free(ssl); SSL_CTX_free(ctx); close(socket_fd); ``` 以上是使用C++和OpenSSL库连接HTTPS的基本步骤。实际应用中,可能还需要处理更复杂的情况,如错误处理、证书验证、异步IO等。文件...
9. 关闭连接:完成数据传输后,通过`SSL_shutdown()`和`close()`关闭SSL连接和套接字。 客户端(SSLClient)的行为则相对简单,主要是发起连接、进行SSL握手并传输数据: 1. 初始化OpenSSL库和创建SSL上下文,与...
5. **关闭和清理**:当不再需要OpenSSLSocketImpl时,必须正确关闭连接并释放OpenSSL资源,通常通过调用SSL_shutdown()和SSL_free()完成。 深入理解OpenSSLSocketImpl类对于开发涉及安全网络通信的应用至关重要,...
9. **关闭连接**:在完成通信后,记得调用`SSL_shutdown()`和`SSL_free()`来清理资源并关闭连接。 10. **错误处理**:OpenSSL提供了一套错误栈机制,通过`ERR_print_errors_fp()`或`ERR_error_string_n()`来输出...
10. **关闭连接**:完成通信后,使用`SSL_shutdown`和`close`函数安全地关闭SSL连接和socket。 在iOS平台上,由于苹果的安全策略,通常会推荐使用更高级别的接口如CFNetwork或NSURLSession来处理HTTPS请求。然而,...
而在 `BIO_free` 函数中,如果初始化成功并且存在SSL句柄,会调用 `SSL_shutdown` 和 `SSL_free` 来关闭连接并释放资源。 `ssl_read` 函数是处理从SSL连接读取数据的关键部分。它首先清除重试标志,然后尝试从SSL...
9. **SSL_shutdown()**:关闭SSL连接,清理资源。 **三、OpenSSL的使用场景** OpenSSL库广泛应用于各种需要加密通信的场景,如: 1. **Web服务器**:大多数HTTPS网站都依赖于OpenSSL来实现安全的HTTP传输。 2. *...