LDAPServer 和 LDAPClient、客户端和服务器使用 TLS 相互连接并且工作正常,但我有一些用例只停止 TLS 连接并使用相同的 TCP 连接与 LDAPserver 通信
在我的 ldapperl 客户端代码下面,只停止 TLS 连接,
my $socket = $ldapSrvr->socket();
print $socket;
print "\n";
my $host = $ldapSrvr->host();
print $host;
print "\n";
my $ssl = ${*$socket}{'_SSL_object'};
print $ssl;
print "\n";
my $s1 = Net::SSLeay::shutdown($ssl);
print "s1 : $s1";
print "\n";
my $s2 = Net::SSLeay::shutdown($ssl);
print "SSL socket is shutdown : $s2";
print "\n";
${*$socket}{'_SSL_opened'} = 0;
my $t = &Net::SSLeay::clear(${*$socket}{'_SSL_object'});
&Net::SSLeay::print_errs();
untie(*$socket);
和服务器端停止唯一的 tls 连接。
LOG("SSLConnection::disconnect");
boost::system::error_code ec;
m_sslSocket.shutdown(ec);
LOG("[Comms] errorcode while SSLshutdown : ",ec);
LOG("[Comms] SSL socket is closed");
但它也正在关闭 TCP 连接。 当客户端向服务器发送 sslconnection close 请求时,服务器正在向客户端发送 FIN ACK 并且 TCP 连接正在关闭。 有人能告诉我为什么会这样吗
最佳答案
你不...
只需要关闭套接字时关闭ssl套接字。
如果您希望直接与 tcp 套接字通信,那么您需要做的就是使用“next_layer()”成员获取底层套接字类并以这种方式发送它。
例如
m_sslSocket.next_layer().async_send(...);
因此,从降级点开始,您必须记住通过 next_layer() 方法进行所有套接字访问。
请记住,只有当您连接到的服务器知道您已退回使用流作为非 ssl 流(我假设通过某种协议(protocol)支持)时,这才会起作用。我从未见过这种情况,我看到相反的情况,STMP 协议(protocol)连接为非安全连接,然后将其转换为安全连接 STARTTLS命令。不建议这样做,因为它允许中间人攻击停止对话以保护通信。我认为这同样适用于降级连接。
关于ssl - 仅关闭 TLS 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44149513/