2012-10-24 30 views
20

में एक कस्टम कुंजी स्टोर लोड करना मैं URLFetch सेवा का उपयोग कर Google App Engine ऐप में HTTPS कनेक्शन खोलना चाहता हूं। सर्वर के SSL प्रमाण पत्र को सत्यापित करने के लिए सक्षम करने के लिए मेरा ऐप बात कर रहा है, मैं अपनी खुद की कीस्टोर फ़ाइल का उपयोग कर रहा हूं। जब भी मेरा ऐप लोड हो जाता है, तो मैं इस फ़ाइल को warmup request में पढ़ना चाहता हूं यानी किसी भी HTTPS अनुरोधों से पहले। कीस्टोर फ़ाइल मेरी WAR फ़ाइल का हिस्सा है।Google App Engine Java अनुप्रयोग

TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
keystore.load(ClassLoader.getSystemResourceAsStream("myKeystoreFile"), "password".toCharArray()); 
trustManagerFactory.init(keystore); 

TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); 
SSLContext sslContext = SSLContext.getInstance("SSL"); 
sslContext.init(null, trustManagers, null); 

HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); 

मैं इस दृष्टिकोण का उपयोग नहीं कर सकते हैं, तथापि, क्योंकि जबकि HttpURLConnection GAE के JRE श्वेत सूची पर है, HttpsURLConnection नहीं है।

क्या GAE में कस्टम कीस्टोर का उपयोग करने का कोई और तरीका है? मुझे GAE दस्तावेज़ों में इस पर कोई जानकारी नहीं मिली। ऐसा लगता है कि Google की URLFetch सेवा HTTPS का समर्थन करती है, तो कीस्टोर को अनुकूलित नहीं किया जा सकता है। क्या यह सही है?

यदि यह संभव नहीं है, तो क्या दृष्टिकोण सामान्य रूप से मान्य है? या क्या कोई अलग दृष्टिकोण है जो अभी भी मुझे SSL प्रमाणपत्र सत्यापित करने की अनुमति देता है?

अद्यतन

2009 में, गूगल से App इंजन डेवलपर निक जॉनसन https://groups.google.com/d/topic/google-appengine-python/C9RSDGeIraE/discussion पर कहा:

UrlFetch एपीआई आप अपने खुद के ग्राहक प्रमाण पत्र निर्दिष्ट करने के लिए अनुमति नहीं है, इसलिए दुर्भाग्यवश जो आप प्राप्त करना चाहते हैं वह वर्तमान में संभव नहीं है।

क्या यह अभी भी सही है? यदि ऐप इंजन में प्रत्येक HTTP अनुरोध अनुरोध URL पर निर्भर करता है तो इसका अर्थ यह होगा कि कस्टम प्रमाण पत्र का उपयोग GAE में बिल्कुल भी नहीं किया जा सकता है।

+0

जैसा कि यह पता चला है कि [GAE की Google Code साइट] (http://code.google.com/p/googleappengine/issues/detail?id=3719) पर इसके लिए एक खुली समस्या है। – Ingo

+1

ऐप इंजन पर इसका समर्थन करने के लिए क्या आवश्यक होगा? ** क्या Google के किसी व्यक्ति ने इसे लागू करने के लिए क्या करना होगा? ** – Ingo

+0

लेविटीस का कहना है कि उसने अपाचे HTTP क्लाइंट का उपयोग करके इसे कार्यान्वित किया है, http://esxx.blogspot.com/2009/06/using-apaches- httpclient-ऑन-google-app.html। मैं अभी भी अपने दृष्टिकोण को समझने की कोशिश कर रहा हूं। क्या किसी ने यह कोशिश की? उन्होंने स्रोत को यहां विचलन में डाल दिया: http://svn.berlios.de/svnroot/repos/esxx/trunk/jee/org/esxx/js/protocol – Ingo

उत्तर

3

आप के लिए Outbound sockets support एक trusted tester के रूप में साइन अप करना चाहिए। के तहत वांछित विशेषताएं वे SSL सूचीबद्ध करते हैं। यदि जेडीके एसएसएल एपीआई के अधिक हिस्सों का समर्थन किया जाएगा तो ऐसा कुछ आसान होगा।

0

मुझे एक ही समस्या है ... मुझे एक विदेशी वेब सेवा कॉल करने के लिए keystore.p12 की आवश्यकता थी, लेकिन उसे क्लासपाथ से लोड करने का कोई मौका नहीं था। इसका उपयोग करने में एकमात्र तरीका इसे शामिल करना था उदा। /WEB-INF/keystore.p12 और इसे वहां से लोड करें।

ServletContext context = getContext(); 
URL resourceUrl = context.getResource("/WEB-INF/keystore.p12"); 
+0

शायद यह एक जावा नीति मुद्दा है। क्या आपने पॉलिसी फाइल संपादित की है और सभी को (एक परीक्षण के रूप में) अनुमति दी है? – djangofan

4

मुझे हाल ही में एक ही समस्या का सामना करना पड़ रहा था और मेरे लिए काम करने वाले एपेंगिन-एपी-स्टब्स के साथ पैक किए गए एचटीपी क्लाइंट कार्यान्वयन का उपयोग कर रहा था।

Maven निर्भरता:

<dependency> 
    <groupId>com.google.appengine</groupId> 
    <artifactId>appengine-api-stubs</artifactId> 
    <version>1.9.18</version> 
</dependency> 

कोड:

// create SSL Context which trusts your self-signed certificate 
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
keystore.load(ClassLoader.getSystemResourceAsStream("myKeystoreFile"), "password".toCharArray()); 
trustManagerFactory.init(keystore); 
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); 
SSLContext sslContext = SSLContext.getInstance("SSL"); 
sslContext.init(null, trustManagers, null); 

// register your trusting SSL context 
Protocol.registerProtocol("https", 
     new Protocol("https", (ProtocolSocketFactory) new SocketFactoryWrapper(sslContext.getSocketFactory()), 443)); 

// make the https call 
HttpClient httpclient = new HttpClient(); 
GetMethod httpget = new GetMethod("https://myendpoint.com"); 
httpclient.executeMethod(httpget); 
System.out.println(httpget.getStatusLine()); 

यह करता है अनिवार्य रूप से एक ही बात के रूप में

HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); 

लेकिन एक कारण या किसी अन्य एप्लिकेशन इंजन यह ब्लॉक नहीं करता के लिए ।

0

मैं AppEngine एपीआई 1.9.56 का उपयोग कर रहा है और क्या मेरे साथ

Protocol.registerProtocol("https", 
    new Protocol("https", (ProtocolSocketFactory) new SocketFactoryWrapper(sslContext.getSocketFactory()), 443)); 

अब और काम नहीं कर रहा सुझाव दिया। इसलिए मुझे appengine-api-stubs लाइब्रेरी की आवश्यकता नहीं है, या तो।

हालांकि, HttpsURLConnection.setDefaultSSLSocketFactory बस ठीक काम करता है।

KeyStore keystore = KeyStore.getInstance("JKS"); 
    InputStream in = getClass().getResourceAsStream("/mytruststore.jks"); 
    keystore.load(in, "password".toCharArray()); 
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    trustManagerFactory.init(keystore); 
    TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); 
    SSLContext sslContext = SSLContext.getInstance("SSL"); 
    sslContext.init(null, trustManagers, null); 

    HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); 

सौभाग्य से HttpsURLConnection, अब और काली सूची में डाल नहीं है क्योंकि यह समय सवाल किया गया था में था:

यहाँ मेरी पूर्ण समाधान जो मेरी समस्या हल है।