我不是 scala 方面的专家,也从未使用过 spray-client,但我会根据我的 Java 经验尝试为您提供帮助。
您有两个选择,使用服务器证书(安全)的密钥库中的 TrustManagerFactory 初始化 SSLContext
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(在 spray-client 中非常相似)
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[] { new DummyTrustManager() }, new java.security.SecureRandom());
我不知道 Scala 语法,但应该不难翻译给你。
希望这可以帮助。
编辑(由 Matej 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 加密主机访问。
注意:原始编辑有一个参考:
根据网上的讨论,这个问题将得到解决。
然而,讨论是从 2013 年开始,现在是 2016 年。需要建立连接才能使 SSL 工作的问题似乎仍然存在。不知道讨论是否相关,还有。