Potrzebuję być w stanie wysłać plik certyfikatu (.pem, myślę), z prośbą o pobranie za pomocą scala i wysyłki.Wyślij plik certyfikatu ze Scala Dispatch
Jak to zrobić?
Potrzebuję być w stanie wysłać plik certyfikatu (.pem, myślę), z prośbą o pobranie za pomocą scala i wysyłki.Wyślij plik certyfikatu ze Scala Dispatch
Jak to zrobić?
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);
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.
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. –