2012-09-06 12 views
5

के साथ प्रमाणपत्र फ़ाइल भेजें मुझे स्कैला और प्रेषण का उपयोग करने के अनुरोध के साथ एक प्रमाणपत्र फ़ाइल (.pem, मुझे लगता है) भेजने में सक्षम होना चाहिए।स्कैला डिस्पैच

आप यह कैसे करते हैं?

उत्तर

0

मुझे लगता है कि आप क्लाइंट प्रमाणपत्रों के साथ https करना चाहते हैं। मुझे लगता है कि इसे जेवीएम स्तर पर स्थापित करने की जरूरत है, एक अच्छा स्पष्टीकरण here यह कैसे करें।

वहाँ, निंग के साथ सीधे यह करने के लिए एक तरह से हो रहा है के रूप में समझाया here, कोड के नीचे कॉपी की गई,

// read in PEM file and parse with commons-ssl PKCS8Key 
// (ca.juliusdavies:not-yet-commons-ssl:0.3.11) 
RandomAccessFile in = null; 
byte[] b = new byte[(int) certFile.length()]; 
in = new RandomAccessFile(certFile, "r"); 
in.readFully(b); 
char[] password = hints.get("password").toString().toCharArray(); 
PKCS8Key key = new PKCS8Key(b, password); 

// create empty key store 
store = KeyStore.getInstance(KeyStore.getDefaultType()); 
store.load(null, password); 

// cert chain is not important if you override the default KeyManager and/or 
// TrustManager implementation, IIRC 
store.setKeyEntry(alias, key.getPrivateKey(), password, new DefaultCertificate[0]); 

// initialize key and trust managers -> default behavior 
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509"); 

// password for key and store have to be the same IIRC 
keyManagerFactory.init(store, password); 
KeyManager[] keyManagers = keyManagerFactory.getKeyManagers(); 

TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
tmf.init(store); 
TrustManager[] trustManagers = tmf.getTrustManagers(); 

// override key and trust managers with desired behavior - for example 
// * 'trust everything the server gives us' -> TrustManager#checkServerTrusted 
// * 'always return a preset alias to use for auth' -> X509ExtendedKeyManager#chooseClientAlias, X509ExtendedKeyManager#chooseEngineClientAlias 
for (int i = 0; i < keyManagers.length; i++) 
{ 
    if (keyManagers[i] instanceof X509ExtendedKeyManager) 
    { 
    AHCKeyManager ahcKeyManager = new AHCKeyManager((X509ExtendedKeyManager) keyManagers[i]); 
    keyManagers[i] = ahcKeyManager; 
    } 
} 

for (int i = 0; i < trustManagers.length; i++) 
{ 
    if (tm instanceof X509TrustManager) 
    { 
    AHCTrustManager ahcTrustManager = new AHCTrustManager(manager, (X509TrustManager) trustManagers[i]); 
    trustManagers[i] = ahcTrustManager; 
    } 
} 

// construct SSLContext and feed to AHC config 
SSLContext context = SSLContext.getInstance("TLS"); 
context.init(keyManagers, trustManagers, null); 

ahcCfgBuilder.setSSLContext(context); 
+0

यह बहुत भयानक है! मुझे आशा है कि आप गलत हैं! : -/बीटीडब्ल्यू, डिस्पैच 0.9 Ning Async HttpClient पर आधारित है, जो एनआईओ पर आधारित है। तो जवाब के लिए काम करना है - यह नहीं कह रहा कि आपके द्वारा प्रदान किया गया लिंक नहीं है, बस यहां आने वाले किसी और के लिए कुछ टिप्पणी डालें। –

2

@sbridges नमूने में जावा कोड के आधार पर, मैं के साथ आया था प्रेषण का उपयोग कर स्कैला कोड के बाद। यह एक कस्टम एसएसएल संदर्भ बनाता है जिसमें आपके द्वारा प्रदान किए जाने वाले प्रमाण पत्र होते हैं (और केवल वे; रिमोट होस्ट की पुष्टि करते समय विश्वसनीय रूट प्रमाणपत्रों का डिफ़ॉल्ट स्टोर इस कोड द्वारा उपयोग नहीं किया जाता है)।



    class SslAuthenticatingHttp(certData: SslCertificateData) extends Http { 
     override val client = new AsyncHttpClient(
     (new AsyncHttpClientConfig.Builder).setSSLContext(buildSslContext(certData)).build 
    ) 

     private def buildSslContext(certData: SslCertificateData): SSLContext = { 
     import certData._ 

     val clientCertStore = loadKeyStore(clientCertificateData, clientCertificatePassword) 
     val rootCertStore = loadKeyStore(rootCertificateData, rootCertificatePassword) 

     val keyManagerFactory = KeyManagerFactory.getInstance("SunX509") 
     keyManagerFactory.init(clientCertStore, clientCertificatePassword.toCharArray) 
     val keyManagers = keyManagerFactory.getKeyManagers() 

     val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()) 
     trustManagerFactory.init(rootCertStore) 
     val trustManagers = trustManagerFactory.getTrustManagers() 

     val context = SSLContext.getInstance("TLS") 
     context.init(keyManagers, trustManagers, null) 

     context 
     } 

     private def loadKeyStore(keyStoreData: Array[Byte], password: String): KeyStore = { 
     val store = KeyStore.getInstance(KeyStore.getDefaultType) 
     store.load(new ByteArrayInputStream(keyStoreData), password.toCharArray) 
     store 
     } 
    } 

    case class SslCertificateData (
     clientCertificateData: Array[Byte], 
     clientCertificatePassword: String, 
     rootCertificateData: Array[Byte], 
     rootCertificatePassword: String) 

जिसमें के रूप में इस्तेमाल किया जाएगा:

ध्यान दें कि यह स्मृति में प्रमाण पत्र डेटा रखता है, जो यह करने के लिए सबसे सुरक्षित तरीका नहीं है और अनावश्यक रूप से स्मृति खपत करता है। यह कई मामलों में SslCertificateData केस क्लास में इनपुटस्ट्रीम या फ़ाइल नाम को स्टोर करने के लिए अधिक उपयुक्त हो सकता है।

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