我已经使用带有私钥(和证书)的 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/