2009-05-15 19 views
13

आदर्श रूप से, मुझे केवल एक साधारण SSLSocketChannel की आवश्यकता है।एसएसएल और सॉकेट चैनल

मेरे पास पहले से ही एक घटक है जो सामान्य SocketChannel पर संदेश पढ़ता है और लिखता है, लेकिन इनमें से कुछ कनेक्शनों के लिए, मुझे तार पर एसएसएल का उपयोग करना होगा; हालांकि, इन कनेक्शनों पर संचालन समान हैं।

क्या कोई भी मुफ्त SSLSocketChannel कार्यान्वयन (उचित चयनकर्ता के साथ) या कुछ इसी तरह जानता है? मुझे this मिला है, लेकिन चयनकर्ता इसे स्वीकार नहीं करता है क्योंकि इसके विक्रेता सूर्य नहीं हैं।

मैं पागल होने के बिना SSLEngine का उपयोग करने के लिए, एक साधारण ऑब्जेक्ट के माध्यम से नेटवर्क डेटा के सम्मिलन और पुनर्प्राप्ति से रीड_फॉम/लेखन_ को शुद्ध तर्क से decoupling कर रहा हूं, लेकिन यह तथ्य वास्तव में लागू करने के लिए वास्तव में मुश्किल है, मुझे एसएसएल प्रोटोकॉल के आंतरिक पता नहीं है ...

उत्तर

0

रीस्टलेट के कार्यान्वयन की जांच करें जो आपको चाहिए वह कर सकता है, और यह सब एनआईओ के बारे में है।

Restlet Engine Javadoc

विशेष रूप HttpClientCall। SetProtocol (HTTPS) - getResponseEntityChannel रिटर्न एक ReadableByteChannel (getEntityChannel रिटर्न एक WriteableByteChannel)

+0

धन्यवाद, मैं इसे दूंगा एक नज़र :) – akappa

+0

एमएमएच, मैंने "एसएसएलईजीएनईएन" के स्रोतों की खोज की है और मुझे कुछ भी मिला है ... शायद वे एसएसएल के साथ गैर-अवरोध I/O का उपयोग नहीं करते हैं? – akappa

+0

मुझे शक है - संपूर्ण रेस्टलेट परियोजना एनआईओ पर आधारित है। क्षमा करें और मदद नहीं हो सकती है, लेकिन मुझे विश्वास है कि उनके पास कहीं भी एनआईओ एसएसएल समाधान है। – Gandalf

0

यह सुनिश्चित नहीं है कि यह वही है जो आप ढूंढ रहे हैं, लेकिन मदद कर सकते हैं ... एसएसएल/टीएलएस सक्षम सर्वर सॉकेट बनाने के लिए, मैं वर्तमान में कोड का उपयोग कर रहा हूं निम्न की तरह (keystore.jks में एक स्वयं हस्ताक्षरित निजी/सार्वजनिक कुंजी जोड़ी है जो पुष्टि को सुरक्षित करने के लिए उपयोग की जाती है) - ग्राहकों के पास एक समान ट्रस्ट स्टोर होता है जिसमें उस जोड़ी की सार्वजनिक कुंजी के साथ हस्ताक्षरित प्रमाणपत्र होता है।

कॉन्फ़िगर किए जाने के आसपास कुछ गुगल आपको चलाना चाहिए।

String keyStorePath = "keystore.jks"; 
String keyStorePassword = "password"; 

KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
KeyStore keyStore = new KeyStore(); 
keyStore.load(new FileInputStream(keyStorePath), keyStorePassword); 
keyManagerFactory.init(keyStore, keyStorePassword.toCharArray()); 

sslContext = SSLContext.getInstance("TLS"); 
sslContext.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom()); 

SSLContext sslContext = getServerSSLContext(namespace.getUuid()); 
SSLServerSocketFactory serverSocketFactory = sslContext.getServerSocketFactory(); 

// Create sockets as necessary 
+3

शायद यह प्रश्न से स्पष्ट नहीं है, लेकिन मेरे पास एक घटक है जो I/O को अवरुद्ध करता है, इसलिए मैं एक गैर अवरुद्ध एसएसएल सॉकेट चाहता हूं (जावा में, एक गैर अवरोधक सॉकेट को "चैनल" कहा जाता है)। आपके दृष्टिकोण के साथ, आपके पास एक अवरुद्ध सॉकेट है जो SSL/TLS के माध्यम से डेटा को एन्क्रिप्ट करता है, इसलिए यह वह नहीं है जिसे मैं ढूंढ रहा हूं। मैं उस दृष्टिकोण का उपयोग किसी अन्य घटक में करता हूं, जहां मैं प्रति कनेक्शन एक धागा रखने के लिए ओवरहेड पर खर्च कर सकता हूं। वैसे भी आपके लिए धन्यवाद! – akappa

+0

मैंने हाल ही में कुछ ऐसा करने पर देखा है, और वास्तव में http://www.jboss.org/netty जैसे टूल का निर्णय समाप्त कर दिया है और http://mina.apache.org एनआईओ को एसएसएल जोड़ने का एक आसान तरीका था। SSL इंजन के माध्यम से एनआईओ का उपयोग करने के लिए तंत्र हैं जो आप SSLContext से प्राप्त कर सकते हैं, लेकिन उपलब्ध नमूना कोड को देखते हुए, यह बहुत मुश्किल है! [अंगूठे का मेरा नियम यह है कि अगर मुझे एक ट्यूटोरियल के लिए स्रोत कोड का ज़िप डाउनलोड करना होगा (इसे इनलाइन प्रदर्शित करने के बजाय) विकल्प देखने के लिए समय है ...] – Martin

5

जेटी के पास उनके सर्वर के लिए एक एनआईओ एसएसएल कार्यान्वयन है: SslSelectorChannelConnector। आप इसके बारे में ब्योरा देने के लिए उस पर गौर करना चाहेंगे।

O'Reilly से एक पुराना (लेकिन सभ्य) आलेख भी है जो उदाहरण कोड के साथ एनआईओ + एसएसएल के बारे में विवरण बताता है।

+1

सुझावों के लिए धन्यवाद :) मुझे पहले से ही O'Reilly लेख पता है, लेकिन यह थोड़ा सा सरल है। मुझे एस्मंड पिट की पुस्तक "जावा में मौलिक नेटवर्किंग" में SSLSocketChannel के समान कुछ बनाने के बारे में बहुत अच्छा संकेत मिला है, लेकिन यह अभी भी एक दर्द है ** इसे गंभीरता से प्राप्त करें;) – akappa

1

TLS Channel एक सरल पुस्तकालय है कि वास्तव में क्या करता है: एक SSLContext (या SSLEngine) लपेटकर और एक ByteChannel इंटरफ़ेस उजागर, आंतरिक रूप से बड़े कार्य करने कर।

(अस्वीकरण: मैं लाइब्रेरी का मुख्य लेखक हूं)।

संबंधित मुद्दे