android - Android 8.0 中没有 netty initChannel 的堆栈跟踪

标签 android ssl netty

我已经使用带有私钥(和证书)的 keystore 对客户端 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

最佳答案

对于 Android 来说,问题是在 initChannel 内部(它抛出异常)没有完成打印输出。当 try-cathing 内容 - 或将该代码从 initChannel 移出/复制时,您可以看到堆栈跟踪。在 Android 中执行此操作导致在 Android 中不允许使用 JKS 类型的 keystore ,只能使用 BKS (BouncycaSTLe),这样我就可以解决问题。除了在 Android 中,该问题不会出现。

关于android - Android 8.0 中没有 netty initChannel 的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51431692/

相关文章:

android - 使用 LruCache 在内存中存储位图

java - 多次调用时与 Cordova.exec 相关的查询

java - Netty 4.0.x 正确捕获 ConnectException

java - Netty Nio 中 promise 的异步更新

java - 模拟 TCP 发送中的背压

Android:如何在联系人个人资料屏幕中显示应用程序(在连接下)

android - 在 addTextChangedListener 上将 editText 文本设置为大写,使应用程序挂起

java - 尝试使用智能卡进行 TLS 握手客户端身份验证时的握手失败

ssl - 使用自签名证书是否可以防止中间人攻击?

ruby-on-rails - Nanobox 多个 https 证书