【问题标题】:how to ignore Play Framework WS SSL certs without making my entire application insecure?如何在不使我的整个应用程序不安全的情况下忽略 Play Framework WS SSL 证书?
【发布时间】:2014-12-09 03:31:25
【问题描述】:

新人警报!我会尽量简明扼要地描述这一点。

Scala 2.10.3,播放 2.2.1。

我有一个在 HTTPS 上使用的播放应用程序。我的 conf/application.conf 文件中有一个设置,用于确保我的 Play 应用使用 SSL(并且已经过测试并且没问题):

session.secure=true

但现在,我希望我的 play 应用程序使用 WS 库连接到 Web 服务。该网络服务使用自签名 SSL 证书在 HTTPS 上。我可以在我的conf/application.conf 文件中设置以下设置,这样我就不必处理网络服务证书——我更喜欢这样。 (网络服务有点特殊,所以我宁愿根本不处理它的证书):

ws.acceptAnyCertificate=true

当我将这两个都设置为true 时,一切似乎都可以编译和运行。但是这两种不同的设置是否相互作用、重叠和/或干扰?如果我使用 AsyncHttpClient 并设置 SSLContext,对我的应用程序是否更安全?

我尝试在conf/application.conf 中设置密钥管理器和密钥库,但我的 WS 调用导致 SSLEngine 错误 - 我认为这是由于我使用 Play 2.2.1 造成的,而对 WS 的 SSL 支持仅在 Play 2.3 上可用。 x +

注意: 我使用 WS 进行了以下类型的调用。我需要完成未来的响应,我的函数将返回一个布尔值。我应该改用

def myfun : Boolean = {
    var ret : Boolean = false
    val futureResult = WS.url("https://somewhere.com").post(jsonInput) onComplete {
       case Success(response) => { 
        ret = true
      }
      case Failure(e) => { 
        Log.error("badness")
      }
    }
    ret
}

参考:

How do I ignore ssl validation in play framework scala ws calls

https://www.playframework.com/documentation/2.2.x/ScalaWS

https://www.playframework.com/documentation/2.3.x/WSQuickStart

【问题讨论】:

  • FWIW,myfun 总是会返回 false。
  • 在将代码发布到此处之前,我已将其匿名化。它的唯一目的是展示我正在与 WS 进行的那种通话。

标签: scala ssl https playframework-2.0


【解决方案1】:

您不应设置 ws.acceptAnyCertificate。如果您打算进行客户端身份验证,则只需要一个密钥管理器和一个密钥库。

改为将自签名证书添加到您的信任库中,或者在命令行中使用“javax.net.ssl.trustStore”定义自定义信任库——详情请参阅http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#Customization

https://www.playframework.com/documentation/2.3.x/CertificateGeneration 将引导您了解如何将证书添加到信任库。

还有一个应该有帮助的激活器模板:http://typesafe.com/activator/template/play-tls-example

【讨论】:

  • 谢谢,我会尝试在命令行上定义它。我认为您对 Play 的文档不正确。我正在使用 Play 2.2.1(请参阅上面的原始 SO 问题)
  • 该文档将指导您如何使用 keytool,而不是 Play。
  • 文档适用于 Play 2.3.x。使用您发布的链接中的 keytool 不适用于 Play 2.2.x。我将按照您的建议使用自签名信任库设置系统变量。
【解决方案2】:

我发布答案只是因为 Will Sargent 的答案引用了 Play 文档,该版本在我的 Play 版本中不起作用(2.3.x 与 2.2.x)

解决方案来自 Will Sargent:

您不应设置 ws.acceptAnyCertificate。如果您打算进行客户端身份验证,您只需要一个密钥管理器和一个密钥库。 将自签名证书添加到您的信任库,或在命令行中使用“javax.net.ssl.trustStore”定义自定义信任库——详情请参阅http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#Customization

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多