Java 将ssl与ApacheMina结合使用&;安卓
我正在尝试将Mina与android一起使用。 到目前为止,一切正常。 现在,我尝试使用SSLFilter动态添加SSL支持。 我的问题在设备上,我得到的是“isSSLStarted”“true”,但当我发送消息时,我的连接被关闭。 有人能帮我分析和解决这个问题吗? 这是因为握手失败吗?如何检查握手是否成功 更多细节。 我正在使用JSON通信Java 将ssl与ApacheMina结合使用&;安卓,java,android,ssl,apache-mina,Java,Android,Ssl,Apache Mina,我正在尝试将Mina与android一起使用。 到目前为止,一切正常。 现在,我尝试使用SSLFilter动态添加SSL支持。 我的问题在设备上,我得到的是“isSSLStarted”“true”,但当我发送消息时,我的连接被关闭。 有人能帮我分析和解决这个问题吗? 这是因为握手失败吗?如何检查握手是否成功 更多细节。 我正在使用JSON通信 SSLContext c = SSLContext.getInstance( "TLS" ); c.init(null, null, null);
SSLContext c = SSLContext.getInstance( "TLS" );
c.init(null, null, null);
SslFilter sslFilter = new SslFilter(c);
sslFilter.setUseClientMode(true);
session.getFilterChain().addFirst("mySSL", sslFilter);
session.setAttribute(SslFilter.DISABLE_ENCRYPTION_ONCE, Boolean.TRUE);
--sending msg in JSON
assert session.getAttribute(SslFilter.DISABLE_ENCRYPTION_ONCE) == null;
Log.v(TAG,"isSslStarted:"+sslFilter.isSslStarted(session));
==>这是真的
提前谢谢
当我尝试使用普通java进行连接时,我遇到了以下问题
javax.net.ssl.SSLHandshakeException: SSL handshake failed.
at org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:487)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1200(DefaultIoFilterChain.java:47)
at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:765)
at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:109)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:417)
at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:410)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:710)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:664)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:653)
at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:67)
at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1124)
at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_version
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1619)
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1587)
at sun.security.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1756)
at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1060)
at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:884)
at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:758)
at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
at org.apache.mina.filter.ssl.SslHandler.unwrap(SslHandler.java:728)
at org.apache.mina.filter.ssl.SslHandler.unwrapHandshake(SslHandler.java:666)
at org.apache.mina.filter.ssl.SslHandler.handshake(SslHandler.java:552)
at org.apache.mina.filter.ssl.SslHandler.messageReceived(SslHandler.java:351)
at org.apache.mina.filter.ssl.SslFilter.messageReceived(SslFilter.java:468)
当调用“write”方法时,ISSSLSSTARTED标志将被删除。。。您可以通过以下链接:最后,我可以使用纯java成功地进行握手。我的实现如下所示
public void startTLS() {
try {
sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustCerts, null);
} catch(NoSuchAlgorithmException nsa) {
System.out.println("Exception : No Such Algorithm");
} catch(KeyManagementException kme) {
System.out.println("Exception : KeyManagementException:");
}//try-catch
IoFilterChain chain = session.getFilterChain();
SslFilter sslFilter = (SslFilter) chain.get("sslFilter");
if (sslFilter == null) {
sslFilter = new SslFilter(sslContext);
sslFilter.setUseClientMode(true);
if ((cipherSuites != null) && !cipherSuites.isEmpty()) {
sslFilter.setEnabledCipherSuites(cipherSuites.toArray( new String[cipherSuites.size()] ));
}
chain.addFirst("sslFilter", sslFilter);
}else {
try {
sslFilter.startSsl(this.session);
} catch(SSLException se) {
System.out.println("SslException:"+se);
}
}//if-else
}//startTLS
但它在Android上失败了。看起来这是一个众所周知的老问题
如果我有任何错误,请告诉我
谢谢。感谢您的关注。但我的问题仍然没有解决。我有新的问题,我已经在重新编辑的问题