栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

javax.net.ssl.SSLHandshakeException:禁用SSLv2和SSlv3(仅限TLS)(及更高版本)时,在Android5.0.0上握手失败

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

javax.net.ssl.SSLHandshakeException:禁用SSLv2和SSlv3(仅限TLS)(及更高版本)时,在Android5.0.0上握手失败

问题解决了:

大家好,经过三天三夜的战斗,这是最终的解决方案。因此,由于这里的解决方案:

如何在android中为HttpsUrlConnection禁用SSLv3?

和这个库:https :
//guardianproject.info/pre/netcipher

在禁用SSLv2和SSlv3的情况下,它允许向Android提供更好的使用密码和TLS的方法。

首先创建此类NoSSLv3SocketFactory.java,然后通过创建类似这样的构造函数,将其与CypherUrl连接耦合

public NoSSLv3SocketFactory(URL sourceUrl) throws IOException {        this.delegate = NetCipher.getHttpsURLConnection(sourceUrl).getDefaultSSLSocketFactory();    }

NoSSLv3SocketFactory.java(完整代码)

import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;import java.net.SocketAddress;import java.net.SocketException;import java.net.URL;import java.nio.channels.SocketChannel;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import javax.net.ssl.HandshakeCompletedListener;import javax.net.ssl.HttpsURLConnection;import javax.net.ssl.SSLSession;import javax.net.ssl.SSLSocket;import javax.net.ssl.SSLSocketFactory;import info.guardianproject.netcipher.NetCipher;public class NoSSLv3SocketFactory extends SSLSocketFactory{    private final SSLSocketFactory delegate;    public NoSSLv3SocketFactory(URL sourceUrl) throws IOException {        this.delegate = NetCipher.getHttpsURLConnection(sourceUrl).getDefaultSSLSocketFactory();    }    public NoSSLv3SocketFactory() {        this.delegate = HttpsURLConnection.getDefaultSSLSocketFactory();    }    public NoSSLv3SocketFactory(SSLSocketFactory delegate) {        this.delegate = delegate;    }    @Override    public String[] getDefaultCipherSuites() {        return delegate.getDefaultCipherSuites();    }    @Override    public String[] getSupportedCipherSuites() {        return delegate.getSupportedCipherSuites();    }    private Socket makeSocketSafe(Socket socket) {        if (socket instanceof SSLSocket) { socket = new NoSSLv3SSLSocket((SSLSocket) socket);        }        return socket;    }    @Override    public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {        return makeSocketSafe(delegate.createSocket(s, host, port, autoClose));    }    @Override    public Socket createSocket(String host, int port) throws IOException {        return makeSocketSafe(delegate.createSocket(host, port));    }    @Override    public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException {        return makeSocketSafe(delegate.createSocket(host, port, localHost, localPort));    }    @Override    public Socket createSocket(InetAddress host, int port) throws IOException {        return makeSocketSafe(delegate.createSocket(host, port));    }    @Override    public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {        return makeSocketSafe(delegate.createSocket(address, port, localAddress, localPort));    }    private class NoSSLv3SSLSocket extends DelegateSSLSocket {        private NoSSLv3SSLSocket(SSLSocket delegate) { super(delegate);        }        @Override        public void setEnabledProtocols(String[] protocols) { if (protocols != null && protocols.length == 1 && "SSLv3".equals(protocols[0])) {     List<String> enabledProtocols = new ArrayList<String>(Arrays.asList(delegate.getEnabledProtocols()));     if (enabledProtocols.size() > 1) {         enabledProtocols.remove("SSLv3");         System.out.println("Removed SSLv3 from enabled protocols");     } else {         System.out.println("SSL stuck with protocol available for " + String.valueOf(enabledProtocols));     }     protocols = enabledProtocols.toArray(new String[enabledProtocols.size()]); } super.setEnabledProtocols(protocols);        }    }    public class DelegateSSLSocket extends SSLSocket {        protected final SSLSocket delegate;        DelegateSSLSocket(SSLSocket delegate) { this.delegate = delegate;        }        @Override        public String[] getSupportedCipherSuites() { return delegate.getSupportedCipherSuites();        }        @Override        public String[] getEnabledCipherSuites() { return delegate.getEnabledCipherSuites();        }        @Override        public void setEnabledCipherSuites(String[] suites) { delegate.setEnabledCipherSuites(suites);        }        @Override        public String[] getSupportedProtocols() { return delegate.getSupportedProtocols();        }        @Override        public String[] getEnabledProtocols() { return delegate.getEnabledProtocols();        }        @Override        public void setEnabledProtocols(String[] protocols) { delegate.setEnabledProtocols(protocols);        }        @Override        public SSLSession getSession() { return delegate.getSession();        }        @Override        public void addHandshakeCompletedListener(HandshakeCompletedListener listener) { delegate.addHandshakeCompletedListener(listener);        }        @Override        public void removeHandshakeCompletedListener(HandshakeCompletedListener listener) { delegate.removeHandshakeCompletedListener(listener);        }        @Override        public void startHandshake() throws IOException { delegate.startHandshake();        }        @Override        public void setUseClientMode(boolean mode) { delegate.setUseClientMode(mode);        }        @Override        public boolean getUseClientMode() { return delegate.getUseClientMode();        }        @Override        public void setNeedClientAuth(boolean need) { delegate.setNeedClientAuth(need);        }        @Override        public void setWantClientAuth(boolean want) { delegate.setWantClientAuth(want);        }        @Override        public boolean getNeedClientAuth() { return delegate.getNeedClientAuth();        }        @Override        public boolean getWantClientAuth() { return delegate.getWantClientAuth();        }        @Override        public void setEnableSessionCreation(boolean flag) { delegate.setEnableSessionCreation(flag);        }        @Override        public boolean getEnableSessionCreation() { return delegate.getEnableSessionCreation();        }        @Override        public void bind(SocketAddress localAddr) throws IOException { delegate.bind(localAddr);        }        @Override        public synchronized void close() throws IOException { delegate.close();        }        @Override        public void connect(SocketAddress remoteAddr) throws IOException { delegate.connect(remoteAddr);        }        @Override        public void connect(SocketAddress remoteAddr, int timeout) throws IOException { delegate.connect(remoteAddr, timeout);        }        @Override        public SocketChannel getChannel() { return delegate.getChannel();        }        @Override        public InetAddress getInetAddress() { return delegate.getInetAddress();        }        @Override        public InputStream getInputStream() throws IOException { return delegate.getInputStream();        }        @Override        public boolean getKeepAlive() throws SocketException { return delegate.getKeepAlive();        }        @Override        public InetAddress getLocalAddress() { return delegate.getLocalAddress();        }        @Override        public int getLocalPort() { return delegate.getLocalPort();        }        @Override        public SocketAddress getLocalSocketAddress() { return delegate.getLocalSocketAddress();        }        @Override        public boolean getOOBInline() throws SocketException { return delegate.getOOBInline();        }        @Override        public OutputStream getOutputStream() throws IOException { return delegate.getOutputStream();        }        @Override        public int getPort() { return delegate.getPort();        }        @Override        public synchronized int getReceiveBufferSize() throws SocketException { return delegate.getReceiveBufferSize();        }        @Override        public SocketAddress getRemoteSocketAddress() { return delegate.getRemoteSocketAddress();        }        @Override        public boolean getReuseAddress() throws SocketException { return delegate.getReuseAddress();        }        @Override        public synchronized int getSendBufferSize() throws SocketException { return delegate.getSendBufferSize();        }        @Override        public int getSoLinger() throws SocketException { return delegate.getSoLinger();        }        @Override        public synchronized int getSoTimeout() throws SocketException { return delegate.getSoTimeout();        }        @Override        public boolean getTcpNoDelay() throws SocketException { return delegate.getTcpNoDelay();        }        @Override        public int getTrafficClass() throws SocketException { return delegate.getTrafficClass();        }        @Override        public boolean isBound() { return delegate.isBound();        }        @Override        public boolean isClosed() { return delegate.isClosed();        }        @Override        public boolean isConnected() { return delegate.isConnected();        }        @Override        public boolean isInputShutdown() { return delegate.isInputShutdown();        }        @Override        public boolean isOutputShutdown() { return delegate.isOutputShutdown();        }        @Override        public void sendUrgentData(int value) throws IOException { delegate.sendUrgentData(value);        }        @Override        public void setKeepAlive(boolean keepAlive) throws SocketException { delegate.setKeepAlive(keepAlive);        }        @Override        public void setOOBInline(boolean oobinline) throws SocketException { delegate.setOOBInline(oobinline);        }        @Override        public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) { delegate.setPerformancePreferences(connectionTime, latency, bandwidth);        }        @Override        public synchronized void setReceiveBufferSize(int size) throws SocketException { delegate.setReceiveBufferSize(size);        }        @Override        public void setReuseAddress(boolean reuse) throws SocketException { delegate.setReuseAddress(reuse);        }        @Override        public synchronized void setSendBufferSize(int size) throws SocketException { delegate.setSendBufferSize(size);        }        @Override        public void setSoLinger(boolean on, int timeout) throws SocketException { delegate.setSoLinger(on, timeout);        }        @Override        public synchronized void setSoTimeout(int timeout) throws SocketException { delegate.setSoTimeout(timeout);        }        @Override        public void setTcpNoDelay(boolean on) throws SocketException { delegate.setTcpNoDelay(on);        }        @Override        public void setTrafficClass(int value) throws SocketException { delegate.setTrafficClass(value);        }        @Override        public void shutdownInput() throws IOException { delegate.shutdownInput();        }        @Override        public void shutdownOutput() throws IOException { delegate.shutdownOutput();        }        @Override        public String toString() { return delegate.toString();        }        @Override        public boolean equals(Object o) { return delegate.equals(o);        }    }}

现在(在我的情况下为翻新)只是像这样使用它:

因此,首先, 使用我们之前创建的NoSSlv3Factory.java类添加一个静态方法(或在使用时创建该方法)以创建okHttpClient。

public static OkClient createClient(int readTimeout, TimeUnit readTimeoutUnit, int connectTimeout, TimeUnit connectTimeoutUnit){    final OkHttpClient okHttpClient = new OkHttpClient();    okHttpClient.setReadTimeout(readTimeout, readTimeoutUnit);    okHttpClient.setConnectTimeout(connectTimeout, connectTimeoutUnit);    try {        URL url = new URL(ApiIntentService.getHostAddress());        SSLSocketFactory NoSSLv3Factory = new NoSSLv3SocketFactory(url);        okHttpClient.setSslSocketFactory(NoSSLv3Factory);    } catch (MalformedURLException e) {        e.printStackTrace();    } catch (IOException e) {        e.printStackTrace();    }    return new OkClient(okHttpClient);}

然后 ,在我的情况下,当您创建RestAdapter时,只需像这样进行设置,不要忘记为您设置客户端。

public class LoginRestClient{    private static final String base_URL = "";    private LoginApiService apiService;    public LoginRestClient()    {        Gson gson = new GsonBuilder()     .setDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'")     .create();        RestAdapter restAdapter = new RestAdapter.Builder()     .setLogLevel(RestAdapter.LogLevel.FULL)     .setEndpoint(ApiIntentService.getHostAddress())     .setConverter(new GsonConverter(gson))     .setClient(ApiIntentService.createClient(60, TimeUnit.SECONDS, 20, TimeUnit.SECONDS))     .build();        apiService = restAdapter.create(LoginApiService.class);    }    public LoginApiService getApiService() {        return apiService;    }}

有了它,它应该可以工作了。我希望这对其他人有用。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/508326.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号