开发者社区 问答 正文

OSS Android SDK编译出错

Downloading https://services.gradle.org/distributions/gradle-3.3-all.zip

Exception in thread "main" java.lang.RuntimeException: javax.net.ssl.SSLException: Received fatal alert: protocol_version
	at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:78)
	at org.gradle.wrapper.Install.createDist(Install.java:47)
	at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:129)
	at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48)
Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_version
	at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
	at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
	at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1979)
	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1086)
	at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359)
	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343)
	at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1301)
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
	at org.gradle.wrapper.Download.downloadInternal(Download.java:59)
	at org.gradle.wrapper.Download.download(Download.java:45)
	at org.gradle.wrapper.Install$1.call(Install.java:60)
	at org.gradle.wrapper.Install$1.call(Install.java:47)
	at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65)
	... 3 more
root@host:/home/develop/aliyun-oss-android-sdk/oss-android-sdk# 

展开
收起
engineer97 2020-03-20 09:38:59 808 分享 版权
1 条回答
写回答
取消 提交回答
  • 目前从JDK1.8开始都默认TLSv1.2协议了,但对于还在用版本低的JDK时,如果服务端禁用了TLSv.1 ,而代码中没有指定具体协议版本,那么JDK都是采用默认版本建立连接。这样会出现以下错误: javax.net.ssl.SSLException: Received fatal alert: protocol_version) 出现此类错误,有可能就是服务端和客户端协议版本不一致导致的。 程序中可以这样解决:

    第一种方式:

    		//以下只贴了如何设置tls版本号的代码
    		SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); //这边指定tls版本
    		sslContext.init(kmf.getKeyManagers(),tm, null);
    		SSLSocketFactory factory = sslContext.getSocketFactory();
    		URL url = new URL(merchantInfo.getUrl());
    		HttpsURLConnection urlc = (HttpsURLConnection) url.openConnection();
    		urlc.setSSLSocketFactory(factory);  //这一步很重要
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    

    采用httpClient发送请求也和这个代码类似,就不放示例了

    第二种方式:

    		SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
    		sslContext.init(null,null,null);
    		SSLContext.setDefault(sslContext); 
    
    1
    2
    3
    

    第二种方式setDefault是全局性的,相当于整个程序如果没有指定TLS版本,那么默认都采用1.2,会影响程序中其它使用默认TLS版本的地方,比如:之前使用默认TLSv1.0版本的,如果你设置了setDefault()变成1.2了,如果服务端不支持1.2协议会发生异常,不过现在应该没有不支持1.2协议的,所以大家自己考虑采用哪种方式。 还有人说用了第二种方式不起作用,那么我解释一下: 比如使用JDK自带的HttpsURLConnection发送https请求,代码如下:

    		//以下只是部分需要展示的代码
    		URLConnection connection = url.openConnection();  //这一步回去创建连接,这时候会调用SSLContext.getDefault().getSocketFactory(); 会返回我们上面设置的TLSv1.2协议SSLSocketFactory,这样我们setDefault()方法是有效的。
    		HttpsURLConnection httpsURLConnection = (HttpsURLConnection) connection;
    		httpsURLConnection.setRequestMethod(HttpTransportConstants.METHOD_POST);
    		httpsURLConnection.setUseCaches(false);
    		httpsURLConnection.setDoInput(true);
    		httpsURLConnection.setDoOutput(true);
    		httpsURLConnection.setConnectTimeout(getConnectTimeout());
    		httpsURLConnection.setReadTimeout(getReadTimeout());*/
    		//不过有些程序会有如下代码,SSLSocketFactory又重新设置了一遍, SSLContext.getInstance("ssl");获取的是TLSv1.0协议,这样又使用了TLS1.0协议进行通讯了,就不会起到效果,其实下面这点代码就是第一种方式介绍的。
    		SSLContext sc = SSLContext.getInstance("ssl");
    		sc.init(null, null, new java.security.SecureRandom());
    		httpsURLConnection.setSSLSocketFactory(sc.getSocketFactory());
    
    2020-04-15 23:17:13
    赞同 展开评论