我正在使用apache mina在服务器和android客户端之间进行通信。通过不安全的连接进行连接时,一切都很好,但是几天前,我决定使用ssl保护连接。 Apache mina设计了一个名为SslFilter的过滤器来完成任务-它使用ssl上下文,在该上下文中我们提供密钥库和信任库来建立安全连接。如果我在为PC编写的客户端上使用带有mina的sslfilter,那么一切都像一个魅力,但是当我尝试在android上使用它时,这并不是那么简单。首先,我们必须导入从服务器SUN格式的密钥库中提取的证书,并将其转换为与有弹性的城堡提供程序匹配-因为这似乎是android上唯一的安全提供程序。好的,我可以使用keytool和适当的命令轻松实现这一点。然后,像在PC上一样,我将信任库加载到android中的上下文中,并连接到服务器后(请注意,Android客户端安全提供程序是BouncyCastle,而服务器安全提供程序是SUN),我在服务器上得到了这样的日志:
86992 [NioProcessor-3]调试AuthenticationManager-会话已关闭:2
260628 [NioProcessor-1]调试SslFilter-将SSL过滤器sslFilter添加到链中
260629 [NioProcessor-1]调试SslHandler-会话服务器[3](无sslEngine)初始化SSL Han
德勒
260642 [NioProcessor-1]调试SslHandler-会话服务器[3](无sslEngine)SSL处理程序初始化
完成。
260644 [NioProcessor-1]调试SslFilter-会话Server3:开始第一次握手
260646 [NioProcessor-1]调试SslHandler-会话Server3处理NEED_UNWRAP站
te
260703 [NioProcessor-1]调试SslFilter-会话Server3:收到消息:HeapBuffer [
pos = 0 lim = 78 cap = 2048:16 03 01 00 49 01 00 00 45 03 01 C4 C4 C4 C4 80 ...]
260704 [NioProcessor-1]调试SslHandler-会话Server3处理收到的消息
Ë
260709 [NioProcessor-1]调试SslHandler-会话Server3处理NEED_UNWRAP站
te
260709 [NioProcessor-1]调试SslHandler-会话Server3处理NEED_TASK状态
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站
te
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]调试SslHandler-会话Server3处理NEED_UNWRAP站
te
260869 [NioProcessor-1]调试SslHandler-会话Server3处理NEED_TASK状态
260876 [NioProcessor-1]调试SslHandler-会话Server3处理NEED_UNWRAP站
te
260877 [NioProcessor-1]调试SslFilter-会话Server3:处理SSL数据
261133 [NioProcessor-1]调试SslFilter-会话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]调试SslHandler-会话Server3处理收到的消息
Ë
261135 [NioProcessor-1]调试SslHandler-会话Server3处理NEED_UNWRAP站
te
261154 [NioProcessor-1]调试SslHandler-会话Server3处理NEED_WRAP状态
261157 [NioProcessor-1]调试SslFilter-会话Server3:写入消息:WriteRequest
:HeapBuffer [pos = 0 lim = 6 cap = 8:14 03 01 00 01 01]
261158 [NioProcessor-1]调试SslHandler-会话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]调试SslHandler-会话Server3处理完成状态
261160 [NioProcessor-1]调试SslHandler-会话Server3现在受到保护
261160 [NioProcessor-1]调试SslHandler-会话Server3处理完成状态
261161 [NioProcessor-1]调试SslHandler-会话Server3现在受到保护
261161 [NioProcessor-1]调试SslFilter-会话Server3:处理SSL数据
如您所见-一切都很好。
261160 [NioProcessor-1]调试SslHandler-会话Server3现在受到保护
261160 [NioProcessor-1]调试SslHandler-会话Server3处理完成状态
261161 [NioProcessor-1]调试SslHandler-会话Server3现在受到保护
上面的清单显示了现在已安全连接。成功!哈雷!但完全没有,因为成功完成SSL“舞蹈”后,Android客户端会尝试以与PC客户端相同的方式发送消息...然后什么也没有发生。在调用SslFiter编码方法时,什么都没有..应用程序挂某处..服务器未收到任何消息。我听说Android上的ssl存在一些问题-您认为可能是这种情况吗?
重要说明。我也尝试过更改服务器上的提供程序,将BouncyCastle安全提供程序导入到Java扩展提供程序中,以匹配android上使用的提供程序,然后将其注册到java.security中,结果是相同的,即使是PC客户端仍使用SUN提供程序的服务器可以与具有BouncyCastle提供程序的服务器成功通信-因此,我确保自己不是这种情况。
以上,说明无效。我确定我已将提供程序更改为服务器上的BC,但我发现这不是事实。实际上,apache mina隐藏了有关SSLContext创建的一些细节,并且上下文是使用默认提供程序(即sun provider)创建的(我有点困惑,那么SUN提供商如何正确加载BKS格式的存储)。 **实际上我无法创建在我的PC上使用TSL和BouncyCastle提供程序的SSLContext
SSLContext cdt = SSLContext.getInstance("TLS", new BouncyCastleProvider());
要么
SSLContext cdt = SSLContext.getInstance("TLS", "BC");
我收到以下异常“ java.security.NoSuchAlgorithmException:没有这样的算法:提供者BC的TLS”-似乎因为BC是JCE提供者,而SSLContext属于JSSE。因此,我没有证明自己的假设,即我在android“ bc provider”(bc provider)-服务器“ sun provider”通信中存在问题,因为在交换数据时加密期间某些提供商特定的算法差异。**
如果有人在mina,android和ssl上遇到过类似的问题,我将不胜感激。
最佳答案
尝试像下面这样静态设置提供程序:
import org.bouncycastle.jce.provider.BouncyCastleProvider;
static {
Security.addProvider(new BouncyCastleProvider());
}