【问题标题】:Using ssl with Apache Mina & android将 ssl 与 Apache Mina 和 android 一起使用
【发布时间】:2014-02-03 10:43:49
【问题描述】:

我正在尝试将 Mina 与 android 一起使用。 到目前为止,一切正常。 现在我正在尝试使用 SSLFilter 动态添加 SSL 支持。 我的问题出在设备上,我收到“isSSLStarted”“true”,但是当我发送消息时,我的连接被关闭。 有人可以帮我分析和解决这个问题吗? 这是由于握手失败吗?如何检查握手是否成功。

更多细节。 我正在使用 JSON 通信。

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)

【问题讨论】:

    标签: java android ssl apache-mina


    【解决方案1】:

    当调用“write”方法时,isSSLStarted 标志将被删除...您可以通过此链接:

    http://mina.apache.org/mina-project/apidocs/org/apache/mina/filter/ssl/SslFilter.html?_sm_au_=iNMNsvHrtNLTFqfF#DISABLE_ENCRYPTION_ONCE

    【讨论】:

    • 感谢您的关注。但是我的问题仍然没有解决。我有新的问题,我已经在重新编辑的问题中提出了
    【解决方案2】:

    最后我能够使用纯 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 上失败了。看起来这是一个古老的已知问题。

    http://code.google.com/p/android/issues/detail?id=4914

    https://issues.apache.org/jira/browse/DIRMINA-972

    如果我犯了任何错误,请告诉我。

    谢谢。

    【讨论】:

      猜你喜欢
      • 2020-11-22
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 2017-03-03
      相关资源
      最近更新 更多