2013-02-13 74 views
6

मैं इस तथ्य मैं कॉलिंग WebService और होने SSL/प्रमाणपत्र मुद्दे

जावा

में आदि कुंजीस्टोर की स्थापना, मैं एक सोप वेब सेवा को कॉल करने के लिए कोशिश कर रहा हूँ के बारे में बहुत ज्यादा नहीं ज्ञान है कि के साथ शुरू होगा, मैं wsdl मिला , कोड उत्पन्न किया, इत्यादि। जब तक मैं इसे तैनात नहीं करता और डब्लूएस कॉल को ट्रिगर करने की कोशिश करता हूं तब तक सबकुछ ठीक लगता है। बिल्ला को

  • बिलाव 7.0.35
  • जावा, JDK 1.6.0_39
  • pfx फ़ाइल और पासवर्ड
  • परियोजना मानक वेब अनुप्रयोग (युद्ध) के रूप में तैनात:

    यहाँ मेरी सेटअप है

जब मैं कोड चलाता हूं, तो मुझे निम्न अपवाद मिला:

मेरी कीस्ट्रोक को प्रमाणपत्र स्थापित करने के लिए How to convert .pfx file to keystore with private key?:
Caused by: javax.net.ssl.SSLHandshakeException: SSLHandshakeException invoking https://tallyservices-qa.olson.com/tallyDemo2WebServices/tallyDemo2/sms: Received fatal alert: certificate_unknown 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1336) 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1320) 
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) 
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:622) 
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) 
    ... 27 more 
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1837) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1019) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1203) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1230) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1214) 
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166) 
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1031) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230) 
    at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.setupWrappedStream(URLConnectionHTTPConduit.java:170) 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1280) 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1231) 
    at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.onFirstWrite(URLConnectionHTTPConduit.java:183) 
    at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:47) 
    at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69) 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1293) 
    ... 30 more 

मैं यहाँ सुझाव का पालन किया

keytool -importkeystore -srckeystore C:\somefolder\mypfxfile.pxf -srcstoretype pkcs12 
-destkeystore C:\somefolder\clientcert.jks -deststoretype JKS 

और मुझे मिल गया:

Enter destination keystore password: <mypassword> 
Re-enter new password: <mypassword> 
Enter source keystore password: <pxf_password> 
Entry for alias 67eb31f6 successfully imported. 
Import command completed: 1 entries successfully imported, 0 entries failed or 
cancelled 

तो सब कुछ अब तक अच्छा लग रहा है, मैं अपने बिल्ला बाउंस और सर्वलेट को फिर से मारना और मुझे अभी भी वही त्रुटि मिलती है।

मुझे और क्या याद आ रहा है? क्या मुझे प्रमाणपत्र या कुछ के बारे में टोमकैट बताने की ज़रूरत है?

कीस्टोर और प्रमाणपत्र क्षेत्र में मेरे नोब-नेस के लिए मदद और क्षमा के लिए अग्रिम धन्यवाद।

संपादित करें: तो मैं कार्लो Pellegrini`s मदद से लगा, कि मैं बिल्ला को कुंजीस्टोर जोड़ने की जरूरत: तो अब , मेरे बिल्ला अतिरिक्त JAVA_OPTS पैरामीटर के साथ शुरू कर दिया गया है:

"-Djavax.net.ssl.trustStore=C:\somefolder\clientcert.jks -Djavax.net.ssl.trustStorePassword=somepassword" 

और अब मुझे मिल गया:

Caused by: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 

यहाँ से: Error - trustAnchors parameter must be non-empty और got java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty when using cas - मेरी truststore की तरह लगता है नहीं मिला है?

keytool -importkeystore -srckeystore C:\somefolder\mypfxfile.pxf -srcstoretype pkcs12 -destkeystore C:\somefolder\clientcert.jks -deststoretype JKS 

असल कुंजीस्टोर, नहीं truststore में PXF डाल:

मैं अपने पहले आदेश लगा?

C:\somefolder>keytool -list -keystore "C:\somefolder\clientcert.jks" 
Enter keystore password: 

Keystore type: JKS 
Keystore provider: SUN 

Your keystore contains 1 entry 

67eb31f6, 13-Feb-2013, PrivateKeyEntry, 
Certificate fingerprint (MD5): ... some fingerprint ... 

तो मुझे यकीन है कि क्या मैं यहाँ

+0

मैं नहीं जानता: trustStore से है, लेकिन अधिक महत्वपूर्ण बात, वहाँ पुस्तकालय मैं उपयोग कर रहा हूँ (CXF 2.7.1) मैं कोड में सीधे एसएसएल प्रॉपर्टी सेट अप करने के लिए है कि के साथ समस्या होने लगते हैं इस मामले में सटीक सेटअप, लेकिन अगर आप साइन अप कर रहे हैं या अपने संदेशों को अपनी निजी कुंजी से एन्क्रिप्ट कर रहे हैं, तो सर्वर की सार्वजनिक कुंजी होनी चाहिए। अगर यह केवल एसएसएल/टीएलएस है क्योंकि अपवाद सुझाव देता है, तो सर्वर प्रमाण पत्र पर भरोसा नहीं किया जा सकता है? – jhexp

उत्तर

3

मुझे समाधान मिला, मुझे कुंजीस्टोर का उपयोग करना चाहिए

// BEGIN FIX to avoid certificate error, need to set this up in the code for cxf 
String storePath = System.getProperty("javax.net.ssl.keyStore"); 
String storePassword = System.getProperty("javax.net.ssl.keyStorePassword"); 
String storeType = System.getProperty("javax.net.ssl.keyStoreType"); 
KeyStore keyStore = KeyStore.getInstance(storeType); 
keyStore.load(new FileInputStream(storePath), storePassword.toCharArray()); 
KeyManagerFactory factory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
factory.init(keyStore, storePassword.toCharArray()); 
KeyManager[] keyManagers = factory.getKeyManagers(); 
Client client = ClientProxy.getClient(port); 
HTTPConduit conduit = (HTTPConduit) client.getConduit(); 
conduit.setTlsClientParameters(new TLSClientParameters()); 
conduit.getTlsClientParameters().setKeyManagers(keyManagers); 
5

लापता आप सर्वर के प्रमाणपत्र पर भरोसा करने की जरूरत है कर रहा हूँ नहीं कर रहा हूँ:

जब मैं कुंजीस्टोर सूची की जाँच करें।यहां इसका तरीका करने के लिए है:

क्रोम का उपयोग करना (अन्य borwsers के लिए निर्देश भिन्न हो सकते): सेवा साइट के लिए

  • सर्फ। (उदाहरण के। https://localhost/myService)
  • तो ब्राउज़र यह भरोसा नहीं होता है, क्लिक करें Proceed anyway, आपकी पता-में एक पैडलॉक आइकन पर क्लिक करें, और कोई पॉप अप विंडो, Connection टैब और Certificate Information लिंक का चयन करें।
  • यह प्रमाणपत्र दर्शक विंडो खोलना चाहिए, जहां Details का चयन करना है, आपको Export ... बटन देखना चाहिए। बेस 64 एन्कोडेड, एकल प्रमाणपत्र का चयन करें और इसे mysite.cer फ़ाइल के रूप में सहेजें।

यह प्रमाण पत्र प्राप्त करता है, अब आपको इसे ट्रस्टस्टोर में आयात करने की आवश्यकता है।

अब एक कीस्ट्रोक में प्रमाणपत्र आयात:

keytool -import -file mysite.cer -keystore mykeystore 

यह वर्तमान निर्देशिका में एक नई फ़ाइल कुंजीस्टोर फ़ाइल mykeystore पैदा करता है।

अंत में के रूप में वेब सेवा ग्राहक JVM पैरामीटर javax.net.ssl.trustStore का उपयोग कर आवेदन शुरू:

java -Djavax.net.ssl.trustStore=mykeystore ... MyClientClass 

या यदि आप Windows में बिलाव का उपयोग कर रहे हैं:

set JAVA_OPTS=-Djavax.net.ssl.trustStore=mykeystore 
startup.bat 

या यदि आप यूनिक्स में बिलाव का उपयोग कर रहे :

export JAVA_OPTS="-Djavax.net.ssl.trustStore=mykeystore" 
startup.sh 
+0

इस मामले में, वेब सेवा क्लाइंट मेरा tomcat है? क्योंकि वेब सेवा से कनेक्ट होने वाला मेरा वेबैप टॉमकैट के अंदर चल रहा है। मैं कीस्टोर को देखने के लिए टोमकैट कैसे सेट करूं? –

+0

आपके अनुरोध के अनुसार संपादित किया गया। –

+0

धन्यवाद, मैंने प्रगति की है ... लेकिन ऐसा लगता है कि मैं ट्रस्टस्टोर बनाम कीस्टोर इश्यू –