2012-09-25 17 views
6

पर SSL कनेक्शन बनाते समय त्रुटि मैं SSL सीखने की प्रक्रिया में हूं और इस प्रक्रिया में मैं जावा क्लाइंट के साथ .NET सर्वर के बीच एक SSL कनेक्शन बनाने का प्रयास कर रहा हूं। मैं इस उद्देश्य के लिए एक स्वयं हस्ताक्षरित प्रमाण पत्र का उपयोग करता हूं। मैं जावा में मानक कीस्टोर का उपयोग नहीं करना चाहता, इसलिए मैं एक कस्टम कीस्टोर बना देता हूं और इसके बजाय लोड करता हूं।जावा क्लाइंट से .NET सर्वर

मैं .NET सर्वर अंत में उपयोग करने के लिए प्रमाणपत्र और पीएफएक्स फ़ाइल उत्पन्न करने के लिए निम्न चरणों का उपयोग करता हूं।

  1. विंडोज़ पर निम्न आदेश का उपयोग कर एक सेरिफ़ाइएट उत्पन्न किया।

    makecert -r पीई -sr "स्थानीय होस्ट" - $ व्यक्ति -n "सीएन = स्थानीय होस्ट" -sv .pvk -r localhost.cer

  2. यह एक .pfx में रूपांतरित तो कि मैं इस प्रमाणपत्र को .NET सर्वर ऐप पर लोड कर सकता हूं।

  3. .cer फ़ाइल को .pem (बेस 64 प्रारूप) के रूप में निर्यात किया गया।

  4. .cer फ़ाइल (उपर्युक्त प्रमाणपत्र का सार्वजनिक घटक) लिया और निम्न आदेश का उपयोग कर जावा क्लाइंट के रूप में उपयोग करने के लिए .jks फ़ाइल (JavaKeyStore) बनाया।

    Keytool \ आयात \ -v \ -trustcacerts \ -alias 0 \ -file < (openssl X509 -इन localhost.pem) \ -keystore mystore.jks \ -storetype JKS \ -storepass ez24get

  5. पर लोड किए गए इस जावा ग्राहक अनुप्रयोग में .jks और निम्न कोड के साथ कनेक्शन आरंभ

    FileInputStream fis = new FileInputStream("res/myjksstore.jks"); 
    KeyStore trusted = KeyStore.getInstance("JKS"); 
    trusted.load(fis, "ez24get".toCharArray());   
    
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    trustManagerFactory.init(trusted); 
    
    SSLContext context = SSLContext.getInstance("SSL"); 
    context.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); 
    
    Socket socket = context.getSocketFactory().createSocket("localhost", 443); 
    
    String str = "abc123"; 
    
    socket.getOutputStream().write(GeneralUtil.toByta(str.length())); 
    socket.getOutputStream().write(str.getBytes()); 
    
    socket.setKeepAlive(true); 
    

लेकिन जब मैं सॉकेट में डेटा लिखने की कोशिश, मैं सर्वर अंत में निम्न त्रुटि

System.ComponentModel.Win32Exception हो: क्लाइंट और सर्वर से संवाद नहीं कर सकते , क्योंकि उनके पास एक सामान्य एल्गोरिदम

मेरा सर्वर कोड निम्नानुसार दिखता है ...

X509 प्रमाण पत्र प्रमाणपत्र = नया X509 प्रमाणपत्र ("localhost.pfx", "abc123");

टीसीपी लिस्टनर श्रोता = नया टीसीपी लिस्टर (आईपीएड्रेस.लूपबैक, 443); श्रोता। स्टार्ट();

जबकि (सही) {

कोशिश {TcpClient tcpClient = श्रोता।AcceptTcpClient();

NetworkStream networkStream = tcpClient.GetStream(); 

    SslStream sslStream = new SslStream(networkStream); 

    sslStream.AuthenticateAsServer(cert, false, SslProtocols.Default, 

झूठा);

byte[] data1 = new byte[4]; 

    sslStream.Read(data1, 0, data1.Length); 

    int len = BitConverter.ToInt32(data1, 0); 

    String message = "Length of incoming data " + 

बिटकोनवर्टर.ToInt32 (डेटा 1, 0);

byte[] data2 = new byte[len]; 

    sslStream.Read(data2, 0, data2.Length); 

    message += " Message: " + ASCIIEncoding.ASCII.GetString(data2); 

    Thread.Sleep(1000);  

} पकड़ (अपवाद पूर्व)
{
} }

अपवाद लाइन

sslStream.AuthenticateAsServer (प्रमाणपत्र, झूठे, SslProtocols.Default पर होता है , असत्य);

इसका कारण क्या हो सकता है और मैं इसे कैसे ठीक कर सकता हूं?

किसी भी मदद की अत्यधिक सराहना की जाएगी।

+3

कोशिश करने के लिए सेट किया जाना चाहिए। 'openssl s_client- कनेक्ट स्थानीयहोस्ट: 443 -CAfile > कृपया इस कमांड के आउटपुट को पोस्ट करें। – user1516873

+0

क्या आपने इस कोड के कुछ संस्करण के साथ मानक कीस्टोर का उपयोग करके सफलतापूर्वक कनेक्ट किया था, या यह एसएसएल कनेक्ट पर आपका पहला शॉट है? – TheBlastOne

+0

नहीं .. मैंने इसे और आगे नहीं बढ़ाया क्योंकि मुझे प्रदर्शन संबंधी कारणों से एसएसएल स्ट्रीम छोड़ना पड़ा। मैंने बस एक सत्र कुंजी साझा करने के लिए एक आरएसए हैंडशेक लागू किया और फिर परिवहन को संभालने के लिए एईएस एन्क्रिप्शन का उपयोग किया। एसएसएल क्या करता है के समान। –

उत्तर

-1

SSLEngine (SSLContext से प्राप्त) openssl के साथ अपने सर्वर से कनेक्ट और जाँच उपलब्ध ciphersuites करने के लिए ग्राहक मोड (setUseClientMode)

+0

यह डिफ़ॉल्ट है, और वह 'एसएसएलईजीएनएन' का उपयोग नहीं कर रहा है। -1 – EJP

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