2012-09-06 10 views

Odpowiedz

0

Zakładam, że chcesz wykonać https z certyfikatami klienta. Myślę, że to musi być ustawiony na poziomie jvm, istnieje dobre wyjaśnienie, jak to zrobić.

Nie wydaje się być sposób to zrobić z Ning bezpośrednio, jak wyjaśniono here, kod jest skopiowany Poniżej

// 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

To takie straszne! Mam nadzieję, że się mylisz! : -/BTW, Dispatch 0.9 jest oparty na Ning Async HttpClient, który jest oparty na NIO. Tak więc odpowiedź musi zadziałać - nie mówiąc, że podany link nie jest, wystarczy umieścić tutaj uwagę dla każdego, kto się pojawi. –

2

podstawie kodu Java w @sbridges próbki, ja wymyślił śledzenie kodu Scala za pomocą wysyłki. Tworzy niestandardowy kontekst SSL zawierający dostarczone certyfikaty (i tylko te, domyślny magazyn zaufanych certyfikatów głównych nie jest używany przez ten kod podczas weryfikacji zdalnego hosta).



    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) 

które mogłyby być wykorzystane na przykład:

Zauważ, że ten certyfikat zachowuje dane w pamięci, która nie jest najbardziej bezpieczny sposób to zrobić i niepotrzebnie zużywa pamięć. W wielu przypadkach może być bardziej odpowiednie przechowywanie InputStream lub nazwy pliku w klasie przypadku SslCertificateData.

Powiązane problemy