From d804d4ed6d9ef7d2a66e318bf9200c6c93f25b43 Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Thu, 23 Nov 2017 08:21:55 +0100 Subject: [PATCH] Do not abort if we could not get a KeyManagerFactory using the default algorithm. Instead continue with 'null' as value of the KeyManager[] array (kms). This makes the SSLContext.init() methods to search the default security providers for implementations, which is also OK. This change is needed because it appears that on Android KeyManagerFactory.getDefaultAlgorithm returns 'SunX509', which subsequently results in W/AbstractXMPPConnection: Connection XMPPTCPConnection[not-authenticated] (0) closed with error java.security.NoSuchAlgorithmException: KeyManagerFactory SunX509 implementation not found at org.apache.harmony.security.fortress.Engine.notFound(Engine.java:190) at org.apache.harmony.security.fortress.Engine.getInstance(Engine.java:139) at javax.net.ssl.KeyManagerFactory.getInstance(KeyManagerFactory.java:77) at org.jivesoftware.smack.tcp.XMPPTCPConnection.proceedTLSReceived(XMPPTCPConnection.java:747) at org.jivesoftware.smack.tcp.XMPPTCPConnection.access$1200(XMPPTCPConnection.java:149) at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:1053) at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$300(XMPPTCPConnection.java:980) at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:996) at java.lang.Thread.run(Thread.java:818) Note that this is possibly because the Secuurity Provider was not (yet) intialized. --- .../smack/tcp/XMPPTCPConnection.java | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/smack-tcp/src/main/java/org/jivesoftware/smack/tcp/XMPPTCPConnection.java b/smack-tcp/src/main/java/org/jivesoftware/smack/tcp/XMPPTCPConnection.java index 61fe6cf58..131a0b4f9 100644 --- a/smack-tcp/src/main/java/org/jivesoftware/smack/tcp/XMPPTCPConnection.java +++ b/smack-tcp/src/main/java/org/jivesoftware/smack/tcp/XMPPTCPConnection.java @@ -749,19 +749,28 @@ public class XMPPTCPConnection extends AbstractXMPPConnection { if (ks != null) { String keyManagerFactoryAlgorithm = KeyManagerFactory.getDefaultAlgorithm(); - KeyManagerFactory kmf = KeyManagerFactory.getInstance(keyManagerFactoryAlgorithm); + KeyManagerFactory kmf = null; try { - if (pcb == null) { - kmf.init(ks, null); - } - else { - kmf.init(ks, pcb.getPassword()); - pcb.clearPassword(); - } - kms = kmf.getKeyManagers(); + kmf = KeyManagerFactory.getInstance(keyManagerFactoryAlgorithm); } - catch (NullPointerException npe) { - LOGGER.log(Level.WARNING, "NullPointerException", npe); + catch (NoSuchAlgorithmException e) { + LOGGER.log(Level.FINE, "Could get the default KeyManagerFactory for the '" + + keyManagerFactoryAlgorithm + "' algorithm", e); + } + if (kmf != null) { + try { + if (pcb == null) { + kmf.init(ks, null); + } + else { + kmf.init(ks, pcb.getPassword()); + pcb.clearPassword(); + } + kms = kmf.getKeyManagers(); + } + catch (NullPointerException npe) { + LOGGER.log(Level.WARNING, "NullPointerException", npe); + } } }