Android SSLEngine 示例

2024-01-25

我需要为我正在开发的应用程序使用基于 TLS 的 TCP 套接字。我已经经历了几十个例子,虽然我没有问题地完成握手,但我似乎无法通过任何方式读取输入流(尝试了很多,包括 readline()、读取字符数组等)。每次我尝试时,应用程序都会在该位置冻结。如果我调试,它永远不会进入下一行代码。

在尝试的解决方案中,我决定转而使用 SSLEngine,因为这应该是 SSL 的 java.nio 的 Java 1.5 答案。然而,我发现one示例(此处:http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/samples/sslengine/SSLEngineSimpleDemo.java http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/samples/sslengine/SSLEngineSimpleDemo.java)这让我有点困惑,而且我还没有成功实现它。当我尝试时, unwrap() 调用会产生一个空缓冲区,我知道(通过在命令行上使用 OpenSSL)相关服务将数据推回管道。

欢迎提出建议,我已经在这上面浪费了太多时间。这是相关代码:

SSLEngine engine = sslContext.createSSLEngine(uri.getHost(), uri.getPort());
            engine.setUseClientMode(true);
            engine.beginHandshake();
            SSLSession session = engine.getSession();
            int bufferMax = session.getPacketBufferSize();
            int appBufferMax = session.getApplicationBufferSize() + 50;
            ByteBuffer cTo = ByteBuffer.allocateDirect(bufferMax);
            ByteBuffer sTo = ByteBuffer.allocateDirect(bufferMax);

            ByteBuffer out = ByteBuffer.wrap(sessionId.getBytes());
            ByteBuffer in = ByteBuffer.allocate(appBufferMax);


            debug("sending secret");
            SSLEngineResult rslt = engine.wrap(out, cTo);
            debug("first result: " + rslt.toString());
            sTo.flip();
            rslt = engine.unwrap(sTo, in);
            debug("next result" + rslt.toString());

该实现缺少一些关键部分。即握手可以在NEED_WRAP、NEED_UNWRAP、NEED_TASK这几个状态之间来回跳来协商连接。这意味着您不能先呼叫一个,然后再呼叫另一个。您需要循环状态,直到握手完成。

   while (handshaking) {
      switch (state) {
          case NEED_WRAP:
              doWrap();
              break;
          case NEED_UNWRAP:
              doUnwrap();
              break;
          case NEED_TASK:
              doTask();
              break;
        }
    }

Java SSL 和 NIO 的完整工作示例 http://onjava.com/pub/a/onjava/2004/11/03/ssl-nio.html

话虽如此,您应该知道 SSLEngine安卓坏了 http://code.google.com/p/android/issues/detail?id=12955。 Google 建议使用线程并根据该线程阻塞套接字。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android SSLEngine 示例 的相关文章

  • 关闭 Android 中的飞行模式

    如果 num gt 50 我想关闭飞行模式 我实现了这段代码 来自在 Android 中切换飞行模式 https stackoverflow com questions 5533881 toggle airplane mode in and
  • 定期运行任务(每天一次/每周一次)

    我想定期 每周 每天一次 运行一些任务 即获取我的网站新闻页面 即使我的应用程序已关闭 是否可以 是的 您需要查看报警管理器 http developer android com reference android app AlarmMan
  • Android 上的 Firebase:如何检查 Firebase 身份验证失败原因?

    我在 Android 上使用 Firebase 和 Firebase Auth 功能 I try FirebaseAuth signInWithEmailAndPassword如果失败 我想知道为什么登录过程失败 The signInWit
  • 使用 APDU 命令的有效 NFC 读取比特率是多少?

    我目前正在使用 Android IsoDep trancieve 函数发送和接收累计 1628 字节的数据 该函数分布在 35 个 APDU 命令 选择应用程序 身份验证 读取 中 字节计数包括返回的 MAC 校验和以及由 transcie
  • 应用程序实例是否始终在任何活动之前创建?

    在 Android 中 您可以通过扩展 Application 类并在 Manifest 中声明名称来提供您自己的 Application 类实现 我的问题是 这个实现是否总是在初始活动之前创建 或者活动可以在应用程序实例有时间创建之前启动
  • 按钮未显示在屏幕上

    我创建了一个应用程序 其中显示带有图像和文本的列表视图 我在页面末尾添加按钮 但这没有显示在屏幕上 我是 Android 新手 我该如何解决这个问题 这是我的 UI XML 代码
  • 如何将画廊意图中的“打开”更改为“完成”?

    我使用以下意图打开画廊来选择多个图像和视频 Intent intent new Intent intent setType image video intent putExtra Intent EXTRA ALLOW MULTIPLE tr
  • 连接到不可发现的蓝牙设备

    我正在开发一个安卓应用程序 只是一个一般性问题 是否可以连接到公开不可发现的设备 提前致谢 如果您之前已与该设备配对 则即使该设备未处于可发现模式 也可以再次连接到该设备 参见这篇文章 以编程方式连接到配对的蓝牙设备 https stack
  • 访问角落里的存储

    我能找到的与文件存储有关的最接近文档的是这个帖子 http nookdeveloper zendesk com entries 20257971 updated what are the size constraints on my app
  • 在 WebView 中完成 AdBlock

    我即将在我的 Android 应用程序中推出 WebView AdBlocking 我想知道这是否会有效地阻止广告 或者在 Webview 本身内是否还有更多工作要做 我尚未修改 基本上我有一个存储在 Android 资产中的主机文件 其中
  • 监听什么来检测 Android 中的请勿打扰模式更改?

    我希望我的应用程序在手机设置为请勿打扰模式 仅限闹钟 仅限优先级或完全静音 时显示通知 通过聆听 这效果非常好android media RINGER MODE CHANGED在快速设置中检查此模式并在已选择的选项卡中选择模式时 但是 当选
  • android 确定设备是否采用从右到左的语言/布局

    有没有办法确定设备是否使用从右到左的语言 例如阿拉伯语 而不是从左到右的语言 英语 与较旧的 API 级别 低至 10 兼容的东西是必要的 SOLUTION 我最终在接受的答案中使用了 xml 方法 接下来 我还添加了此处指示的代码 以应对
  • Google 移动广告和 Kindle Fire

    我最近用 Google 移动广告替换了 AdMob 库 对此我有一个疑问 广告会出现在 Amazon Kindle Fire 设备上吗 我问这个是因为我知道 Google 移动广告依赖于 Google Play 服务 所以我有点困惑 Goo
  • 如何在android中的操作栏中创建Edittext?

    我们可以在操作栏中使用编辑文本吗 在阅读了 Google 中的大量资源后 我找不到如何在操作栏中创建编辑文本 谁能告诉我该怎么做 您可以设置自定义View为了ActionBar像这样 getActionBar setCustomView R
  • jar 中的 apklib 有什么优点?

    我正在关注这个问题 https stackoverflow com questions 6059502 whats the difference between apklib and jar files但它并没有完全回答我的问题 jar 中
  • 如何在Android Compose中使用otf类型字体文件?

    我正在学习使用 Android Jetpack Compose 现在我有一个正则 otf字体文件在资产 字体 我想在文本中使用它 java lang RuntimeException Font asset not found commonu
  • ACCESS_BACKGROUND_LOCATION 不适用于低于 Q (29) 的 Android 版本

    我的应用程序面向 Android API 28 根据文档 https developer android com preview privacy location target android 10 我应该要求ACCESS BACKGROU
  • 不显示 WRITE_EXTERNAL_STORAGE 的权限对话框

    I want to download a file using DownloadManager And DownloadManager wants to WRITE EXTERNAL STORAGE permission I have in
  • 如何获取android手机型号、版本、sdk详细信息?

    如何获取android手机型号 版本 sdk详细信息 首先 看看 android sdk 页面上的这些 Build 类 http developer android com reference android os Build html h
  • 具有矢量可绘制的 ImageView 的 Resources$NotFoundException

    我遇到了崩溃 Resources NotFoundException用于在活动创建时绘制的矢量 21 日前崩溃 安卓工作室2 1 支持库24 0 0 Gradle插件2 1 0 目标SDK 23 最小SDK 15 buildTools版本

随机推荐

  • 泄漏:ByteBuf.release() 在被垃圾收集之前没有被调用。 Spring Reactor TcpServer

    我正在使用reactor core 1 1 0 RELEASE reactor net 1 1 0 RELEASE 正在使用netty all 4 0 18 Final reactor spring context 1 1 0 RELEAS
  • 如何修改 git post-update hook 以仅在一个(主)分支上激活?

    我在我的网络主机上设置了一个裸存储库 并从中克隆了一个存储库 只要将更改推送到裸存储库 该存储库就会更新 Web 主机上的克隆存储库本质上是 生产 它位于 public html 目录中 我非常严格地遵循了该网站上的说明 http www
  • 设置默认的 apache 虚拟主机

    除了选择它找到的第一个配置之外 还有其他更好的方法来设置默认的 apache 虚拟主机吗 我有一台包含许多域的服务器 其中只有一些域配置了 httpd 但默认的虚拟主机被切断 例如 aaa com 我真的希望它默认为 mmm com 吗 像
  • 已知起点和距离计算第二点

    使用纬度和经度值 A 点 我尝试计算另一个点 B 距离 A 点 X 米 距离 A 点 0 弧度 然后显示 B 点的纬度和经度值 示例 伪代码 PointA Lat x xxxx PointA Lng x xxxx Distance 3 Me
  • 如何在 Python 中打印 Unicode 字符代码?

    我想打印 unicode 的字符代码 而不是它在 Python 中表示的实际字形 例如 如果u是 unicode 字符列表 gt gt gt u 0 u u0103 gt gt gt print u 0 我想将字符代码输出为原始字符串 u
  • 设置 Github Commit RSS 源

    我正在尝试将我的 github 提交为 RSS feed 但到目前为止我还没有弄清楚 我知道私人提要可使用以下语法 https github com username atom token token 但这是用户的活动源 我想要我的一个项目
  • 如何使用 DynamoDB 进行基本聚合?

    dynamodb 是如何实现聚合的 Mongodb 和 couchbase 具有地图缩减支持 假设我们正在建立一个技术博客 用户可以在其中发布文章 并说文章可以被标记 user id 1235 name John article id 78
  • 在 R 中加载具有最新日期的文件[重复]

    这个问题在这里已经有答案了 假设我有一个文件想要在 R 中加载 让我们称之为file csv 将其加载到 R 中相当容易 不幸的是 在我的情况下 存在该文件的多个版本 并且每个文件都附加了一个日期 所以我的目录中真正拥有的是文件列表 例如
  • Gem::Ext::BuildError: 错误: 无法在 macOS Monterey 上构建 gem 本机扩展

    当我跑步时bundle install在我的 Rails 5 项目中 我在似乎具有本机扩展的 gem 上遇到了许多错误 以下是其中一个 gem 的输出顶部 Installing nio4r 1 2 1 with native extensi
  • Python 测试:使用带有 mock 和 io.StringIO 的假文件

    我正在尝试测试一些在文件上运行的代码 但我似乎无法理解如何使用真实文件替换mock and io StringIO我的代码大致如下 class CheckConfig object def init self config self con
  • Visual Basic UDPClient 服务器/客户端模型?

    因此 我正在尝试制作一个非常简单的系统 将消息从客户端发送到服务器 后来也从服务器发送到客户端 但首先是婴儿步骤 我不确定如何使用 UDPClient 发送和接收消息 尤其是接收消息 主要是因为我没有任何东西触发ReceiveMessage
  • 什么样的 Lua 多线程包在发布时“正常工作”?

    在 Lua 中编码时 我有一个三重嵌套循环 经过 6000 次迭代 所有 6000 次迭代都是独立的 并且可以轻松并行化 Lua 封装了哪些线程开箱即用编译 and 获得不错的并行加速在四个或更多核心上 到目前为止我所知道的是 luapro
  • iTunes Connect 应用程序分析、销售和趋势显示不同的值

    因此 当我访问 iTunes Connect 然后访问 销售和趋势 时 它显示我有 5 万台 我单击 设备 它显示 45k 来自桌面设备 4k 来自 iPhone 1k 来自 iPad 对我来说这看起来真的很奇怪 然后我进入 App Ana
  • FullCalendar - 向事件对象添加新属性

    有很多线程讨论类似的问题 但没有一个我能真正理解并应用于我的项目 我有一个数据库 其中包含一个包含多个字段的事件表 字段 1 字段 2 字段 3 我有一个 PHP 文件 json php 该文件 json encode 将该表转换为 JSO
  • ContentControl + RenderTargetBitmap + 空图像

    我试图创建一些图表图像 而不在屏幕上显示这些图表 我已经做了很长一段时间并尝试了很多不同的事情 但似乎没有任何效果 如果我首先在窗口中显示图表 则代码可以完美运行 但是如果我不在窗口中显示它 则位图只是带有黑色边框的白色 不知道为什么 我尝
  • 访问原始 Apache Web 服务器请求

    我打算设计一个网络 GPS 跟踪应用程序 GPS 使用 TCP 无 HTTP 标头 在端口 7070 我打算将其更改为 80 上传输数据 我知道 GPS 跟踪器和客户端之间的通信协议 但是我被困住了 因为我无法拦截网络服务器上的数据包 由于
  • 无法运行项目 - Android Studio 2.0 Crashlytics 问题

    我将 Android Studio 更新到 2 0 并尝试让即时运行正常工作 Gradle 同步有效 重建项目正在进行中 尝试运行 失败 我究竟做错了什么 变量 io fabric tools gradle 1 14 4 com andro
  • :hover 在拖放时粘在元素上

    我有简单的 ol li 结构 想添加拖放功能 此外 我想以不同的颜色突出显示悬停项目和拖动项目 但这是 WebKit 中的一个不寻常的错误 捕获最后一个项目 将其拖到顶部 将其拖放到第一项 最后一个元素捕获悬停伪类 为什么 我该如何预防 这
  • 代码语法荧光笔[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找自动语法荧光笔 当我指定代码的起点和终点时 语法突出显示应自动识别代码类型 例如 sql v
  • Android SSLEngine 示例

    我需要为我正在开发的应用程序使用基于 TLS 的 TCP 套接字 我已经经历了几十个例子 虽然我没有问题地完成握手 但我似乎无法通过任何方式读取输入流 尝试了很多 包括 readline 读取字符数组等 每次我尝试时 应用程序都会在该位置冻