Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 覆盆子派上的HTTPS太慢了。我能怎么办?我应该选择哪种密码? 问题_Java_Ssl_Youtube Api_Raspberry Pi_Apache Httpclient 4.x - Fatal编程技术网

Java 覆盆子派上的HTTPS太慢了。我能怎么办?我应该选择哪种密码? 问题

Java 覆盆子派上的HTTPS太慢了。我能怎么办?我应该选择哪种密码? 问题,java,ssl,youtube-api,raspberry-pi,apache-httpclient-4.x,Java,Ssl,Youtube Api,Raspberry Pi,Apache Httpclient 4.x,使用YouTube数据Api v3将视频从我的树莓派上传到YouTube速度太慢。我得到的最大速率是120 KB/s。我希望能够归档高达1MB/s的速率 为什么我认为SSL是问题所在 为了将视频上传到YouTube,我曾经运行过一个小型java程序,我可以在一个树莓派上运行一整晚,以节省电能。它连接到YouTube数据API v2。我有三个互联网连接,最快的是LTE移动连接。有了这个我的旧应用程序可以以每秒1兆字节的速度上传(而且它非常可靠,直到我包含的30GB数据用完为止,这就是为什么我只在紧

使用YouTube数据Api v3将视频从我的树莓派上传到YouTube速度太慢。我得到的最大速率是120 KB/s。我希望能够归档高达1MB/s的速率

为什么我认为SSL是问题所在 为了将视频上传到YouTube,我曾经运行过一个小型java程序,我可以在一个树莓派上运行一整晚,以节省电能。它连接到YouTube数据API v2。我有三个互联网连接,最快的是LTE移动连接。有了这个我的旧应用程序可以以每秒1兆字节的速度上传(而且它非常可靠,直到我包含的30GB数据用完为止,这就是为什么我只在紧急情况下使用它)

现在,我已经为我的应用程序创建了一个后续应用程序,它使用API v3。与v2api上传不同,现在还使用HTTPS连接。但是现在我上传的速度不能超过120kb/s

经过数小时令人沮丧的调试,我认为问题是由SSL造成的CPU负载造成的。为了验证这一点,我在我的计算机上启动了一个企业级的caugh HTTPS服务器(通过以太网连接到树莓派):

#创建自签名证书(默认情况下回答证书提出的所有问题)
openssl请求-x509-新密钥rsa:2048-keyout key.pem-out cert.pem-第100天-节点
#在端口5454上运行服务器:
openssl s_服务器-接受5454-key-key.pem-cert-cert.pem>/dev/null
我组装了一个使用Apache HttpClient 4.3的小型Java程序(就像我的应用程序一样),并执行了一个视频“上传”:

final progressreportinghtpentity entity=new progressreportinghtpentity(新文件实体(一些视频文件,ContentType.APPLICATION_八位字节流));
请求。设置实体(实体);
HttpClientBuilder
.create()
.setSSLSocketFactory(
新SSLConnectionSocketFactory(
新的SSLContextBuilder()
.loadTrustMaterial(空,新TrustSelfSignedStrategy())
.build(),
新AllowlHostNameVerifier()
)
)
.build().execute(请求);
使用此设置,我的笔记本电脑可以向自身传输60MB/s(12%的CPU传输到Java(i7的一个核心),8%传输到OpenSSL)

覆盆子派仍然可以传输1MB/s(这足够快了)。然而,据我所知,googleapis服务器更喜欢密码
TLS\u ECDHE\u RSA\u和\u AES\u 128\u GCM\u SHA256
。因此,我重新启动了本地服务器,如下所示:

openssl s_服务器-接受5454-密钥key.pem-证书cert.pem-密码ECDHE-RSA-AES128-GCM-SHA256>/dev/null
宾果!我不会得到比120KB/s更好的传输速率


我尝试了不同的密码,在apache HTTP客户端中明确设置了支持的密码,例如密码
TLS\u DHE\u RSA\u with_AES\u 128\u CBC\u SHA
做得很好,达到了1,3MB/s

问题
我能怎么办?哪种密码可以在性能和安全性之间提供适当的平衡?在比较了支持的密码图表和盲目猜测之后,我认为
TLS\u DHE\u RSA\u和\u AES\u 128\u CBC\u SHA
可能是一个不错的选择,谷歌会支持它。但实际上看起来不是这样(在ApacheHTTP客户机中设置此密码可以与我的测试服务器通信,但与google中断)


或者我还可以做些什么来提高SSL吞吐量?例如,是否有一个ARM优化的SSL库可以以某种方式注入JRE(以防Java 8 ARM JRE还没有包含这样的内容)?

解决此问题的最快方法可能是完全避免SSL连接,而是使用YouTube的“通过电子邮件上传”选项通过SMTP上传视频

一旦您从YouTube设置页面获得上传视频的唯一电子邮件地址,就有很多方法可以从RaspberryPi发送电子邮件,并且您可以使用不加密的直接SMTP来获得最佳性能

虽然您可能会担心由于base64编码,SMTP上传视频的效率太低,但YouTube似乎明智地支持8位编码。下面是一个快速的TELNET测试,显示了它们支持的功能

220 gmr-mx.google.com ESMTP hq8si1005325qcb.2 - gsmtp
EHLO josh.com
250-gmr-mx.google.com at your service, [108.29.37.132]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8

你一定是在某个时候误读了什么。当你用AES 128 CBC SHA尝试密码时,你可能真的想用AES 128 CBC SHA尝试密码(它们看起来很相似)

按如下方式初始化http客户端:

返回HttpClientBuilder.create()
.disableAutomaticRetries()
.setSSLSocketFactory(
新SSLConnectionSocketFactory(
新建SSLContextBuilder().build(),
无效的
新字符串[]{“TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA”},
SSLConnectionSocketFactory.BROWSER\u兼容的\u主机名\u验证器
)
)
.build();
根据我的测试,这将足够快,以1MB/s的速度上传你的树莓派


不幸的是,我不是安全专家,我不能告诉你这个选择对你的安全意味着什么。另外,如果你只支持一个密码,我也不知道你的应用程序会变得多么脆弱。

我需要能够恢复中断的上传,这是无法使用SMTP完成的。此外,由于SMTP是7位ASCII协议,因此附加的数据在SMTP中采用base64编码。这会给数据增加33.33%的开销,这是非常可观的。如果SMTP事务被中断,您可以重试>这会给数据增加33.33%的开销,这是非常可观的:它不必被中断。服务器支持8BITMIME>我需要能够恢复中断的上传:我认为这可以在服务器支持的情况下完成CHUNKING@oleg:关于8BITMIME的观点很好。然而,据我所知,分块是不可能恢复国际米兰的