首页 > 解决方案 > Android 8.0 中没有用于 netty initChannel 的堆栈跟踪

问题描述

我已经使用带有私钥(和证书)的密钥库对客户端 ssl 调用的设置进行了编码,用于向服务器验证客户端和向客户端验证服务器的证书(实际上是证书)。问题是我在这行代码上得到一个系统错误:

            b.connect().sync().channel();

代码(initChannel的内容):

    SslContextBuilder sslBuilder = SslContextBuilder.forClient();
                    SslContext cont2 = null;
                    TrustManagerFactory trustManagerFactory = TrustManagerFactory
                            .getInstance(TrustManagerFactory.getDefaultAlgorithm());
                    // truststore
                    KeyStore clientKeyStore = KeyStore.getInstance("JKS");
                    clientKeyStore.load(null, SipListener.KEYSTORE_PASSWORD.toCharArray());
                    for (Cert clientCertCert : sipSettingsBean.getSipSettingsServerBeans().get(0).getCerts()) {
                        Certificate clientCert = CertificateFactory.getInstance("X.509")
                                .generateCertificate(new ByteArrayInputStream(
                                        clientCertCert.getCert().getBytes()));
                        clientKeyStore.setCertificateEntry(
                                clientCertCert.getAlias(), clientCert);
                    }

                    trustManagerFactory.init(clientKeyStore);
                    sslBuilder.trustManager(trustManagerFactory);
                    KeyManagerFactory keyManagerFactory = KeyManagerFactory
                            .getInstance(KeyManagerFactory.getDefaultAlgorithm());
                    KeyStore serverKeyStore = KeyStore.getInstance("JKS");
                    serverKeyStore.load(
                            new ByteArrayInputStream(
                                    sipSettingsBean.getSipSettingsServerBeans().get(0).getKeystore().getBytes()),
                            SipListener.KEYSTORE_PASSWORD.toCharArray());
                    if (!serverKeyStore.isKeyEntry(sipSettingsBean.getSipSettingsServerBeans().get(0).getKeystoreAlias()))
                        throw new IllegalArgumentException(
                                "Keystore file has no matching key for given alias.");
                    keyManagerFactory.init(serverKeyStore,
                            SipListener.KEYSTORE_PASSWORD.toCharArray());
                    sslBuilder.keyManager(keyManagerFactory);
                    cont2 = sslBuilder.build();
                    SSLEngine engine = cont2.newEngine(ch.alloc(), toHostname,
                            portDestination);
                    engine.setEnabledProtocols(new String[]{"TLSv1.2"});
                    ch.pipeline().addLast("ssl", new SslHandler(engine, false));
                    ch.pipeline().addLast("handler",
                            simpleChannelInboundHandlerRegisterTCP);

日志输出:

System.err:07-19 22:30:16.437 7609-7638/xx.xxxxxxx.sipclient W/System.err: java.nio.channels.ClosedChannelException07-19 22:30:16.437 7609-7638/xx.xxxxxxx.sipclient W/System.err:     at io.netty.channel.AbstractChannel$AbstractUnsafe.ensureOpen(...)(Unknown Source)

有没有人可以立即看到的应该有所不同的东西?

我正在使用 netty 4.1.20.Final 也尝试过 netty 4.1.22.Final。也试过netty 4.1.28.Final。安卓8.0

标签: androidsslnetty

解决方案


似乎对于 Android,问题在于 initChannel 内部(抛出异常)没有完成打印输出。当尝试捕获内容 - 或将该代码移动/复制出 initChannel 时,您可以看到堆栈跟踪。在 Android 中执行此操作导致看到 Android 中不允许使用 JKS 类型的密钥库,只有 BKS(Bouncycastle)允许我解决问题。该问题仅出现在 Android 中。


推荐阅读