동일한 TLS 세션을 사용하여 데이터 연결로 FTPS 서버에 연결하는 방법
Apache Commons Net FTPS 구현은 TLS를 자동으로 재사용하지 않습니다. 특정 FTPS 서버에 연결할 때 데이터 연결을 위한 세션입니다. 이로 인해 데이터 연결을 시도할 때 TLS 핸드셰이크 오류가 발생할 수 있습니다.
데이터 연결이 제어 연결과 동일한 TLS 세션을 사용하는지 확인하려면:
@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)); } } } }
System.setProperty("jdk.tls.useExtendedMasterSecret", "false");
위 내용은 Apache Commons Net을 사용하여 FTPS에서 데이터 연결을 위해 TLS 세션을 재사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!