2017-05-11 6 views
1

이 질문은 Force TLS > 1.0 on AppEngine local development server in Java과 비슷하지만 정적 SDK 위치 (?)로 가정하기 때문에 대답이 작동하지 않는다는 점이 다릅니다.appengine dev 서버 SDK에 TLS 1.2 적용

TLSv1.2를 사용하여 HTTPS를 통해 통신하는 타사 결제 라이브러리 (braintree)를 사용하는 Google App Engine 애플리케이션이 있습니다. (앱 엔진 땅으로 배치 할 때와하지)

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) 
이 오류는 앱 엔진 개발 서버에서 발생 하다니

: 그러나 때마다 브레인 라이브러리는 결과 urlfetch 항상 다음과 같은 오류를주는 브레인 트리 샌드 박스 환경에 호출을 , 그것은 내가 개발할 때 필요한 것들을 테스트 할 수 없다는 것을 의미합니다.

에 따르면 : https://groups.google.com/forum/#!topic/google-appengine-stackoverflow/tdr4T1CJRn8 문제는 App Engine이 TLSv1.2를 사용하지 않는다는 것입니다.

내 응용 프로그램은 SDK 버전 1.9.26을 사용하는 App Engine 앱 (표준 환경)입니다.

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 "[email protected]" 

downloadSdk = false 설정 : 내가 읽고 내 로컬에서 appengine-SDK 디렉토리에 dev_appserver.sh를 업데이트 시도

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 
    } 

} 

:과 같이

내 Gradle을 구성의 appengine 섹션 본다 그리고 작업이 실제로 그것을 사용하도록 appengine.sdk.root을 설정하십시오.

내 코드에서 이러는 나는 또한 시도를 자바 8. 을 사용할 수 없습니다 :이의 System.setProperty("https.protocols", "TLSv1.2");

없음 작동하지 않습니다. 나는 틀린 나무를 짖고 모든 잘못을 저 지르거나 잘못된 것을하고있다.

어떻게 작동합니까?

업데이트 :

문제가의 SSLSocketFactory가 생성되지 않습니다 것을 실제로 같은 URL을 가져올 수는 HttpsURLConnection (App Engine URLfetch to validate self-signed certificate)

가 아직도 해결을 위해 검색 반환하지 않습니다 때문에이 보인다.

답변

0

이 문제를 해결하려면 Java 8 SDK에서 프로젝트를 로컬로 실행해야했습니다. Java 8은 아직 App Engine에서 지원되지 않지만 적어도 Braintree 샌드 박스 지불을 개발하고 실제로 내 워크 플로를 테스트 할 수 있습니다.

+ ;는 프로젝트 SDK로 변경, 프로젝트 설정을 가지고 : 다음 빌드 서버에 의존 할 수

는 여전히 인 IntelliJ에서이 작업을 수행하려면 자바 7에서

빌드 확인 자바 1.8 : 는 Preferences

그런 gradle clean build을 실행 + ,Project Settings

다음 Use Project JDK에 Gradle을 JVM 옵션을 변경, 환경 설정을 불러 오십시오. 그런 다음 appengineRun gradle 작업을 실행하여 dev 시스템을 시작하면 모두 정상적으로 작동합니다.

두 번째 대답에서 언급 한 바와 같이 : Force TLS > 1.0 on AppEngine local development server in Java Java 8은 기본적으로 TLSv1.8을 사용합니다.

실제 실행되는 JRE 이외의 다른 JRE에서 앱을 개발하고 테스트하는 것이 완전히 잘못되었다고 느껴지더라도, 반드시해야합니다. :(