从游戏应用程序访问SSL加密网页(Accessing SSL secured web page fr

2019-07-30 22:04发布

我访问来自游戏应用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-打电话到一个页面与-错误的证书

更新#3:默认的SSL上下文现在是默认设置。 把它们关掉在应用程序配置文件集ws.acceptAnyCertificate =真

更多信息请参见该WS.scala代码: https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/libs/ws/WS.scala

Answer 1:

在其play.api.libs.ws.WS类游戏! 框架使用宁异步HTTP客户端库 (1.7.0版本),这反过来又使用了Netty网络应用程序框架 (版本3.5)。 网状负责SSL验证,但它的结果通过异步HTTP客户端库处理。

这似乎是SSL验证时才可以被正确的固定在最近提交的异步HTTP客户端库 ,其中仅包含在1.7.5版本。 你可以尝试强制更新版本到您的项目(即重写1.7.0版本的播放参考!),也许开口,使得新的库版本可以包含在下次播放的问题! 发布。



文章来源: Accessing SSL secured web page from play application