【问题标题】:Force TLS 1.2 on appengine dev server SDK在 appengine 开发服务器 SDK 上强制使用 TLS 1.2
【发布时间】:2017-05-11 14:58:31
【问题描述】:

这类似于这个问题:Force TLS > 1.0 on AppEngine local development server in Java,只是答案不起作用,因为它假定一个静态 SDK 位置(?)。

我有一个使用第三方支付库 (braintree) 的 Google App Engine 应用程序,该库使用 TLSv1.2 通过 HTTPS 进行通信。然而,每当braintree 库调用braintree 沙盒环境时,生成的urlfetch 总是给出以下错误:

Caused by: javax.net.ssl.SSLHandshakeException: Could not verify SSL certificate for URL: https://api.sandbox.braintreegateway.com:443/merchants/**********/client_token
    at com.google.appengine.api.urlfetch.URLFetchServiceImpl.convertApplicationException(URLFetchServiceImpl.java:174)
    at com.google.appengine.api.urlfetch.URLFetchServiceImpl.fetch(URLFetchServiceImpl.java:43)
    at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.fetchResponse(URLFetchServiceStreamHandler.java:543)
    at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getInputStream(URLFetchServiceStreamHandler.java:422)
    at com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getResponseCode(URLFetchServiceStreamHandler.java:275)
    at com.braintreegateway.util.Http.httpRequest(Http.java:120)

虽然此错误仅发生在 App Engine 开发服务器上(而不是在部署到 App Engine 领域时),但这仍然意味着我无法测试我在开发中需要的东西。

据此:https://groups.google.com/forum/#!topic/google-appengine-stackoverflow/tdr4T1CJRn8 问题是 App Engine 没有使用 TLSv1.2。

我的应用程序是使用 SDK 版本 1.9.26 的 App Engine 应用程序(标准环境)。

我的 gradle 配置的 appengine 部分如下所示:

appengine {
    httpAddress = "0.0.0.0"
    httpPort = 8888
    downloadSdk = false

    appcfg {
        update {
            useJava7 = true
        }

        jvmFlags = ['-Ddatastore.backing_store=../../src/main/webapp/WEB-INF/appengine-generated/local_db.bin',
                    // Desperation:
                    '-Ddeployment.security.TLSv1.0=false',
                    '-Ddeployment.security.TLSv1.1=false',
                    '-Ddeployment.security.TLSv1.2=true',
                    '-Dhttps.protocols=TLSv1.2',
                    '-Dappengine.fullscan.seconds=5',
                    '-Xdebug',
                    '-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8889',
                    '-XX:MaxPermSize=512m']
        oauth2 = true
        extraOptions = appCfgOpts
    }

    enhancer {
        api = "jdo"
        version = "v1"
        enhanceOnBuild = true
    }

}

我已尝试将本地 appengine-sdk 目录中的 dev_appserver.sh 更新为:

exec "${RUN_JAVA}" "${SCRIPT_NAME}" \
    -Dhttps.protocols=TLSv1.2 -Ddeployment.security.TLSv1.0=false -Ddeployment.security.TLSv1.1=false -Ddeployment.security.TLSv1.2=true -ea -cp "${JAR_FILE}" \
    com.google.appengine.tools.KickStart \
    com.google.appengine.tools.development.DevAppServerMain "$@"

并设置downloadSdk = false 并设置appengine.sdk.root 以便gradle appengineRun 任务实际使用它。

我无法使用 Java 8。 我也试过把它放在我的代码中: System.setProperty("https.protocols", "TLSv1.2");

这些都不起作用。要么我找错了树,尝试了所有错误的事情,要么我做错了什么。

我怎样才能让它工作?

更新:

看起来问题实际上是从未创建过 sslSocketFactory,因为 urlfetch 永远不会返回 HttpsURLConnection (App Engine URLfetch to validate self-signed certificate)

仍在寻找解决方案。

【问题讨论】:

    标签: google-app-engine braintree tls1.2


    【解决方案1】:

    为了解决这个问题,我必须在 Java 8 SDK 下本地运行项目。尽管 App Engine 尚不支持 Java 8,但至少我可以在开发中进行 Braintree 沙盒支付并实际测试我的工作流程。

    然后我可以依靠构建服务器来检查它是否仍然在 Java 7 下构建。

    在 IntelliJ 中执行此操作:

    +; 调出 Project Settings,然后将 Project SDK 更改为 Java 1.8:

    +, 调出首选项,然后将 Gradle JVM 选项更改为 Use Project JDK

    然后运行gradle clean build。然后运行appengineRun gradle 任务启动开发系统,一切都应该没问题。

    正如这里的第二个答案所述:Force TLS > 1.0 on AppEngine local development server in Java Java 8 默认使用 TLSv1.8。

    尽管在 JRE 上开发和测试您的应用程序而不是实际运行的 JRE 感觉完全错误,但需求必须如此。 :(

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2018-12-10
      • 1970-01-01
      • 2015-12-04
      相关资源
      最近更新 更多