社区
其他技术讨论专区
帖子详情
Android TLS握手
weixin_38066919
2019-09-12 01:15:32
我想了解Android到服务器的TLS连接.任何人都可以纠正我吗? 启动TLS连接有两种.首先,只有服务器有证书,客户决定信任与否.其次,客户端和服务器都有证书.我对吗? 如何在Android设备上为TLS连接生成自定义唯一证书并将其用于连接到服务器?我发现只实现了第一种连接. 有谁能够帮我?
...全文
31
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()); 如果您有任何疑问,请告诉我!
打印HTTP / S请求的时间,包括DNS查找,
TLS
握手
等。-Node.js开发
nettime打印HTTP / S请求的各个阶段的持续时间,例如DNS查找,
TLS
握手
,到第一个字节的时间等。类似于time命令,该过程测量进程的计时,nettime命令测量HTT。nettime打印各个阶段的持续时间HTTP / S请求的内容,例如DNS查找,
TLS
握手
,到第一个字节的时间等。类似于time命令,该命令测量进程的计时,nettime命令测量HTTP / S请求计时。 您可以在通过Node.js理解和衡量HTTP时序中找到更多信息。 注意:命令行选项在0.x和1.x版本之间进行了更改,因此它们与curl兼容。 如果您使用nettime命令行工具,请检查af
nativescript-yoonit-handshake:为
Android
和iOS实现动态SSL固定的NativeScript NPM
本机月经
握手
NativeScript NPM,为
Android
和iOS实现动态SSL固定。 关于 SSL固定是一种缓解针对安全HTTP通信的中间人攻击的技术,但缺点是证书的到期日期。 这解决了此问题,实现了动态SSL固定,在
TLS
握手
上提供了易于使用的指纹验证。 远程服务器必须负责更新证书。 安装 npm i -s @yoonit/nativescript-handshake 特别的感谢和感谢... 该库的当前版本取决于[Wultra SSL Pinning] ([
Android
](( )和iOS)。 用法 function updateFingerprint ( ) { this . $yoo . handshake . updateFingerprints ( "YOUR PUBLIC KEY" , "YOUR SERVICE URL" , ( re
okhttp的jar-okio.zip
OkHttp是一个高效的HTTP客户端,包含okhttp和okio,OkHttp 支持
Android
2.3 及以上版本
Android
平台, 对于 Java, JDK 1.7及以上.当网络出现问题的时候OkHttp依然坚守自己的职责,它会自动恢复一般的连接问题,如果你的服务有多个IP地址,当第一个IP请求失败时,OkHttp会交替尝试你配置的其他IP,OkHttp使用现代
TLS
技术(SNI, ALPN)初始化新的连接,当
握手
失败时会回退到
TLS
1.0。
okhttp-2.1.0.jar okip-1.0.1.jar
com.squareup.okhttp OKHTTP是一个HTTP客户端,优化点是: 1 支持SPDY,允许所有同一主机的请求分享一个socket。 2 连接池减少请求延迟(如果SPDY无效) 3 透明的GZIP(压缩格式)缩小下载大小 4 回应的缓存完全避免网络重复请求 当网络出现问题的时候,OKHTTP会依然有效:它将从常见的连接问题当中恢复。如果你的服务端有多个IP地址,当第一个地址连接失败时,OKHTTP会尝试连接其他的地址,这对IPV4和IPV6以及寄宿在多个数据中心的服务而言,是非常有必要的。OKHTTP利用
TLS
的特性初始化新的连接,如果
握手
失败便退回到SSLV3。 OKHTTP的使用很简单。其2.0API拥有流畅的构建器和稳定性。它支持同步阻塞请求和异步回调请求。你可以试试OKHTTP而不重写网络代码。okhttp-urlconnection模块实现了都很熟悉的java.net.HttpURLConnection的API,okhttp-apache模块实现了Apache的HttpClient的API。OKHTTP支持
Android
2.3以上,Java支持最低版本1.7。
http_all-2.1.0.jar.zip
com.squareup.okhttp OKHTTP是一个HTTP客户端,优化点是: 1 支持SPDY,允许所有同一主机的请求分享一个socket。 2 连接池减少请求延迟(如果SPDY无效) 3 透明的GZIP(压缩格式)缩小下载大小 4 回应的缓存完全避免网络重复请求 当网络出现问题的时候,OKHTTP会依然有效:它将从常见的连接问题当中恢复。如果你的服务端有多个IP地址,当第一个地址连接失败时,OKHTTP会尝试连接其他的地址,这对IPV4和IPV6以及寄宿在多个数据中心的服务而言,是非常有必要的。OKHTTP利用
TLS
的特性初始化新的连接,如果
握手
失败便退回到SSLV3。 OKHTTP的使用很简单。其2.0API拥有流畅的构建器和稳定性。它支持同步阻塞请求和异步回调请求。你可以试试OKHTTP而不重写网络代码。okhttp-urlconnection模块实现了都很熟悉的java.net.HttpURLConnection的API,okhttp-apache模块实现了Apache的HttpClient的API。OKHTTP支持
Android
2.3以上,Java支持最低版本1.7。
其他技术讨论专区
433
社区成员
791,270
社区内容
发帖
与我相关
我的任务
其他技术讨论专区
其他技术讨论专区
复制链接
扫一扫
分享
社区描述
其他技术讨论专区
其他
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章