Я не эксперт в scala, и я никогда не использовал брызговик, но я постараюсь помочь вам на основе моего опыта Java.
У вас есть два варианта, инициализировать SSLContext с TrustManagerFactory из хранилища ключей с сертификатом сервера (SECURE)
File keyStoreFile = new File("./myKeyStore");
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(new FileInputStream(keyStoreFile), "keyStorePassword".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(ks);
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, tmf.getTrustManagers(), new java.security.SecureRandom());
или создать пустышки TrustManagerFactory, который принимает любой сертификат (небезопасный)
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
public class DummyTrustManager implements X509TrustManager {
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
/* (non-Javadoc)
* @see javax.net.ssl.X509TrustManager#checkClientTrusted(X509Certificate[], java.lang.String)
*/
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
}
/* (non-Javadoc)
* @see javax.net.ssl.X509TrustManager#checkServerTrusted(X509Certificate[], java.lang.String)
*/
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
}
}
Инициализировать SSLContext таким образом (it is very similar in spray-client)
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[] { new DummyTrustManager() }, new java.security.SecureRandom());
Я не знаю синтаксиса Scala, но его не сложно перевести.
Надеюсь, это поможет.
EDIT (предложенный Матей Briškár): Выше правильный подход, однако для распыления клиента это не так просто. Чтобы сделать sendReceive
работать с SSL, вам необходимо сначала установить соединение, а затем передать это соединение sendReceive
.
Сначала создайте неявный менеджер доверия, как описано выше. Например:
implicit def sslContext: SSLContext = {
val context = SSLContext.getInstance("TLS")
context.init(null, Array[TrustManager](new DummyTrustManager), new SecureRandom())
context
}
Обратите внимание, что через какое-то время это соединение истечет, поэтому вы можете изменить это поведение по умолчанию.
Затем вам нужно установить соединение, которое будет использовать этот неявный как:
val connection = {
Await.result((IO(Http) ? HostConnectorSetup(host, port = 443, sslEncryption = true)).map { case HostConnectorInfo(hostConnector, _) => hostConnector }, timeout.duration)
}
Примечание: host
означает URL, который вы пытаетесь достичь. Также timeout
поступает из-за пределов этого фрагмента кода.
И, наконец, вы можете использовать sendReceive(connection)
для доступа к зашифрованному хосту SSL.
Примечание: Оригинал редактирования была ссылка:
Согласно discussion online этот вопрос будет фиксированной, хотя.
Однако обсуждение закончилось с 2013 года, а сейчас 2016 год. Проблема в том, что подключение к работе будет работать, похоже, все еще есть. Не уверен, что обсуждение актуально.
Спасибо большое, это выглядит вы отвечаете на вопрос, я попробую это вечером и дам вам знать. Он очень похож на то, что я видел на стороне сервера, и пытался применить его на стороне клиента (я думал, что есть большая разница), но без везения. Теперь я знаю, что пошла правильно. –
Взгляните на это сообщение, возможно, поможет и вам. Https://stackoverflow.com/questions/20706026/bing-azure-search-api/20789379#20789379 – vzamanillo
Я только что заработал. Дело в том, что клиент-распылитель не является распылителем, и это слишком высокоуровневое соединение на основе запроса/ответа. Мне пришлось установить связь и поместить ее внутрь. –