相关疑难解决方法(0)

boost :: asio和async SSL stream:如何检测数据/连接结束?

我正在尝试制作asio和SSL的朋友.一切顺利,但有一件事会造成不便:如何检测对等关闭连接,并将其与同行只是在发送数据中短暂休息时的情况区分开来,目的是在几秒钟之后继续它?

  • 提升1.48
  • OpenSSL 1.0.0e
  • 使用VS10编译为32位代码
  • 使用W7 x64.

我的困惑来自这样一个事实,即普通套接字和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)

ssl boost-asio

16
推荐指数
2
解决办法
8331
查看次数

Java.nio频道和TLS

如何使用TLS 保护Java SocketChannel,ServerSocketChannel或者甚至是a DatagramChannel

我知道有一些框架(#1 #2)可以做广告,但我想知道是否有可能仅使用纯Java标准库来实现这一点.

java ssl nio socketchannel

12
推荐指数
3
解决办法
1万
查看次数

是否可以将普通套接字更改为SSLSocket?

有一个普通的socket服务器监听端口12345;

ServerSocket s = new ServerSocket(12345);
Run Code Online (Sandbox Code Playgroud)

我想知道的是:有可能:

  1. 如果客户端发送http请求,服务器直接处理请求,
  2. 如果客户端发送https请求,服务器将客户端套接字更改为SSLSocket?

谢谢

java ssl

10
推荐指数
1
解决办法
1万
查看次数

抛出NoSuchAlgorithException的Java SSL代码

我正在开发一个我想要添加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 ssl

7
推荐指数
1
解决办法
3万
查看次数

如何安全地防止 SSLSocket 优雅关闭发送“用户已取消”警报

我们有一个 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)

java ssl graalvm

5
推荐指数
0
解决办法
283
查看次数

Unix 中的 TCP 套接字 - 通知服务器我已完成发送

我有一个很小的 ​​TCP 应用程序,其中许多客户端连接到服务器,向其发送数据(通过 write() - 它们也发送消息大小),然后退出。我让客户端在发送完成后将 \0\0 发送到服务器 - 我这样做是为了如果服务器从 read() 得到一个零,那么它就知道客户端出了问题(比如 SIGKILL)。我的问题是 - 是否有任何编程方式(某些系统调用)来通知服务器我已完成发送 - 而不是服务器始终检查 \0\0 ?服务器在客户端/侦听套接字上使用 poll() 来检测是否有要读取的内容/新的连接请求,顺便说一句。

我应该发出信号吗?但我如何知道哪个描述符停止轮询呢?

我读过这篇文章,但其中的答案或多或少是我现在使用的

unix sockets tcp

3
推荐指数
1
解决办法
1735
查看次数

打开和关闭SSLSocket没有写入任何数据时出错

简单的服务器

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规范是否要求您将内容写入套接字?

查看完整示例.

java sockets ssl

3
推荐指数
1
解决办法
7863
查看次数

标签 统计

ssl ×6

java ×5

sockets ×2

boost-asio ×1

graalvm ×1

nio ×1

socketchannel ×1

tcp ×1

unix ×1