错误:SSL握手中止:SSL=0x676A5680:SSL库失败,通常是协议错误
根据这个Android文档,API16+上支持TLS1.1和1.2,但默认情况下直到API20+才启用。我找到了一些支持OKHTTP的TLS1.1和1.2的解决方案(这里、这里、这里和这里)。我如何启用对ExoPlayer的TLS1.1/1.2支持?我找到的唯一一篇关于Exoplayer TLS 1.1/1.2支持的帖子是来自github的这篇文章,它建议在这里提问。
这只发生在API 21版本(Lollipop)以下。服务器使用的是TLS1.2协议,该协议在Android以下的Lollipop版本上是不支持的。
DefaultHttpDataSource
使用HttpSurlConnection
,后者具有默认SSLSocketFactory
的静态字段。除非对实例调用了SetSSLSocketFactory()
,否则HttpSurlConnection
的所有新实例都将分配此默认的SSLSocketFactory
。因此,从技术上讲,如果您在实例化DefaultTtpsDataSource
之前调用set defaultSSLSocketFactory
,它应该可以工作:
HttpsURLConnection.setDefaultSSLSocketFactory(new MyCustomSSLSocketFactory());
其中mycustomslsocketfactoy
可能如下所示:
class MyCustomSSLSocketFactory extends SSLSocketFactory {
private javax.net.ssl.SSLSocketFactory internalSSLSocketFactory;
public MyCustomSSLSocketFactory () throws KeyManagementException, NoSuchAlgorithmException {
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, null, null);
internalSSLSocketFactory = context.getSocketFactory();
}
@Override
public String[] getDefaultCipherSuites() {
return internalSSLSocketFactory.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites() {
return internalSSLSocketFactory.getSupportedCipherSuites();
}
@Override
public Socket createSocket() throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket());
}
@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));
}
@Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
}
@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort));
}
@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
}
@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort));
}
private Socket enableTLSOnSocket(Socket socket) {
if(socket != null && (socket instanceof SSLSocket)) {
((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"});
}
return socket;
}
}
但是请记住,这可能会在意想不到的地方改变应用程序的行为(极不可能,但谨慎行事也无妨),为了避免这种情况,您可以在使用DefaultHttpDataSource
之后将默认的SSLSocketFactory还原为旧的SSLSocketFactory。
不过,还有另一种更可靠的解决方案。您可以使用OKHttpDataSource
,其中您可以在构造函数中传递OKHttpClient
实例。这个OKHttpClient
实例可以配置为使用我们自定义的SSLSocketFactory
。它看起来像这样:
okhttpclient.sslSocketFactory(new MyCustomSSLSocketFactory());
DataSource dataSource = new DefaultUriDataSource(context, bandwidthMeter,
new OkHttpDataSource(okHttpClient, userAgent, null, bandwidthMeter));
我已经用Python 2.7开发了一个应用程序。但它只支持协议_TLSv1。我必须以某种方式使其与协议_TLSv1_1和协议_TLSv1_2兼容。我找不到任何图书馆或窍门。有必要升级Python版本吗? 请指导我或帮助我找到更好的解决方案。没有什么不碍事的解决方案吗?
我的Android应用程序已经有了一个运行正常的Exoplayer实现,我需要知道Exoplayer是否支持在HDCP中播放短跑视频(以及它是如何工作的)。演示应用程序有一些具有“HDCP功能”的示例,但我在代码库中找不到任何与它如何处理这一问题有关的内容(DASH manifest文件本身是否指定了HDCP功能?)。
问题内容: Visual Studio 2017中是否有一种方法可以自动为asp.net核心 Angular 项目启用Docker支持?创建新选项时,该选项被禁用。它仅适用于 Web应用程序(MVC) 。 创建项目后,我可以为角度项目启用Docker支持(项目->添加-> Docker支持),但是当我启动应用程序时,出现一个异常,提示node.js不可用。 发生System.AggregateEx
我试图在Spring Boot应用程序中启用CORS支持,但没有成功。我研究了很多解决方案,但似乎都不适合我。 当我尝试从Angular应用程序呼叫Java后端时,我在chrome中看到了错误: CORS策略阻止从源http://localhost:4200在http://localhost:8080/..处访问XMLHttpRequest:对预检请求的响应不通过权限改造检查:不允许对预检请求进行
需要什么步骤来使用这个库和构建我的应用程序与multidex支持?
问题内容: 我需要使用Selenium测试JS地理定位功能,并且正在使用chromedriver在最新的Chrome上运行测试。 现在的问题是,Chrome浏览器提示我在测试过程中启用Geolocation,而且我不知道如何在运行时单击该小条,因此我急切地寻找一种方法来通过某些选项或触发器启动chromedriver和chrome默认情况下启用此功能。我在这里只能找到如何完全禁用地理位置。 我该如