从 Play 应用程序访问 SSL 安全网页

2023-12-28

我正在从 Play 应用程序访问 SSL 安全页面。 当页面的证书不可信时(因为它已过期或自签名或 无论是什么其他原因)我想从我的通话中提取此信息并且 相应地采取一些行动。 当我在浏览器中访问这样的页面时,它会警告我该页面有问题 证书。 当我在游戏中编写类似的内容时(此处的 https 页面有一个错误的证书):

package controllers

import play.api.mvc.{Action, Controller}
import play.api.libs.ws.WS
import java.util.concurrent.TimeUnit

object CallHttpsController extends Controller{


  def callHttps() = Action {

    val url = "https://xceed.no-ip.org/"

    val response: play.api.libs.ws.Response = WS.url(url).get.await(3, TimeUnit.SECONDS).get

    response.status match {
      case OK => Ok("Got response: " + response.body)
      case _ => Ok("Something went wrong: "+response.status+" "+response.body)
    }
  }
}

响应状态正常,我希望它抛出一个异常,表明有问题 与证书。

当证书不可信时,是否可以调用这样的页面并获得异常? 游戏默认支持吗? 有人有类似的问题/需要吗?

提前致谢。

更新#1:感谢宁的提示。 我已添加对构建脚本的依赖项:

  lazy val appDependencies = Seq(
    "com.ning" % "async-http-client" % "1.7.5"
  )

图书馆本身确实非常有帮助。然而,要按预期使用 SSL,显然需要初始化 SSL 上下文。我尝试过以下代码:

def callHttps() = Action {

    try{

      val url = "https://xceed.no-ip.org/"

      val response: play.api.libs.ws.Response = WS.url(url).get.await(3, TimeUnit.SECONDS).get // => No problem here

      Console.println(WS.client.getConfig.getSSLContext) // => null

      val sslContext = SSLContext.getDefault;
      val playConfig = play.api.Play.maybeApplication.map(_.configuration)
      val asyncHttpConfig = new AsyncHttpClientConfig.Builder()
    .setConnectionTimeoutInMs(playConfig.flatMap(_.getMilliseconds("ws.timeout")).getOrElse(120000L).toInt)
    .setRequestTimeoutInMs(playConfig.flatMap(_.getMilliseconds("ws.timeout")).getOrElse(120000L).toInt)
    .setFollowRedirects(playConfig.flatMap(_.getBoolean("ws.followRedirects")).getOrElse(true))
    .setUseProxyProperties(playConfig.flatMap(_.getBoolean("ws.useProxyProperties")).getOrElse(true))
    .setSSLContext( sslContext )

      playConfig.flatMap(_.getString("ws.useragent")).map { useragent =>
        asyncHttpConfig.setUserAgent(useragent)
      }
      val innerClient = new AsyncHttpClient(asyncHttpConfig.build())

      val resp = innerClient.prepareGet(url).execute().get() // => exception
      Console.println("All OK")

      Ok("Got response: " + resp.getResponseBody)

    }
    catch {
      case e: Exception =>
        var cause = e.getCause
        while (cause != null) {
          Console.println("Caused by: \n" + e.getLocalizedMessage + "\n" + e.getStackTraceString)
          cause = cause.getCause
        }

        Ok("Got Exception: " + e.getLocalizedMessage + "\n" + e.getStackTraceString)
    }
  }

从 WS 源代码中提取了一个客户端初始化,并将默认的 SSL 上下文传递给客户端。然后调用按预期失败。 会尝试通过玩来提高票数... 干杯!

更新#2:该问题现已解决,并将成为 2.0.4 游戏的一部分https://play.lighthouseapp.com/projects/82401/tickets/655-ws-call-wont-fail-upon-https-call-to-a-page-with-wrong-certificate https://play.lighthouseapp.com/projects/82401/tickets/655-ws-call-wont-fail-upon-https-call-to-a-page-with-wrong-certificate

更新#3:现在默认设置默认 ssl 上下文。要在应用程序配置文件中关闭它,请设置 ws.acceptAnyCertificate=true

有关详细信息,请参阅 WS.scala 代码:https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/libs/ws/WS.scala https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/libs/ws/WS.scala


In its play.api.libs.ws.WS上课玩!框架使用Ning 异步 HTTP 客户端库 https://github.com/sonatype/async-http-client(版本 1.7.0),它又使用Netty网络应用框架 https://netty.io(3.5 版)。 Netty 负责 SSL 验证,但其结果由异步 HTTP 客户端库处理。

看来 SSL 验证只能正确修复异步 HTTP 客户端库的最新提交 https://github.com/sonatype/async-http-client/pull/99,仅包含在 1.7.5 版本中。您可以尝试将较新的版本强制添加到您的项目中(即覆盖 Play 引用的 1.7.0 版本!),并且可能会打开一个问题,以便将较新的库版本包含在下一个 Play 中!发布。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Play 应用程序访问 SSL 安全网页 的相关文章

随机推荐