首頁>Program>source

我想用Java實現SSL代理.我基本上打開了两个插座 browser-proxyproxy-server ,並執行两个將寫入 proxy-server的執行緒 他们从 browser-proxy讀到的內容 ,反之亦然.每个執行緒如下所示:

while (true) {
   nr = in.read(buffer);
   if (nr == -1) System.out.println(sockin.toString()+" EOF  "+nr);
   if (nr == -1) break;
   out.write(buffer, 0, nr);
}
sockin.shutdownInput();
sockout.shutdownOutput(); // now the second thread will receive -1 on read

每个執行緒只会關闭輸入套接字,因此最终两个套接字都將關闭。

但是,如果我想使用 SSLSocket,该怎麼办? ? 看来, shutdownOutput/Input 那裏不支援方法.這是我得到的例外。

Exception in thread "Thread-35" java.lang.UnsupportedOperationException: \
The method shutdownInput() is not supported in SSLSocket
    at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.shutdownInput(Unknown Source)

我想到的是:

try {
    while (true) {
       nr = in.read(buffer);
       if (nr == -1) System.out.println(sockin.toString()+" EOF  "+nr);
       if (nr == -1) break;
       out.write(buffer, 0, nr);
    }
    // possible race condition if by some mysterious way both threads would get EOF
    if (!sockin.isClosed()) sockin.close();
    if (!sockout.isClosed()) sockout.close();
} catch (SocketException e) {/*ignore expected "socket closed" exception, */}

每次套接字結束時,我都必须捕获並忽略套接字異常結束。

我的問题是:

  1. 如果 shutdownInput() 不被支援,我怎麼得到一个 -1 来自 SSLSocket的迴答 .
  2. 對我的痛苦有更好的解決方案吗? 我认為没有任何理智的問题,因為其中一个執行緒可能已经在阻塞的 read中 当另一个執行緒將他標記為"我完成"時的方法.我唯一能將他踢出阻塞執行緒的方法是關闭套接字並引發" closed socket"異常。

    (您可能会猜想使用多執行緒訊息傳遞和異步資料讀取的某種不合時宜的組合来表示另一个執行緒您的工作已完成,但這太可怕了,我担心IntelliJ的风格警察会紧隨我後 考虑一下...)

Clarification: 我知道那个 和 shutdownInput 没有任何意義,因為按照規範,您不能使用半双工TLS連線.但是鉴於此,我该如何在Java中终止TLS連線而不会出現異常?

請不要告诉我 shutdownOutput 對於TLS没有意義.我知道, shutdownIput .我在問我還能用什麼来關闭 this is not what I'm asking 正確(因此,標题為"正確關闭SSLSocket"。

SSLSocket
最新回復
  • 12天前
    1 #

    這是我的第一个(臨時删除的)答案,但是顯然還不够好,因為它很快被-2處理了……我想我應该添加更多的解釋。

    無法關闭SSL / TLS套接字的一半連線以符合TLS協議的要求,這在關闭警報部分中指定。

    The client and the server must share knowledge that the connection is ending in order to avoid a truncation attack. Either party may initiate the exchange of closing messages.

    close_notify 此訊息通知收件人發件人不会 在此連線上發送更多訊息.如果在没有適当的close_notify訊息(警告級別)的情况下终止任何連線,則会话將無法恢複。

  • 12天前
    2 #

    用於關闭連線的SSL語義不同於TCP,因此shutdownInput和shutdownOutput毫無意義,至少在SSLSocket中可用的控製級別上没有意義. SSLSocket基本上减轻了SSL記錄處理和SSL握手訊息處理的負担.它還處理SSL警報處理,並且這些警報之一是close_notify警報.這是RFC 2246中有關此警報含義的文字。

    shutdownInput()
    

    Java確實為自杀者提供了另一个API,即SSLEngine API.不要觸摸它,它会伤害您。

  • 12天前
    3 #

    為了解決您的問题,您必须執行以下操作:

    shutdownOutput()
    

    在另一端,从套接字讀取的一方將收到-1-length訊息,而不是丟擲SocketException。

    close_notify

  • java:如何基於Content-type添加响應頭; 在提交响應之前获取Content-type
  • symfony:使用事件监听器重定向所有"找不到路由404找不到-NotFoundHttpException"