gpt4 book ai didi

ssl - 如何使用 Spray https 客户端定义 SSLContext?

转载 作者:太空宇宙 更新时间:2023-11-03 12:53:21 25 4
gpt4 key购买 nike

我想将 http 请求发布到具有给定 ca 证书的安全服务器。

我正在使用 Spray 1.3.1,代码如下所示:

val is = this.getClass().getResourceAsStream("/cacert.crt")

val cf: CertificateFactory = CertificateFactory.getInstance("X.509")

val caCert: X509Certificate = cf.generateCertificate(is).asInstanceOf[X509Certificate];

val tmf: TrustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
val ks: KeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null);
ks.setCertificateEntry("caCert", caCert);

tmf.init(ks);

implicit val sslContext: SSLContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);

implicit val timeout: Timeout = Timeout(15.seconds)
import spray.httpx.RequestBuilding._

val respFuture = (IO(Http) ? Post( uri=Uri(url), content="my content")).mapTo[HttpResponse]

问题是未采用定义的隐式 SSLContext,并且我在运行时得到:“无法找到到请求目标的有效证书路径”。

我如何定义一个 SSLContext 来与 spray 客户端一起使用?

最佳答案

我使用以下内容在 spray 中定义一个 SSLContext。在我的例子中,我使用了一个非常宽松的上下文,它不验证远程服务器的证书。基于 this post 中的第一个解决方案- 适合我。

import java.security.SecureRandom
import java.security.cert.X509Certificate
import javax.net.ssl.{SSLContext, X509TrustManager, TrustManager}

import akka.actor.ActorRef
import akka.io.IO
import akka.util.Timeout
import spray.can.Http

import scala.concurrent.Future

trait HttpClient {
/** For the HostConnectorSetup ask operation. */
implicit val ImplicitPoolSetupTimeout: Timeout = 30 seconds

val hostName: String
val hostPort: Int

implicit val sslContext = {
/** Create a trust manager that does not validate certificate chains. */
val permissiveTrustManager: TrustManager = new X509TrustManager() {
override def checkClientTrusted(chain: Array[X509Certificate], authType: String): Unit = {
}
override def checkServerTrusted(chain: Array[X509Certificate], authType: String): Unit = {
}
override def getAcceptedIssuers(): Array[X509Certificate] = {
null
}
}

val initTrustManagers = Array(permissiveTrustManager)
val ctx = SSLContext.getInstance("TLS")
ctx.init(null, initTrustManagers, new SecureRandom())
ctx
}

def initClientPool(): Future[ActorRef] = {
val hostPoolFuture = for {
Http.HostConnectorInfo(connector, _) <- IO(Http) ? Http.HostConnectorSetup(hostName, port = hostPort,
sslEncryption = true)
} yield connector
}
}

关于ssl - 如何使用 Spray https 客户端定义 SSLContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28396173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com