पर्यावरण: मैं स्प्रिंग इंटीग्रेशन 4.1.6 का उपयोग कर 64-बिट विंडोज 7 पर सन जावा जेडीके 1.8.0_60 का उपयोग कर रहा हूं (जो आंतरिक रूप से एफटीपीएस एक्सेस के लिए अपाचे कॉमन्स नेट 3.3 का उपयोग करने लगता है)।उसी टीएलएस सत्र का उपयोग कर डेटा कनेक्शन के साथ एफटीपीएस सर्वर से कैसे कनेक्ट करें?
मैं अपने आवेदन के साथ हमारे क्लाइंट के एफटीपीएस सर्वर से स्वचालित डाउनलोड को एकीकृत करने का प्रयास कर रहा हूं। मैंने मुद्दों के बिना अन्य ग्राहकों के लिए किसी भी परेशानी के बिना स्प्रिंग इंटीग्रेशन का उपयोग करके एसएफटीपी सर्वरों के साथ सफलतापूर्वक ऐसा किया है, लेकिन यह पहली बार है जब क्लाइंट को हमें एफटीपीएस का उपयोग करने की आवश्यकता होती है, और इसे कनेक्ट करने के लिए बहुत परेशानी होती है। मेरे असली एप्लिकेशन में, मैं एक्सएमएल बीन्स का उपयोग करके वसंत एकीकरण को कॉन्फ़िगर कर रहा हूं, यह समझने की कोशिश करने के लिए कि मैं क्या काम नहीं कर रहा हूं, मैं निम्नलिखित परीक्षण कोड का उपयोग कर रहा हूं (हालांकि मैं यहां वास्तविक होस्ट/उपयोगकर्ता नाम/पासवर्ड को अनामित कर रहा हूं):
final DefaultFtpsSessionFactory sessionFactory = new DefaultFtpsSessionFactory();
sessionFactory.setHost("XXXXXXXXX");
sessionFactory.setPort(990);
sessionFactory.setUsername("XXXXXXX");
sessionFactory.setPassword("XXXXXXX");
sessionFactory.setClientMode(2);
sessionFactory.setFileType(2);
sessionFactory.setUseClientMode(true);
sessionFactory.setImplicit(true);
sessionFactory.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());
sessionFactory.setProt("P");
sessionFactory.setProtocol("TLSv1.2");
sessionFactory.setProtocols(new String[]{"TLSv1.2"});
sessionFactory.setSessionCreation(true);
sessionFactory.setCipherSuites(new String[]{"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"});
final FtpSession session = sessionFactory.getSession();
//try {
final FTPFile[] ftpFiles = session.list("/");
logger.debug("FtpFiles: {}", (Object[]) ftpFiles);
//} catch (Exception ignored) {}
session.close();
मैं सभी टीएलएस डीबगिंग जानकारी मुद्रित करने के लिए -Djavax.net.debug=all
के साथ इस कोड को चला रहा हूं।
FTPS सर्वर से मुख्य "नियंत्रण" कनेक्शन ठीक काम करता है, लेकिन जब यह सूची (या किसी अन्य डेटा कनेक्शन मैं कोशिश की है) के लिए डेटा कनेक्शन खोलने की कोशिश करता है, मैं एक javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
, java.io.EOFException: SSL peer shut down incorrectly
की वजह से मिलता है। अगर मैं uncomment निगलने-अपवाद session.list
आदेश के आसपास ब्लॉक को पकड़ने, तो मैं (javax.net.debug उत्पादन हालांकि) देख सकते हैं कि सर्वर डेटा कनेक्शन एसएसएल हाथ मिलाना अस्वीकृत करने के बाद निम्न संदेश भेजा:
main, READ: TLSv1.2 Application Data, length = 129
Padded plaintext after DECRYPTION: len = 105
0000: 34 35 30 20 54 4C 53 20 73 65 73 73 69 6F 6E 20 450 TLS session
0010: 6F 66 20 64 61 74 61 20 63 6F 6E 6E 65 63 74 69 of data connecti
0020: 6F 6E 20 68 61 73 20 6E 6F 74 20 72 65 73 75 6D on has not resum
0030: 65 64 20 6F 72 20 74 68 65 20 73 65 73 73 69 6F ed or the sessio
0040: 6E 20 64 6F 65 73 20 6E 6F 74 20 6D 61 74 63 68 n does not match
0050: 20 74 68 65 20 63 6F 6E 74 72 6F 6C 20 63 6F 6E the control con
0060: 6E 65 63 74 69 6F 6E 0D 0A nection..
ऐसा प्रतीत होता है (और यह मेरा पहला समय एफटीपीएस से निपट रहा है, हालांकि मैंने पहले सादे एफ़टीपी के साथ निपटाया है) यह है कि सर्वर नियंत्रण और डेटा कनेक्शन दोनों पर प्रमाणीकरण और एन्क्रिप्शन सुनिश्चित करता है कि "सामान्य" नियंत्रण कनेक्शन और प्रमाणीकरण स्थापित करने के लिए टीएलएस कनेक्शन वहां होता है, प्रत्येक डेटा कनेक्शन के लिए क्लाइंट को उसी टीएलएस सत्र से कनेक्ट करने की आवश्यकता होती है। यह मुझे समझ में आता है कि यह कैसे काम किया जाना चाहिए, लेकिन अपाचे कॉमन्स नेट एफटीपीएस कार्यान्वयन ऐसा नहीं लगता है। ऐसा लगता है कि एक नया टीएलएस सत्र स्थापित करने की कोशिश कर रहा है, और इसलिए सर्वर प्रयास को खारिज कर रहा है।
this question about resuming SSL sessions in JSSE के आधार पर, ऐसा प्रतीत होता है कि जावा प्रत्येक होस्ट/पोस्ट संयोजन के लिए एक अलग सत्र मानता है या आवश्यक है। मेरी परिकल्पना यह है कि चूंकि एफटीपीएस डेटा कनेक्शन नियंत्रण कनेक्शन की तुलना में एक अलग बंदरगाह पर है, इसलिए यह मौजूदा सत्र नहीं ढूंढ रहा है और एक नया स्थापित करने की कोशिश कर रहा है, इसलिए कनेक्शन विफल हो जाता है।
- सर्वर नियंत्रण पोर्ट पर के रूप में डेटा बंदरगाह पर एक ही टीएलएस सत्र की आवश्यकता होती है में FTPS मानक का पालन नहीं कर रहा है:
मैं तीन मुख्य संभावनाओं को देखने। मैं FileZilla 3.13.1 का उपयोग कर सर्वर ठीक से कनेक्ट कर सकता हूं (उसी होस्ट/उपयोगकर्ता/पासवर्ड का उपयोग कर रहा हूं क्योंकि मैं अपने कोड में उपयोग करने की कोशिश कर रहा हूं)। सर्वर लॉगिन पर खुद को "फाइलज़िला सर्वर 0.9.53 बीटा" के रूप में पहचानता है, इसलिए शायद यह चीजों को करने का कुछ प्रकार का मालिकाना फाइलज़िला तरीका है, और एक ही टीएलएस सत्र का उपयोग करने के लिए जावा को मनाने के लिए मुझे कुछ अजीब बात है।
- अपाचे कॉमन्स नेट क्लाइंट वास्तव में एफटीपीएस मानक का पालन नहीं करता है, और केवल कुछ सबसेट की अनुमति देता है जो डेटा कनेक्शन को सुरक्षित करने की अनुमति नहीं देता है। यह अजीब लगेगा, क्योंकि यह जावा के भीतर से एफटीपीएस से कनेक्ट करने का मानक तरीका प्रतीत होता है।
- मैं पूरी तरह से कुछ खो रहा हूं और इसे गलत तरीके से याद कर रहा हूं।
मैं इस तरह के एफटीपीएस सर्वर से कनेक्ट करने के तरीके के बारे में किसी भी दिशा की सराहना करता हूं। धन्यवाद।
में झूठी करने के लिए EXExtendedMasterSecret का उपयोग करें विवरण के लिए कृपया इस लिंक को देखें https://stackoverflow.com/questions/46631315/when-using-java-apache-ftpclient-for-ftp-tls-getting-remote-host-closed -कनेक्ट/4861677 9 # 48616779 –