Index: org/jivesoftware/smack/XMPPConnection.java =================================================================== --- org/jivesoftware/smack/XMPPConnection.java (révision 11644) +++ org/jivesoftware/smack/XMPPConnection.java (copie de travail) @@ -758,14 +758,14 @@ * @throws Exception if an exception occurs. */ void proceedTLSReceived() throws Exception { - SSLContext context = SSLContext.getInstance("TLS"); + SSLContext context = this.config.getCustomSSLContext(); KeyStore ks = null; KeyManager[] kms = null; PasswordCallback pcb = null; if(config.getCallbackHandler() == null) { ks = null; - } else { + } else if (context == null) { //System.out.println("Keystore type: "+configuration.getKeystoreType()); if(config.getKeystoreType().equals("NONE")) { ks = null; @@ -821,10 +821,12 @@ } // Verify certificate presented by the server - context.init(kms, - new javax.net.ssl.TrustManager[]{new ServerTrustManager(getServiceName(), config)}, - //new javax.net.ssl.TrustManager[]{new OpenTrustManager()}, - new java.security.SecureRandom()); + if (context == null) { + context = SSLContext.getInstance("TLS"); + context.init(kms, + new javax.net.ssl.TrustManager[]{new ServerTrustManager(getServiceName(), config)}, + new java.security.SecureRandom()); + } Socket plain = socket; // Secure the plain connection socket = context.getSocketFactory().createSocket(plain, Index: org/jivesoftware/smack/ConnectionConfiguration.java =================================================================== --- org/jivesoftware/smack/ConnectionConfiguration.java (révision 11644) +++ org/jivesoftware/smack/ConnectionConfiguration.java (copie de travail) @@ -20,6 +20,7 @@ package org.jivesoftware.smack; +import javax.net.ssl.SSLContext; import org.jivesoftware.smack.proxy.ProxyInfo; import org.jivesoftware.smack.util.DNSUtil; @@ -59,6 +60,7 @@ private boolean selfSignedCertificateEnabled = false; private boolean expiredCertificatesCheckEnabled = false; private boolean notMatchingDomainCheckEnabled = false; + private SSLContext customSSLContext; private boolean compressionEnabled = false; @@ -487,6 +489,25 @@ } /** + * Gets the custom SSLContext for SSL sockets. This is null by default. + * + * @return the SSLContext previously set with setCustomSSLContext() or null. + */ + public SSLContext getCustomSSLContext() { + return this.customSSLContext; + } + + /** + * Sets a custom SSLContext for creating SSL sockets. A custom Context causes all other + * SSL/TLS realted settings to be ignored. + * + * @param context the custom SSLContext for new sockets; null to reset default behaviour. + */ + public void setCustomSSLContext(SSLContext context) { + this.customSSLContext = context; + } + + /** * Returns true if the connection is going to use stream compression. Stream compression * will be requested after TLS was established (if TLS was enabled) and only if the server * offered stream compression. With stream compression network traffic can be reduced