我正在为嵌入式Linux设备添加HTTPS支持.我尝试使用以下步骤生成自签名证书:
openssl req -new > cert.csr
openssl rsa -in privkey.pem -out key.pem
openssl x509 -in cert.csr -out cert.pem -req -signkey key.pem -days 1001
cat key.pem>>cert.pem
Run Code Online (Sandbox Code Playgroud)
这有效,但我在使用Google Chrome时遇到了一些错误:
这可能不是您要找的网站!
该网站的安全证书不受信任!
我错过了什么吗?这是构建自签名证书的正确方法吗?
我想在我的Android应用程序中添加一个服务,该应用程序在后台运行,持有WebSocket连接(可能需要几个小时甚至几天),并定期将一些数据发送到服务器.
现在似乎有一堆用于Java的WebSocket库,我不确定应该使用哪一个:
来自GitHub的 TooTallNate/Java-WebSocket描述:用100%Java编写的准系统WebSocket客户端和服务器实现.http://java-websocket.org/ - 这是我在google搜索"android websocket"的第一个结果中链接的.但是,它有很多未解决的问题,尤其是关于SSL连接的问题,目前似乎没有积极维护.
来自GitHub的 koush/AndroidAsync描述:用于android的异步套接字,http(客户端+服务器),websocket和socket.io库.基于nio,而不是线程. - 许多公开问题,但似乎是维持/工作的活动.
项目Tyrus 来自网站的描述:JSR 356:用于WebSocket的Java API - 参考实现 - 这是由Oracle完成的.不确定它是否适用于Android.
来自网站的 Jetty WebSocket客户端API信息:Jetty还提供了一个Jetty WebSocket客户端库,可以更轻松地与WebSocket服务器进行通信. - 再次:不确定它是否适用于Android.
codebutler/android-websockets 来自GitHub的描述: Android的裸网最小websockets(hybi13/RFC)客户端 - 这个用于 schwiz/android-websocket-example,这是StackOverflow问题的接受答案"如何制作Android设备是否在没有唤醒锁定的情况下保持与Internet的TCP连接? "
来自GitHub的 Atmosphere/wasync描述:带有回退的WebSockets传输Node.js,Android和Java的客户端库 http://async-io.org
TakahikoKawasaki/nv-websocket-client 来自GitHub的描述:Java中的高质量WebSocket客户端实现.
square/okhttp
来自GitHub的描述:适用于Android和Java应用程序的HTTP + SPDY客户端.http://square.github.io/okhttp/
-它有一个Websocket模块.正如 scorpiodawg所提到的,OkHttp自3.5版以来就内置了websocket支持.
来自GitHub的 firebase/TubeSock说明:用Java实现的WebSocket客户端库
Autobahn | Android(GitHub) 网站描述:Autobahn | Android是一个用于Java/Android的开源网络库,由Autobahn项目创建,实现WebSocket协议和Web应用程序消息传递协议(WAMP),用于创建本机移动WebSocket/WAMP客户端.- cloudsurfin指出,这不支持wss.
此外,Android …
我正在使用Java的SSLSocket来保护客户端和服务器程序之间的通信.服务器程序还提供来自Web浏览器的HTTPS请求.
根据" 使用Java进行初始加密 ",第371页,您应始终呼叫setEnabledCipherSuites您的SSLSocket/ SSLServerSocket以确保最终协商的密码套件足够强大以满足您的需要.
话虽这么说,调用我SSLSocketFactory的getDefaultCipherSuites方法会产生180个选项.这些选项范围从TLS_RSA_WITH_AES_256_CBC_SHA(我认为相当安全)到SSL_RSA_WITH_RC4_128_MD5(不确定这是否安全,给定MD5的当前状态)到SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA(不完全确定它是什么).
什么是限制套接字的密码套件的合理列表?
请注意,客户端和服务器可以访问Bouncy Castle服务提供商,并且他们可能安装或不安装无限制的加密策略文件.
是否有类似于-D javax.net.debug=ssl在Java桌面应用程序的命令行设置,但对于Android?我已尝试在代码中设置它,System.setProperty("javax.net.debug", "ssl");但这不起作用.
如果没有办法启用此属性,是否至少有另一种方法来调试SSL连接的客户端?
编辑:只是为了澄清,这是指原始SSL套接字(SSLSocket和SSLSocketFactory),而不是Apache库或任何其他网络库.
Android 5.0 Lollipop中的DefaultHttpClient似乎被打破了.它无法设置与先前版本的Android成功设置的某些网站的连接.
例如,我尝试连接到https://uralsg.megafon.ru
//Create httpclient like in https://stackoverflow.com/questions/18523784/ssl-tls-protocols-and-cipher-suites-with-the-androidhttpclient
HttpClient client = new DefaultHttpClient(manager, params);
HttpGet httpGet = new HttpGet("https://uralsg.megafon.ru");
HttpResponse client = httpclient.execute(httpGet);
Run Code Online (Sandbox Code Playgroud)
此代码适用于Android 2.3-4.4,但在Android 5.0(设备和模拟器)上失败,错误连接被对等关闭.当然这是可以理解的,因为Android 5.0尝试将这个旧服务器与TLSv1.2和现代密码连接起来,并且它不支持它们.
好的,使用SSL/TLS协议中的示例代码和带有AndroidHttpClient的密码套件,我们将协议和密码限制为TLSv1和SSL_RSA_WITH_RC4_128_MD5.现在它失败了,出现了不同的错误:
javax.net.ssl.SSLHandshakeException: Handshake failed
caused by
error:140943FC:SSL routines:SSL3_READ_BYTES:sslv3 alert bad record mac
(external/openssl/ssl/s3_pkt.c:1286 0x7f74c1ef16e0:0x00000003)
at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake
Run Code Online (Sandbox Code Playgroud)
当然,这段代码在Android 2.3-4.4上运行顺畅.
我用wireshark检查了流量:
302 4002.147873000 192.168.156.30 83.149.32.13 TLSv1 138 Client Hello
303 4002.185362000 83.149.32.13 192.168.156.30 TLSv1 133 Server Hello
304 4002.186700000 83.149.32.13 192.168.156.30 TLSv1 1244 Certificate
305 …Run Code Online (Sandbox Code Playgroud) ssl android handshake apache-httpclient-4.x android-5.0-lollipop
我试图在Spring-boot 1.2.1上启用Tomcat上的TLS 1.2.由于SSL握手失败,Android 5.0无法连接到默认的SSL设置.Android 4.4,iOS,Firefox和Chrome都连接到默认版本.我认为这是因为Android 5.0支持的TLS协议和spring boot tomcat默认值(TLS v1?)不匹配.
我想我想要更改此application.properties设置:
server.ssl.protocol=TLS
Run Code Online (Sandbox Code Playgroud)
但我没有找到其他可接受的字符串(或者如果有,甚至).通过在spring boot github中搜索"protocol",我找不到枚举.我试过"TLSv1.2",但这似乎没有效果.
application.properties中的当前SSL配置是:
server.ssl.key-store = chainedcertificates.p12
server.ssl.key-store-password = secret
server.ssl.key-store-type = PKCS12
Run Code Online (Sandbox Code Playgroud)
如何在春季启动时启用TLS 1.2?
如果重要,我使用的是Java 1.7.这方面的文档似乎表明它应该支持TLS 1.2.
Tomcat 8似乎有支持.我不知道如何确切地检查春季启动中运行的版本.
ssl ×5
android ×3
java ×2
certificate ×1
encryption ×1
handshake ×1
node.js ×1
openssl ×1
spring-boot ×1
tomcat8 ×1
websocket ×1