android - 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
解决方案
似乎对于 Android,问题在于 initChannel 内部(抛出异常)没有完成打印输出。当尝试捕获内容 - 或将该代码移动/复制出 initChannel 时,您可以看到堆栈跟踪。在 Android 中执行此操作导致看到 Android 中不允许使用 JKS 类型的密钥库,只有 BKS(Bouncycastle)允许我解决问题。该问题仅出现在 Android 中。
推荐阅读
- reactjs - 如何使用 react 和 typescript 根据所选选项列出数据?
- google-drive-api - 如何在 Mac 上配置谷歌备份和同步以将照片上传到谷歌云?
- pyqt - 为什么中央小部件(QWidget)从另一个文件导入时没有正确调整大小?
- sql - 使用多个表的 MS Access SQL UPDATE
- java - Java.util.NoSuchElementException 类分配错误
- c - 在 Windows 上以编程方式对文件进行碎片整理
- tablesorter - 如何在 textSorter 中对隐藏或数据属性值进行排序
- splunk - 如何在 Splunk 的案例中访问数组值?
- c++ - 编译时的不变检查
- javascript - 使用 Apps 脚本在 Google Docs 中的选定表上追加新行