社区
其他技术讨论专区
帖子详情
Android TLS握手
weixin_38066919
2019-09-12 01:15:32
我想了解Android到服务器的TLS连接.任何人都可以纠正我吗? 启动TLS连接有两种.首先,只有服务器有证书,客户决定信任与否.其次,客户端和服务器都有证书.我对吗? 如何在Android设备上为TLS连接生成自定义唯一证书并将其用于连接到服务器?我发现只实现了第一种连接. 有谁能够帮我?
...全文
85
1
打赏
收藏
Android TLS握手
我想了解Android到服务器的TLS连接.任何人都可以纠正我吗? 启动TLS连接有两种.首先,只有服务器有证书,客户决定信任与否.其次,客户端和服务器都有证书.我对吗? 如何在Android设备上为TLS连接生成自定义唯一证书并将其用于连接到服务器?我发现只实现了第一种连接. 有谁能够帮我?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
1 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
weixin_38071769
2019-09-12
打赏
举报
回复
要通过TLS实现双方身份验证,您需要在服务器端和客户端上拥有密钥库. 我通常使用Portecle工具来创建密钥库,它是一个非常容易使用的基于Java的工具.您可以在portecle.sourceforge.net上下载它 您将需要使用该工具为服务器端创建JKS格式的密钥库,并为客户端创建BKS格式的另一个密钥库.格式不同,因为Android本身不支持使用JKS密钥库,只支持BKS,反之亦然. 一旦创建了两个密钥库,就需要为每个密钥库生成密钥对(公钥和私钥). Portecle在工具栏上有一个按钮,在“工具”子菜单下调用,可以执行此操作.公共密钥算法和大小是RSA 2048位.之后,您需要为证书设置一些参数,例如组织单位,名称,地点等. 现在你有两个密钥库和两个密钥对. 要允许客户端解密服务器接收的消息,必须为客户机密钥库提供服务器密钥库的公钥.要做到这一点,只需右键单击服务器密钥库上的密钥对,然后单击“导出”选项.然后选择“证书链”并在文件系统上选择一个位置来存储证书. 现在,您已准备好在客户端密钥库中导入公钥.为此,请单击“工具”工具栏并选择“导入可信证书”,然后查找在上一步中导出的证书文件.将出现一些警告消息,指示您无法建立信任路径,暂且不用担心. 因此,现在您拥有带密钥对的客户端密钥库和服务器证书.这在客户端就足够了. 现在,有必要将客户端密钥对导入服务器密钥库.在客户端密钥库上,右键单击密钥对,然后选择“导出”.在打开的弹出窗口中选择“私钥和证书”,然后选择PKCS#12格式. 然后,打开服务器密钥库并使用“工具”工具栏的“导入密钥对”子菜单,然后选择在上一步中导出的密钥对. 请记住,以BKS格式保存客户端密钥库以及以JKS格式保存服务器密钥库非常重要. 好的,这都是密钥库,现在是编码的时候了. 我们从服务器代码开始吧.下一个片段是从我运行的java Spring项目中提取的.它是一个嵌入式tomcat,所以配置是纯java,很容易找到如何在传统的tomcat配置上配置ssl连接器,所以我只会放入嵌入式版本. private Connector createSslConnector() { //print the client keystore printClientKeystore(); Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler(); try { //read the keystore from the jar //and write it to a tmp file Resource keystoreResource = context.getResource("classpath:config/server.keystore"); byte[] keystoreData = readKeystore(keystoreResource.getInputStream()); File tmpKeystoreFile = File.createTempFile("keystore", ""); writeKeystore(tmpKeystoreFile, keystoreData); //keystore information final String keystoreFile = tmpKeystoreFile.getAbsolutePath(); final String keystorePass = "yourKeystorePass"; final String keystoreType = "pkcs12"; final String keystoreProvider = "SunJSSE"; final String keystoreAlias = "comics_tomcat"; connector.setScheme("https"); connector.setAttribute("clientAuth", "true"); connector.setPort(HTTPS_PORT); connector.setSecure(true); protocol.setSSLEnabled(true); //keystore protocol.setKeystoreFile(keystoreFile); protocol.setKeystorePass(keystorePass); protocol.setKeystoreType(keystoreType); protocol.setProperty("keystoreProvider", keystoreProvider); protocol.setKeyAlias(keystoreAlias); //truststore protocol.setTruststoreFile(keystoreFile); protocol.setTruststorePass(keystorePass); protocol.setPort(HTTPS_PORT); return connector; } catch (IOException e) { LOGGER.error(e.getMessage(), e); throw new IllegalStateException("cant access keystore: [" + "keystore" + "] or truststore: [" + "keystore" + "]", e); } } 这一切都是针对服务器端的,你有一个带有安全标志的ssl连接器,使用’setSecure(true)’方法.这允许您使用私钥/公钥验证来要求用户身份验证. 以下代码用于客户端,它加载密钥库,信任库(通过使用相同的密钥库),配置主机名验证程序以允许连接到特定域,然后打开连接. KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); //load keystore stream byte[] keystoreData = readInputStream(getAssets().open("client.keystore")); //load keystore ByteArrayInputStream bais = new ByteArrayInputStream(keystoreData); keyStore.load(bais, KEYSTORE_PASSWORD.toCharArray()); //load truststore bais = new ByteArrayInputStream(keystoreData); trustStore.load(bais, KEYSTORE_PASSWORD.toCharArray()); //load trustmanager TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(trustStore); //init keymanager KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keyStore, KEYSTORE_PASSWORD.toCharArray()); //create ssl context sslContext = SSLContext.getInstance("TLS"); sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); HostnameVerifier HOSTNAME_VERIFIER = new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { List<String> allowedHostnames = new ArrayList<String>(); allowedHostnames.add("pinterest.com"); allowedHostnames.add("192.168.1.43"); allowedHostnames.add("10.0.2.2"); return allowedHostnames.indexOf(hostname) != -1; } }; //open https connection URL url = new URL("https://" + SERVER_URL + ":" + SERVER_PORT + "/api/v1/publication/getDescriptor/" + publicationId); HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); urlConnection.setSSLSocketFactory(sslContext.getSocketFactory()); urlConnection.setHostnameVerifier(HOSTNAME_VERIFIER); //read server response byte[] serverResult = readInputStream(urlConnection.getInputStream()); 如果您有任何疑问,请告诉我!
android
兼容
tls
版本,低版本
Android
上
TLS
版本导致的诡异
握手
失败问题
接入某国外支付平台CashFree时,发现在低版本系统(小米红米1S青春版,
Android
4.3)上完全无法打开页面:低版本
Android
上
TLS
协议问题导致的SSL
握手
失败1详情提示SSL
握手
失败:低版本
Android
上
TLS
协议问题导致的SSL
握手
失败2在Logcat中可以看到大量报错:低版本
Android
上
TLS
协议问题导致的SSL
握手
失败3这些错误有几种:E/chromium_net: e...
Okhttp https
Android
5.0 以下
TLS
版本过低
握手
失败
异常如下: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x610df808: Failure in SSL library, usually a protocol error ...
深入
Android
Conscrypt源码:
TLS
/SSL引擎架构、
握手
流程与实战调试
TLS
/SSL协议是保障网络通信安全的基石,它通过加密、身份认证和数据完整性校验,为HTTP、IMAP等应用层协议提供安全传输层。其核心原理基于非对称加密协商会话密钥、对称加密传输数据,并借助数字证书体系验证通信方身份。在
Android
生态中,系统级的加密提供者Conscrypt是实现该协议的关键引擎,它基于BoringSSL构建,通过JCA架构为上层网络库提供高性能、高安全性的
TLS
/SSL服务。理解Conscrypt的架构与
握手
流程,对于解决证书验证、密码套件协商等工程实践问题至关重要,尤其在处理SSL
Android
OKHTTP
TLS
握手
失败:SSLException解析与实战排查指南
在移动应用开发中,HTTPS连接是保障数据安全传输的基石,其核心依赖于
TLS
/SSL协议在客户端与服务器之间建立加密信道。
TLS
握手
作为连接建立的初始阶段,涉及协议版本协商、密钥交换等关键步骤,任何环节的异常都可能导致连接失败。对于
Android
开发者而言,使用OKHTTP框架时遭遇的“Unable to parse
TLS
packet header”异常,正是
TLS
握手
在解析数据包头部时出现的典型故障,它直接反映了通信链路底层的数据格式错乱或协议不匹配。这类问题在涉及网络代理、服务器配置兼容性或混合开发
Android
4.4
TLS
1.2兼容方案:OKHTTP集成Conscrypt解决SSL
握手
失败
TLS
(传输层安全协议)是保障HTTPS通信加密与身份验证的核心协议,其版本演进直接决定了网络连接的安全性与兼容性。从原理上看,
TLS
握手
过程需要客户端与服务器协商出双方都支持的协议版本和加密套件。在
Android
平台上,系统对
TLS
协议的支持程度随版本迭代而提升,这带来了显著的技术价值:确保应用能在不同系统版本的设备上建立安全、稳定的网络连接。然而,在
Android
4.4等旧版本系统中,系统默认的
TLS
实现存在对
TLS
1.2支持不完整或默认关闭的问题,这直接导致了使用OKHTTP等网络库时出现SSL握
其他技术讨论专区
479
社区成员
790,917
社区内容
发帖
与我相关
我的任务
其他技术讨论专区
其他技术讨论专区
复制链接
扫一扫
分享
社区描述
其他技术讨论专区
其他
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章