【发布时间】: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