我正在尝试制作asio和SSL的朋友.一切顺利,但有一件事会造成不便:如何检测对等关闭连接,并将其与同行只是在发送数据中短暂休息时的情况区分开来,目的是在几秒钟之后继续它?
我的困惑来自这样一个事实,即普通套接字和SSL流的asio行为是不同的.如果我使用tcp :: socket - 我在对等关闭连接时收到EOF错误.但对于boost :: asio :: ssl :: stream - 事实并非如此.相反,async_read_some在传输字节时返回0,如果我尝试继续从SSL流中读取 - 返回short_error(http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/overview/core/ streams.html).
所以,问题是:它是预期的行为,还是我错误配置了什么?
客户端代码段:
class client
{
public:
// bla-bla-bla-bla-bla ....
//
void handle_write(const boost::system::error_code& error)
{
if (!error)
{
socket_.async_read_some(boost::asio::buffer(reply_, max_length),
boost::bind(&client::handle_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
else
{
std::cout << "Write failed: " << error.message() << "\n";
}
}
void handle_read(const boost::system::error_code& error,
size_t bytes_transferred)
{
std::cout << "Bytes transfered: " << bytes_transferred << "\n";
if …Run Code Online (Sandbox Code Playgroud) 如何使用TLS 保护Java SocketChannel,ServerSocketChannel或者甚至是a DatagramChannel?
有一个普通的socket服务器监听端口12345;
ServerSocket s = new ServerSocket(12345);
Run Code Online (Sandbox Code Playgroud)
我想知道的是:有可能:
http请求,服务器直接处理请求,https请求,服务器将客户端套接字更改为SSLSocket?谢谢
我正在开发一个我想要添加SSL的项目,所以我创建了一个简单的客户端/服务器测试实现,看看它是否有效,我得到一个NoSuchAlgorithmException.以下是我抛出异常的服务器代码:
import java.io.*;
import java.net.*;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.net.ssl.*;
public class SslServer
{
private static final int PORT = 5555;
public static void main(String[] args)
{
SecureRandom sr = new SecureRandom();
sr.nextInt();
try {
//client.public is the keystore file that holds the client's public key (created with keytool)
KeyStore clientKeyStore = KeyStore.getInstance("JKS");
clientKeyStore.load(new FileInputStream("client.public"), "clientpublicpw".toCharArray());
//server.private is the key pair for the server (created with keytool)
KeyStore serverKeyStore …Run Code Online (Sandbox Code Playgroud) 我们有一个 Java 17 Quarkus 应用程序编译为本机可执行文件 (ubi-quarkus-native-image:22.2-java17),在 Kubernetes 中运行。它使用 SSL 连接到旧的集成服务器,发出 HTTP 请求。我们的应用程序使用套接字工厂创建 SSLSocket 并连接它;请求成功。完成后,我们调用 SSLSocket#close。这也有效,但在另一边他们记录了这个:
12:51:16 : ssl_debug(58): Shutting down SSL layer...
12:51:16 : ssl_debug(58): Sending alert: Alert Warning: close notify
12:51:16 : ssl_debug(58): Read 15328 bytes in 3 records, 15214 bytes net, 5071 average.
12:51:16 : ssl_debug(58): Wrote 175 bytes in 1 records, 152 bytes net, 152 average.
12:51:16 : ssl_debug(58): Closing transport...
12:51:16 : ssl_debug(58): Waiting on peer close notify...
12:51:16 : ssl_debug(58): Received alert message: Alert Warning: …Run Code Online (Sandbox Code Playgroud) 我有一个很小的 TCP 应用程序,其中许多客户端连接到服务器,向其发送数据(通过 write() - 它们也发送消息大小),然后退出。我让客户端在发送完成后将 \0\0 发送到服务器 - 我这样做是为了如果服务器从 read() 得到一个零,那么它就知道客户端出了问题(比如 SIGKILL)。我的问题是 - 是否有任何编程方式(某些系统调用)来通知服务器我已完成发送 - 而不是服务器始终检查 \0\0 ?服务器在客户端/侦听套接字上使用 poll() 来检测是否有要读取的内容/新的连接请求,顺便说一句。
我应该发出信号吗?但我如何知道哪个描述符停止轮询呢?
我读过这篇文章,但其中的答案或多或少是我现在使用的
简单的服务器
listen = getServer();
Logger.getAnonymousLogger().info("Listening to "+listen.toString());
SSLSocket client = (SSLSocket)listen.accept();
// adding this line fixes everything - client.write(42);
client.close();
Run Code Online (Sandbox Code Playgroud)
和一个简单的客户
SocketFactory sockMaker = SSLSocketFactory.getDefault();
Socket server = sockMaker.createSocket("localhost", 1443);
int retval = server.getInputStream().read();
assert retval == -1;
server.close();
Run Code Online (Sandbox Code Playgroud)
如果我没有向SSL Socket写入任何内容,则会在客户端抛出异常:
Exception in thread "main" javax.net.ssl.SSLException:\
Received close_notify during handshake
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190)
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会这样.SSL/TLS规范是否要求您将内容写入套接字?
查看完整示例.