3

我正在使用 apache mina 在我的服务器和 android 客户端之间进行通信。当我通过不安全的连接连接时一切都很好,但几天前我决定使用 ssl 保护连接。Apache mina 有一个名为 SslFilter 的过滤器来完成任务 - 它使用我们提供密钥库和信任库的 ssl 上下文来建立安全连接。如果我在为 pc 编写的客户端上使用带有 mina 的 sslfilter,那么一切都像一个魅力,但是当我试图在 android 上使用它时 - 这并不是那么简单。首先,我们必须导入从服务器 SUN 格式的密钥库中提取的证书,并将其转换为匹配充气城堡提供程序 - 因为这似乎是 android 上唯一的安全提供程序。好的,我可以使用 keytool 和正确的命令轻松实现这一点。然后我'

86992 [NioProcessor-3] DEBUG AuthenticationManager - 会话已关闭:2 260628 [NioProcessor-1] DEBUG SslFilter - 将 SSL 过滤器 sslFilter 添加到链中 260629 [NioProcessor-1] DEBUG SslHandler - 会话服务器 [3](无 sslEngine)正在初始化SSL 处理程序 260642 [NioProcessor-1] 调试 SslHandler - 会话服务器 [3](无 sslEngine)SSL 处理程序初始化完成。260644 [NioProcessor-1] DEBUG SslFilter - Session Server3:开始第一次握手 260646 [NioProcessor-1] DEBUG SslHandler - Session Server3 处理 NEED_UNWRAP 状态 260703 [NioProcessor-1] DEBUG SslFilter - Session Server3:收到消息:HeapBuffer [ pos =0 lim=78 上限=2048:16 03 01 00 49 01 00 00 45 03 01 C4 C4 C4 C4 80...

260710 [NioProcessor-1] 调试 SslHandler - 会话 Server3 处理 NEED_WRAP 状态

260711 [NioProcessor-1] 调试 SslFilter - 会话 Server3:写入消息:WriteRequest:HeapBuffer[pos=0 lim=678 cap=1057:16 03 01 02 A1 02 00 00 46 03 01 50 5C 17 25 F6...] 260711 [NioProcessor-1] 调试 SslHandler - 会话 Server3 处理 NEED_UNWRAP 状态 260712 [NioProcessor-1] 调试 SslFilter - 会话 Server3:处理 SSL 数据 260867 [NioProcessor-1] 调试 SslFilter - 会话 Server3:收到消息:HeapBuffer [ pos= 0 lim=139 cap=2048: 16 03 01 00 86 10 00 00 82 00 80 10 B7 5D AC B3...] 260868 [NioProcessor-1] 调试 SslHandler - 会话 Server3 处理收到的消息 260868 [NioProcessor-1] DEBUG SslHandler - Session Server3 处理 NEED_UNWRAP 状态 260869 [NioProcessor-1] DEBUG SslHandler - Session Server3 处理 NEED_TASK 状态

260876 [NioProcessor-1] DEBUG SslHandler - Session Server3 处理 NEED_UNWRAP 状态 260877 [NioProcessor-1] DEBUG SslFilter - Session Server3:处理 SSL 数据 261133 [NioProcessor-1] DEBUG SslFilter - Session Server3:收到消息:HeapBuffer[ pos =0 lim=43 cap=1024: 14 03 01 00 01 01 16 03 01 00 20 65 07 FB 0F 1B...] 261134 [NioProcessor-1] DEBUG SslHandler - Session Server3 处理收到的消息 261135 [NioProcessor-1 ] DEBUG SslHandler - Session Server3 处理 NEED_UNWRAP 状态 261154 [NioProcessor-1] DEBUG SslHandler - Session Server3 处理 NEED_WRAP 状态

261157 [NioProcessor-1] DEBUG SslFilter - Session Server3:写入消息:WriteRequest:HeapBuffer[pos=0 lim=6 cap=8: 14 03 01 00 01 01] 261158 [NioProcessor-1] DEBUG SslHandler - Session Server3 处理 NEED_WRAP状态

261159 [NioProcessor-1] 调试 SslFilter - 会话 Server3:写入消息:WriteRequest:HeapBuffer[pos=0 lim=37 cap=66:16 03 01 00 20 83 D9 81 59 21 9E 03 32 A3 49 17...] 261159 [NioProcessor-1] DEBUG SslHandler - Session Server3 处理 FINISHED 状态 261160 [NioProcessor-1] DEBUG SslHandler - Session Server3 现在是安全的 261160 [NioProcessor-1] DEBUG SslHandler - Session Server3 处理 FINISHED 状态 261161 [NioProcessor-1] DEBUG SslHandler - Session Server3 现在受到保护 261161 [NioProcessor-1] 调试 SslFilter - Session Server3:处理 SSL 数据

如您所见 - 一切都很好。

261160 [NioProcessor-1] DEBUG SslHandler - Session Server3 现在是安全的 261160 [NioProcessor-1] DEBUG SslHandler - Session Server3 处理 FINISHED 状态 261161 [NioProcessor-1] DEBUG SslHandler - Session Server3 现在是安全的

上面的清单显示连接现在是安全的。成功 !!万岁!!但一点也不,因为在成功 SSL 'dance' android 客户端尝试以与 pc 客户端相同的方式发送消息......然后什么也没有发生。什么都没有.. 应用程序在调用 SslFiter 编码方法时挂在某个地方.. 服务器没有收到任何消息。我听说 android 上的 ssl 存在一些问题 - 你认为可能是这种情况吗?

一个重要的注意事项。我也尝试更改服务器上的提供程序,我已将 BouncyCastle 安全提供程序导入 java 扩展提供程序以匹配 android 上使用的提供程序,然后我已将其注册到 java.security,结果是相同的,甚至 pc 客户端它仍然使用 SUN 提供程序可以成功地与带有 BouncyCastle 提供程序的服务器通信 - 所以我确保自己不是这种情况。

以上,注无效。我确定我在服务器上将提供程序更改为 BC,但我发现这不是事实。实际上,apache mina 隐藏了有关 SSLContext 创建的一些细节,并且上下文是使用默认提供程序创建的,即 sun 提供程序(我现在有点困惑,当时 SUN 提供程序如何正确加载 BKS 格式的存储)。**事实上,我无法在我的电脑上创建使用 TSL 和 BouncyCastle 提供程序的 SSLContext

SSLContext cdt = SSLContext.getInstance("TLS", new BouncyCastleProvider());

或者

SSLContext cdt = SSLContext.getInstance("TLS", "BC");

我收到以下异常“ java.security.NoSuchAlgorithmException: no such algorithm: TLS for provider BC ” - 似乎是因为 BC 是 JCE 提供者,而 SSLContext 属于 JSSE。所以我没有证明我自己的假设,即我在 android “bc provider” - 服务器“sun provider” 通信中存在问题,因为在交换数据时加密期间存在一些特定于提供商的算法差异。**

如果有人在 mina、android 和 ssl 方面遇到过类似问题,我将不胜感激任何建议......

4

1 回答 1

0

尝试像这样静态设置提供程序:

import org.bouncycastle.jce.provider.BouncyCastleProvider;

static {
    Security.addProvider(new BouncyCastleProvider());
}
于 2015-07-03T19:59:14.730 回答