首頁  >  文章  >  Java  >  如何透過 Apache Commons Net 重複使用 FTPS 中資料連線的 TLS 會話?

如何透過 Apache Commons Net 重複使用 FTPS 中資料連線的 TLS 會話?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-11 22:42:03282瀏覽

How to Reuse the TLS Session for Data Connections in FTPS with Apache Commons Net?

如何使用相同的TLS 會話透過資料連線連接到FTPS 伺服器

Apache Commons Net FTPS 實作不會自動重複使用TLS連接到某有些FTPS 伺服器時用於資料連線的會話。這可能會在嘗試資料連線時導致 TLS 握手錯誤。

確保資料連線使用與控制連線相同的TLS 工作階段:

  1. 檢查FTPS 是否伺服器支援TLS 會話重複使用: 某些伺服器(例如FileZilla Server )強​​制資料連線重複使用TLS 會話。
  2. 使用自訂程式碼重複使用工作階段: 您可以覆寫 _prepareDataSocket_ FTPSClient 類別中的方法來手動設定資料連線的會話。
@Override
protected void _prepareDataSocket_(final Socket socket) {
    if(preferences.getBoolean("ftp.tls.session.requirereuse")) {
        if(socket instanceof SSLSocket) {
            // Control socket is SSL
            final SSLSession session = ((SSLSocket) _socket_).getSession();
            if (session.isValid()) {
                final SSLSessionContext context = session.getSessionContext();
                context.setSessionCacheSize(preferences.getInteger("ftp.ssl.session.cache.size"));
                try {
                    final Field sessionHostPortCache = context.getClass().getDeclaredField("sessionsByHostAndPort");
                    sessionHostPortCache.setAccessible(true);
                    final Object cache = sessionHostPortCache.get(context);
                    final Method putMethod = cache.getClass().getDeclaredMethod("put", Object.class, Object.class);
                    putMethod.setAccessible(true);
                    Method getHostMethod;
                    try {
                        getHostMethod = socket.getClass().getMethod("getPeerHost");
                    } catch (NoSuchMethodException e) {
                        // Running in IKVM
                        getHostMethod = socket.getClass().getDeclaredMethod("getHost");
                    }
                    getHostMethod.setAccessible(true);
                    Object peerHost = getHostMethod.invoke(socket);
                    putMethod.invoke(cache, String.format("%s:%s", peerHost, socket.getPort()).toLowerCase(Locale.ROOT), session);
                } catch (NoSuchFieldException e) {
                    // Not running in expected JRE
                    log.warn("No field sessionsByHostAndPort in SSLSessionContext", e);
                } catch (Exception e) {
                    // Not running in expected JRE
                    log.warn(e.getMessage());
                }
            } else {
                log.warn(String.format("SSL session %s for socket %s is not rejoinable", session, socket));
            }
        }
    }
}
  1. 重寫 Spring Integration 的 createClientInstance(): 建立一個傳回具有 _prepareDataSocket_ 覆蓋的 FTPSClient。
  2. 將 jdk.tls.useExtendedMasterSecret 設定為 false(Java 8u161 及更高版本): 這是 JDK 8u161 中 SSLHandshakeException 的解決方法。
System.setProperty("jdk.tls.useExtendedMasterSecret", "false");

以上是如何透過 Apache Commons Net 重複使用 FTPS 中資料連線的 TLS 會話?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn