जावा में जेएसएसई का उपयोग टीएलएस के साथ करते हुए। मैंने सर्वर और क्लाइंट के बीच एक सुरक्षित सॉकेट बनाया है। अंततः सॉकेट को सुरक्षित रूप से कनेक्ट करने के बाद, मेरे पास अभी भी मेरे मौजूदा कोड की सुरक्षा के बारे में एक मौलिक सवाल है। मैंने एक ट्यूटोरियल में निर्देशों का पालन किया, और कभी-कभी जावाडॉक में प्रलेखन बहुत सटीक है लेकिन थोड़ी अस्पष्ट है जब तक कि आप शब्दकोष की स्वैली बोली बोलते हैं ....जावा जेएसएसई टीएलएस - क्या यह कनेक्शन दोनों दिशाओं में सुरक्षित रूप से एन्क्रिप्ट किया गया है?
मैं सी ++ में काफी समय से नेटवर्क प्रोग्रामिंग कर रहा हूं। जावा में संक्रमण आसान था। हाल ही में, हालांकि, मुझे यातायात को सुरक्षित बनाने के लिए समझदार पाया गया है। यह कहा जा रहा है:
मैं एक सुरक्षित सॉकेट बनाना चाहता हूं उसी तरह एक वेब ब्राउज़र एक सुरक्षित सॉकेट बनाता है, इसलिए दोनों दिशाओं में यातायात एन्क्रिप्ट किया जाता है। एक ग्राहक सर्वर से भेजी गई अपनी व्यक्तिगत खाता जानकारी देख सकता है (अगर अवरुद्ध हो तो बहुत बुरा), और ग्राहक सुरक्षित रूप से सर्वर पर अपना उपयोगकर्ता नाम और पासवर्ड भेज सकता है (अगर अवरुद्ध हो तो भी बहुत बुरा)।
मुझे पता है कि सार्वजनिक कुंजी क्रिप्टोग्राफी कैसे काम करती है, लेकिन अकेले सार्वजनिक कुंजी क्रिप्टोग्राफ़ी का दुष्प्रभाव होता है। आप क्लाइंट को अपनी सार्वजनिक कुंजी भेजते हैं, क्लाइंट सार्वजनिक कुंजी के साथ एन्क्रिप्ट करता है, और सर्वर को डेटा भेजता है केवल सर्वर डिक्रिप्ट कर सकता है। अब जो मैं समझता हूं, सर्वर क्लाइंट को जाने वाले संदेशों को एन्क्रिप्ट करने के लिए निजी कुंजी का उपयोग करता है, और सार्वजनिक कुंजी के साथ किसी को भी डिक्रिप्ट करने में सक्षम होने से रोकने के लिए सुरक्षा की एक और परत को जोड़ा जाना आवश्यक है।
- मैं एक सार्वजनिक/निजी कुंजी फ़ाइलें public.key और private.key में संग्रहीत जोड़ी (i इन JSSE के Keytool सुविधा का उपयोग
- मैं ग्राहक में public.key शामिल
- मैं निजी शामिल किए गए है। सर्वर में महत्वपूर्ण
ग्राहक वर्ग:
KeyStore keyStore;
TrustManagerFactory tmf;
KeyManagerFactory kmf;
SSLContext sslContext;
SecureRandom secureRandom = new SecureRandom();
secureRandom.nextInt();
keyStore = KeyStore.getInstance("JKS");
keyStore.load(this.getClass().getClassLoader().getResourceAsStream("server.public"),"public".toCharArray());
tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(keyStore);
kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(keyStore, "public".toCharArray());
sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), secureRandom);
SSLSocketFactory sslsocketfactory = sslContext.getSocketFactory();
SSLSocket sslsocket = (SSLSocket)sslsocketfactory.createSocket("localhost", 9999);
सर्वर वर्ग:
String passphrase = "secret"
KeyStore keyStore;
TrustManagerFactory tmf;
KeyManagerFactory kmf;
SSLContext sslContext;
SecureRandom secureRandom = new SecureRandom();
secureRandom.nextInt();
keyStore = KeyStore.getInstance("JKS");
keyStore.load(this.getClass().getClassLoader().getResourceAsStream("server.private"),passphrase.toCharArray());
tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(keyStore);
kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(keyStore, passphrase.toCharArray());
sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), secureRandom);
SSLServerSocketFactory sslserversocketfactory = sslContext.getServerSocketFactory();
SSLServerSocket sslserversocket =
(SSLServerSocket)sslserversocketfactory.createServerSocket(9999);
/* ** * ** * प्रश्न * ** * ** * */
सब कुछ काम करता है! मैं BufferedReader और BufferedWriter को सॉकेट संलग्न करता हूं और स्वीकार करने के बाद खूबसूरती से आगे और आगे बात करना शुरू करता हूं; क्लाइंट से कनेक्शन दर्ज करना और मेरे क्लाइंट और सर्वर को लूप भेजना/प्राप्त करना।
अब मुझे पता है कि इस बिंदु पर क्लाइंट सर्वर संचार सुरक्षित है। केवल सर्वर कुंजी क्लाइंट से आने वाले ट्रैफ़िक को डिक्रिप्ट कर सकती है। लेकिन क्लाइंट संचार के लिए सर्वर के बारे में क्या? क्लाइंट की कुंजी सर्वर से आने वाले संदेशों को डिक्रिप्ट कर सकती है, लेकिन पब्लिक की क्रिप्टो 101 में आप सीखते हैं कि क्लाइंट अब सर्वर पर सार्वजनिक कुंजी भेजना चाहता है। क्या यह इस कोड में दृश्यों के पीछे हो रहा है? क्या SSLContext इसका ख्याल रखता था? या अब मेरे पास क्लाइंट से सर्वर से एन्क्रिप्टेड कनेक्शन है, क्या अब मुझे क्लाइंट के लिए एक निजी/सार्वजनिक कुंजी जोड़ी उत्पन्न करने की उम्मीद है?
मुझे बताएं कि उपर्युक्त कोड में भेजा गया या प्राप्त ट्रैफ़िक वास्तव में दोनों दिशाओं में सुरक्षित है या नहीं।
कैसे आप क्लाइंट और सर्वर पर private.key पर public.key "शामिल हैं" था ?? – raghav