Javax.net.ssl.SSL.andLLandSandException: javax.net.ssl.SSL প্রোটোকল এক্সেপশন: এসএসএল হ্যান্ডশেক বাতিল হয়েছে: এসএসএল লাইব্রেরিতে ব্যর্থতা, সাধারণত একটি প্রোটোকল ত্রুটি


102

আমি নিম্নলিখিত কোডটি Android এ চালানোর চেষ্টা করছি

URLConnection l_connection = null;
        // Create connection
        uzip=new UnZipData(mContext);
        l_url = new URL(serverurl);

        if ("https".equals(l_url.getProtocol())) {
            System.out.println("<<<<<<<<<<<<< Before TLS >>>>>>>>>>>>");
            sslcontext = SSLContext.getInstance("TLS");
            System.out.println("<<<<<<<<<<<<< After TLS >>>>>>>>>>>>");
            sslcontext.init(null,
                    new TrustManager[] { new CustomTrustManager()},
                    new java.security.SecureRandom());
            HttpsURLConnection
                    .setDefaultHostnameVerifier(new CustomHostnameVerifier());
            HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext
                    .getSocketFactory());

            l_connection = (HttpsURLConnection) l_url.openConnection();
            ((HttpsURLConnection) l_connection).setRequestMethod("POST");
        } else {
            l_connection = (HttpURLConnection) l_url.openConnection();
            ((HttpURLConnection) l_connection).setRequestMethod("POST");
        }
        /*System.setProperty("http.agent", "Android_Phone");*/


        l_connection.setConnectTimeout(10000);
        l_connection.setRequestProperty("Content-Language", "en-US");
        l_connection.setUseCaches(false);
        l_connection.setDoInput(true);
        l_connection.setDoOutput(true);
        System.out.println("<<<<<<<<<<<<< Before Connection >>>>>>>>>>>>");
        l_connection.connect();

চালু l_connection.connect(), এটি এই এসএসএলশ্যান্ডশেকশন দিচ্ছে। কখনও কখনও এটি কাজ করে, তবে বেশিরভাগ সময় এটি ব্যতিক্রম দেয়। এটি কেবল অ্যান্ড্রয়েড 4.0.০ এমুলেটরটিতেই ঘটছে। আমি এটিকে অ্যান্ড্রয়েড ৪.৪ এবং ৫.০ এ পরীক্ষা করেছি, এটি দুর্দান্ত কাজ করে। এর কারণ কি হতে পারে ? সাহায্য করুন

ক্ষেত্রে স্টেকট্র্যাস

    04-28 15:51:13.143: W/System.err(2915): javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x870c918: Failure in SSL library, usually a protocol error
04-28 15:51:13.143: W/System.err(2915): error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:658 0xb7c393a1:0x00000000)
04-28 15:51:13.143: W/System.err(2915):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:460)
04-28 15:51:13.143: W/System.err(2915):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:257)
04-28 15:51:13.143: W/System.err(2915):     at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:210)
04-28 15:51:13.143: W/System.err(2915):     at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:477)
04-28 15:51:13.153: W/System.err(2915):     at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:441)
04-28 15:51:13.153: W/System.err(2915):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
04-28 15:51:13.153: W/System.err(2915):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
04-28 15:51:13.153: W/System.err(2915):     at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
04-28 15:51:13.153: W/System.err(2915):     at libcore.net.http.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:164)
04-28 15:51:13.153: W/System.err(2915):     at com.ofss.fcdb.mobile.android.rms.helpers.NetworkConnector.getConnection(NetworkConnector.java:170)
04-28 15:51:13.153: W/System.err(2915):     at com.ofss.fcdb.mobile.android.rms.util.InitiateRMS$2.run(InitiateRMS.java:221)
04-28 15:51:13.153: W/System.err(2915):     at java.lang.Thread.run(Thread.java:856)
04-28 15:51:13.153: W/System.err(2915): Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x870c918: Failure in SSL library, usually a protocol error
04-28 15:51:13.153: W/System.err(2915): error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:658 0xb7c393a1:0x00000000)
04-28 15:51:13.153: W/System.err(2915):     at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
04-28 15:51:13.153: W/System.err(2915):     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:410)
04-28 15:51:13.153: W/System.err(2915):     ... 11 more
04-28 16:42:44.139: W/ResourceType(3140): No package identifier when getting value for resource number 0x00000000

আপনি কি সত্যই ডিভাইসে আপনার অ্যাপ্লিকেশনটি পরীক্ষা করেছেন?
পরেশ মায়ানী

এটা কি ব্যতিক্রম দিচ্ছে? স্ট্যাক ট্রেস?
লার্ন

@ পরেশমায়ানী হ্যাঁ, এমনকি অ্যান্ড্রয়েড having.০ থাকা রিয়েল ডিভাইসেও এটি ব্যতিক্রম দেখাচ্ছে।
ভবিত এস সেঙ্গার

@ এজেপি আমি প্রশ্নটি আপডেট করেছি, স্ট্যাকট্রেস যুক্ত করা হয়েছে।
ভবিত এস সেঙ্গার

এটিই জেলিবিন ট্যাগ করা একমাত্র প্রশ্ন। আপনার অর্থ কি অ্যান্ড্রয়েড-4.2-জেলি-বিন ?
ড্যানিয়েল দারানাস

উত্তর:


120

আমি ওয়্যারশার্ক ব্যবহার করে ডেটা প্যাকেটগুলি বিশ্লেষণ করে এর সমাধান পেয়েছি। আমি যা পেয়েছি তা হ'ল সুরক্ষিত সংযোগ তৈরি করার সময় অ্যান্ড্রয়েড টিএলএসভি 1 থেকে এসএসএলভি 3-এ ফিরে যাচ্ছিল । এটি অ্যান্ড্রয়েড সংস্করণ <4.4 এ একটি বাগ এবং এটি এনএলভেদড প্রোটোকল তালিকা থেকে SSLv3 প্রোটোকলটি সরিয়ে সমাধান করা যেতে পারে। আমি নোএসএলভি 3 এসকেটফ্যাক্টরি.জভা নামে একটি কাস্টম সকেটফ্যাক্টরি ক্লাস করেছি। সকেটফ্যাক্টরি তৈরি করতে এটি ব্যবহার করুন।

/*Copyright 2015 Bhavit Singh Sengar
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.*/

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.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;


public class NoSSLv3SocketFactory extends SSLSocketFactory{
    private final SSLSocketFactory delegate;

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);
    }
}
}

সংযোগের সময় এই শ্রেণিটি এভাবে ব্যবহার করুন:

SSLContext sslcontext = SSLContext.getInstance("TLSv1");
sslcontext.init(null, null, null);
SSLSocketFactory NoSSLv3Factory = new NoSSLv3SocketFactory(sslcontext.getSocketFactory());

HttpsURLConnection.setDefaultSSLSocketFactory(NoSSLv3Factory);
l_connection = (HttpsURLConnection) l_url.openConnection();
l_connection.connect();

হালনাগাদ :

এখন, সঠিক সমাধান হ'ল গুগল প্লে পরিষেবাগুলি ব্যবহার করে একটি নতুন সুরক্ষা সরবরাহকারী ইনস্টল করা :

    ProviderInstaller.installIfNeeded(getApplicationContext());

এটি কার্যকরভাবে আপনার অ্যাপ্লিকেশনটিকে ওপেনএসএসএল এবং জাভা সুরক্ষা সরবরাহকারীর একটি নতুন সংস্করণে অ্যাক্সেস দেয়, যার মধ্যে এসএসএলইগাইনে TLSv1.2 এর সমর্থন অন্তর্ভুক্ত রয়েছে। নতুন সরবরাহকারী ইনস্টল হয়ে গেলে, আপনি একটি এসএসএলইগাইন তৈরি করতে পারেন যা SSLv3, TLSv1, TLSv1.1 এবং TLSv1.2 সমর্থন করে স্বাভাবিক পদ্ধতিতে:

    SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
    sslContext.init(null, null, null);
    SSLEngine engine = sslContext.createSSLEngine();

অথবা আপনি সক্ষম সক্ষম প্রোটোকল ব্যবহার করে সীমাবদ্ধ করতে পারেন engine.setEnabledProtocols

নিম্নলিখিত নির্ভরতা যুক্ত করতে ভুলবেন না ( এখানে সর্বশেষ সংস্করণটি দেখুন ):

implementation 'com.google.android.gms:play-services-auth:17.0.0'

আরও তথ্যের জন্য, এই লিঙ্কটি চেকআউট করুন


25
যদি আমি ললিপপ ডিভাইসে এই ত্রুটিটি পেয়ে যাচ্ছি তবে কী হবে?
ইগোরগানাপলস্কি

2
আমি এটি 5.0.1 এ পাচ্ছি
স্কাইনেট

ভার্চুয়াল হোস্টের সাথে সংযোগ করার সময় এই পদ্ধতির ব্যর্থতা রয়েছে বলে মনে হচ্ছে, কারণ এটি কার্যকরভাবে এসএসআইআইকে অক্ষম করে এসএসসিर्টিফিটসকেটফ্যাকারি.সেটহোস্টনাম (সকেট, স্ট্রিং) পদ্ধতি সরবরাহ না করে। আমি 403s পেয়ে আসছি যেখানে ওপেনসেল.এক্সই এবং ব্রাউজার ডাব্লু / ও ঝামেলা সংযুক্ত করে। দেখা যাচ্ছে এটি নিখোঁজ এসএনআই।
জারোস্লাভ জারুবা

2
ভলি দিয়ে কেউ কীভাবে এটি ব্যবহার করতে পারে?
uniruddh

1
আমি এই ত্রুটিটি এন্ড্রয়েড এপিআই 19 এ পেয়ে যাচ্ছি javax.net.ssl.SSLProtocolException: পড়ার ত্রুটি: ssl = 0xb83d7120: এসএসএল লাইব্রেরিতে ব্যর্থতা, সাধারণত একটি প্রোটোকল ত্রুটি
রুকমাল ডায়াস

117

দৃশ্যপট

আমি অ্যান্ড্রয়েড 5.0 এর আগের সংস্করণে চলমান ডিভাইসগুলিতে এসএসএলহ্যান্ডশেক ব্যতিক্রম পাচ্ছিলাম। আমার ব্যবহারের ক্ষেত্রে আমি আমার ক্লায়েন্টের শংসাপত্রকে বিশ্বাস করার জন্য একটি ট্রাস্ট ম্যানেজারও তৈরি করতে চেয়েছিলাম।

আমি নোএসএলভি 3 সকেটফ্যাক্টরি এবং নোএসএলভি 3 ফ্যাক্টরি প্রয়োগ করেছি আমার ক্লায়েন্টের সমর্থিত প্রোটোকলগুলির তালিকা থেকে অপসারণের জন্য ফ্যাক্টরি তবে আমি এই সমাধানগুলির কাজ করতে পারি না।

আমি কিছু জিনিস শিখেছি:

  • অ্যান্ড্রয়েড 5.0 টিএলএসভি 1.1 এবং টিএলএসভি 1.2 প্রোটোকলগুলি ডিফল্টরূপে সক্ষম নয়।
  • এসএসএলভি 3 প্রোটোকল অ্যান্ড্রয়েড 5.0 এর চেয়ে পুরানো ডিভাইসে ডিফল্টরূপে অক্ষম নয়।
  • এসএসএলভি 3 কোনও সুরক্ষিত প্রোটোকল নয় এবং তাই কোনও সংযোগ স্থাপনের আগে এটি আমাদের ক্লায়েন্টের সমর্থিত প্রোটোকলগুলির তালিকা থেকে সরিয়ে ফেলা বাঞ্ছনীয়।

আমার জন্য কি কাজ করেছে

Providerআপনার অ্যাপ্লিকেশন শুরু করার সময় অ্যান্ড্রয়েডের সুরক্ষা আপডেট করার অনুমতি দিন ।

5.0+ এর পূর্বে ডিফল্ট সরবরাহকারী SSLv3 অক্ষম করে না। আপনি যদি গুগল প্লে পরিষেবাগুলিতে অ্যাক্সেস পেয়ে থাকেন তবে আপনার অ্যাপ্লিকেশন থেকে অ্যান্ড্রয়েডের সুরক্ষা সরবরাহকারীকে প্যাচ করা তুলনামূলকভাবে সহজ।

private void updateAndroidSecurityProvider(Activity callingActivity) {
    try {
        ProviderInstaller.installIfNeeded(this);
    } catch (GooglePlayServicesRepairableException e) {
        // Thrown when Google Play Services is not installed, up-to-date, or enabled
        // Show dialog to allow users to install, update, or otherwise enable Google Play services.
        GooglePlayServicesUtil.getErrorDialog(e.getConnectionStatusCode(), callingActivity, 0);
    } catch (GooglePlayServicesNotAvailableException e) {
        Log.e("SecurityException", "Google Play Services not available.");
    }
}

আপনি যদি এখন নিজের OkHttpClient বা HttpURLConnication TLSv1.1 তৈরি করেন এবং TLSv1.2 প্রোটোকল হিসাবে উপলব্ধ থাকতে হবে এবং SSLv3 অপসারণ করা উচিত। যদি ক্লায়েন্ট / সংযোগ (বা আরও নির্দিষ্টভাবে এটি এসএসএল কনটেক্সট) কল করার আগে শুরু করা হয়েছিলProviderInstaller.installIfNeeded(...) তবে এটি পুনরায় তৈরি করা দরকার।

নিম্নলিখিত নির্ভরতা যুক্ত করতে ভুলবেন না ( এখানে সর্বশেষ সংস্করণ পাওয়া গেছে ):

compile 'com.google.android.gms:play-services-auth:16.0.1'

সূত্র:

সরাইয়া

আমার ক্লায়েন্টটি কোন সাইফার অ্যালগরিদমগুলি ব্যবহার করা উচিত তা স্পষ্টভাবে সেট করার দরকার নেই তবে লেখার সময় সর্বাধিক সুরক্ষিত হিসাবে বিবেচিত ব্যক্তিদের সুপারিশ করার জন্য আমি একটি এসও পোস্ট পেয়েছি: এসএসএল সকেটের জন্য কোন সাইফার স্যুটগুলি সক্ষম করতে হবে?


1
গুগল প্লে পরিষেবাদি পরিচালিত ডিভাইসের সংখ্যার কোনও প্রকাশিত পরিসংখ্যান আমার জানা নেই। আমি সর্বশেষ চিত্রটি খুঁজে পেলাম সুন্দর পিচাইয়ের আইও 2014 টক যেখানে তিনি বলেছিলেন যে 93% Android ডিভাইস প্লে পরিষেবাদির সর্বশেষতম সংস্করণ ছিল। একটি ম্যানুয়াল পদ্ধতি সম্পর্কিত, আমি যখন সমস্ত ম্যানুয়াল পদ্ধতি আমার পক্ষে কাজ করতে ব্যর্থ হয়েছিল তখন আমি এই সমাধানটিতে পৌঁছেছি। যদি নেটওয়ার্ক সুরক্ষা আপনার ব্যবহারকারীদের পক্ষে অতীব গুরুত্বপূর্ণ না হয় তবে ব্যবহারকারী প্লে পরিষেবাদি ইনস্টল করতে অস্বীকার করলে আপনি সর্বদা HTTP- র কাছে ফিরে যেতে পারেন। আমাদের নিজস্ব অ্যাপ্লিকেশনটির জন্য আমরা সামঞ্জস্যতা এবং সুরক্ষার মধ্যে বাণিজ্য বন্ধ বলে বিবেচনা করেছি। আমরা প্লে পরিষেবাদির একটি আপডেট প্রয়োগ করি।
মরিস গ্যাভিন

3
চীনে গুগল প্লে পরিষেবাদি সমর্থন খুব সীমিত। আপনার লক্ষ্য শ্রোতার উপর নির্ভর করে জানা ভাল হতে পারে। তবে ভাল, আপনি যদি গুগল প্লে দিয়ে বিতরণ করেন তবে এই শ্রোতা ইতিমধ্যে অনুপস্থিত।
jayeffkay

3
কাজের সমাধানের জন্য দয়া করে এই নির্ভরতা যুক্ত করুন। সংকলন 'com.google.android.gms: play-services-auth: 10.2.0',
প্রদীপ চক্রবর্তী গুদিপাতি

3
ProviderInstaller.installIfNeeded (এটি) যুক্ত করা; আবেদনের অনক্রিটে অংশ () আমার পক্ষে কাজ করেছে! ধন্যবাদ :-)
কেলেভান্দোস

1
এখানে অবশ্যই সবচেয়ে দরকারী উত্তর। এমন অমূল্য সহায়তার জন্য ধন্যবাদ।
বুরাক করাকুş

50

এছাড়াও আপনার জানা উচিত যে আপনি অ্যান্ড্রয়েড devices.০ ডিভাইসগুলির জন্য টিএলএস v1.2 জোর করতে পারেন যা এটি ডিফল্টরূপে সক্ষম করে না:

আপনার অ্যাপ্লিকেশন ফাইলটির এই কোডটি অনক্রিট () এ রাখুন :

try {
        ProviderInstaller.installIfNeeded(getApplicationContext());
        SSLContext sslContext;
        sslContext = SSLContext.getInstance("TLSv1.2");
        sslContext.init(null, null, null);
        sslContext.createSSLEngine();
    } catch (GooglePlayServicesRepairableException | GooglePlayServicesNotAvailableException
            | NoSuchAlgorithmException | KeyManagementException e) {
        e.printStackTrace();
    }

7
RxJava OkHttpClient.Builder দিয়ে আমার জন্য কাজ করেছেন, অনেক অনেক ধন্যবাদ।
গ্লোটাজ নিকুল

2
অ্যান্ড্রয়েড 7.0 এ কাজ করে।
কুলমাইন্ড

1
ধন্যবাদ @ ময়ূর গ্যাঙ্গুরডে, এটি আমার জন্য কাজ করার জন্য প্লে পরিষেবা লেখক গ্রেড, বাস্তবায়ন 'com.google.android.gms: play-Services-auth: 16.0.1'
বাসন্ত

নিখুঁতভাবে কাজ করেছেন। আমাকে পরীক্ষার ঘন্টা চেষ্টা করার জন্য অনেক ধন্যবাদ।
নিনাদ দেশাই

এটি খুব সুবিধাজনক। অনেক ধন্যবাদ!
ক্যাস্পার গিয়ারিংস

15

পূর্বে, আমি কাস্টম SSLFactoryবাস্তবায়নের মাধ্যমেও এই সমস্যাটি সমাধান করেছি , তবে OkHttp ডক্স অনুসারে সমাধানটি অনেক সহজ।

TLS৪.২+ ডিভাইসের জন্য প্রয়োজনীয় সিফারগুলির সাথে আমার চূড়ান্ত সমাধানটি দেখতে এরকম দেখাচ্ছে:

public UsersApi provideUsersApi() {

    private ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.COMPATIBLE_TLS)
        .supportsTlsExtensions(true)
        .tlsVersions(TlsVersion.TLS_1_2, TlsVersion.TLS_1_1, TlsVersion.TLS_1_0)
        .cipherSuites(
                CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
                CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
                CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
                CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
                CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
                CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
                CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
                CipherSuite.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
                CipherSuite.TLS_ECDHE_RSA_WITH_RC4_128_SHA,
                CipherSuite.TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
                CipherSuite.TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
                CipherSuite.TLS_DHE_RSA_WITH_AES_256_CBC_SHA)
        .build();

    OkHttpClient client = new OkHttpClient.Builder()
            .connectionSpecs(Collections.singletonList(spec))
            .build();

    return new Retrofit.Builder()
            .baseUrl(USERS_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build()
            .create(UsersApi.class);
}

নোট করুন যে সমর্থিত প্রোটোকলগুলির সেটটি আপনার সার্ভারে কনফিগার করা উপর নির্ভর করে।


আপনার সমাধানটি 14 এআইপি সমর্থন করে?
কুলমাইন্ড

নিশ্চিত করে বলতে পারি না, এটি কেবল 16+ এপিআই ডিভাইসে পরীক্ষা করা হয়েছে, দুর্দান্ত কাজ করে।
খণ্ডিত

1
টুকরা, একটি চতুর ডাক নাম :) আমি একমত, এমনকি এপিআই 14 এমুলেটর শুরু করতে পারেনি, কিন্তু অ্যান্ড্রয়েড 7.0 (যে সমস্যা ছিল) উপর এবং API 19 আপনার সমাধান কাজ
CoolMind

1
ধন্যবাদ, আমি পরীক্ষা করেছি, এটি কাজ করেছে। আজ আবার একটি এপিআই 19 এমুলেটর চালু করেছে এবং একটি স্ট্যাকওভারফ্লো . com/ a/ 51285550/2914140 সমাধান যুক্ত করতে হয়েছিল ।
কুলমাইন্ড

12

আমি এই লিঙ্কে সমাধান খুঁজে পেয়েছি

আপনার অ্যান্ড্রয়েড অ্যাপ্লিকেশন ক্লাসে আপনাকে কেবল কোডের নীচে রাখতে হবে। এবং এটি যথেষ্ট। আপনার পুনঃনির্মাণ সেটিংসে কোনও পরিবর্তন করার দরকার নেই। এটা আমার দিন বাঁচায়।

public class MyApplication extends Application {
@Override
public void onCreate() {
    super.onCreate();
    try {
      // Google Play will install latest OpenSSL 
      ProviderInstaller.installIfNeeded(getApplicationContext());
      SSLContext sslContext;
      sslContext = SSLContext.getInstance("TLSv1.2");
      sslContext.init(null, null, null);
      sslContext.createSSLEngine();
    } catch (GooglePlayServicesRepairableException | GooglePlayServicesNotAvailableException
        | NoSuchAlgorithmException | KeyManagementException e) {
        e.printStackTrace();
        }
    }
}

আশা করি এটি সহায়ক হবে। ধন্যবাদ.


4

এটি আমার জন্য এটি সমাধান করেছে:

এসএসএলসকেটের জন্য অ্যান্ড্রয়েড ডকুমেন্টেশন বলছে যে টিএলএস 1.1 এবং টিএলএস 1.2 এন্ড্রয়েড এপিআই স্তরের 16+ (অ্যান্ড্রয়েড 4.1, জেলি বিন) এর মধ্যে সমর্থিত is তবে এটি ডিফল্টরূপে অক্ষম কিন্তু এপিআই স্তর 20+ (ঘড়ির জন্য অ্যান্ড্রয়েড ৪.৪, কিটকাট ওয়াচ এবং ফোনের জন্য অ্যান্ড্রয়েড .0.০, ললিপপ) দিয়ে সক্ষম হয়ে রয়েছে are তবে উদাহরণস্বরূপ ৪.১ চলমান ফোনগুলির জন্য এটি কীভাবে সক্ষম করা যায় সে সম্পর্কে কোনও ডকুমেন্টেশন খুঁজে পাওয়া খুব কঠিন। টিএলএস 1.1 এবং 1.2 সক্ষম করার জন্য আপনাকে একটি কাস্টম এসএসএসকেটফ্যাক্টরি তৈরি করতে হবে যা একটি ডিফল্ট এসএসএসকেটফ্যাক্টরি বাস্তবায়নে সমস্ত কলকে প্রক্সি করতে চলেছে। এটি ছাড়াও আমাদের টিএলএস 1.1 সক্ষম করার জন্য ফিরে আসা এসএসএসকেটে সমস্ত ক্রিয়েটসকেট পদ্ধতি এবং কলসেটএনবেলডপ্রোটোকলগুলি ওভাররাইড করতে হবে। উদাহরণ প্রয়োগের জন্য কেবল নীচের লিঙ্কটি অনুসরণ করুন।

Android 4.1। tls1.1 এবং tls 1.2 সক্ষম করুন


2

আমিও এই ত্রুটি রিপোর্টের সমস্যাটি পেয়েছি। আমার কোডটি নীচে রয়েছে।

public static void getShop() throws Exception {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                OkHttpClient client = new OkHttpClient();
                Request request = new Request.Builder()
                        .url("https://10.0.2.2:8010/getShopInfo/aaa")
                        .build();
                Response response = client.newCall(request).execute();
                Log.d("response", response.body().string());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();
}

আমার স্প্রিংবুটটি আমার ব্যাকএন্ড হিসাবে রয়েছে এবং তথ্য পেতে অ্যান্ড্রয়েড ওকে এইচটিটিপি ব্যবহার করি। আমি যে সমালোচনা করেছিলাম তা হ'ল আমি অ্যান্ড্রয়েডের কোডটিতে একটি .url ( "https : //10.0.2.2: 8010 / getShopInfo / aaa") ব্যবহার করি । তবে আমার ব্যাকএন্ডে https অনুরোধ অনুমোদিত নয়। আমি .url ব্যবহার করার পরে (" http : / 10.0.2.2: 8010 / getShopInfo / aaa") , তারপরে আমার কোডটি ভালভাবে চলেছে। সুতরাং, আমি বলতে চাই যে আমার ভুলটি এমুলেটারের সংস্করণ নয়, এটি অনুরোধ প্রোটোকল সম্পর্কে। আমি যা বলেছিলাম তা করার পরে আমি আরেকটি সমস্যার মুখোমুখি হয়েছি, তবে এটি অন্য একটি সমস্যা এবং আমি নতুন সমস্যার সমাধানের পদ্ধতিটি সংযুক্ত করি
শুভকামনা!


1

আমি যখন জিনমোশনটিতে প্রক্সি ব্যবহার করি তখনই এটি পুনরুত্পাদনযোগ্য ছিল (<4.4)।

সেটিংস-> ওয়্যারলেস এবং নেটওয়ার্ক-> ওয়াইফাই -> (দীর্ঘ প্রেস তারযুক্ত এসএসআইডি) -> নেটওয়ার্ক সংশোধন করুন এ আপনার প্রক্সি সেটিংস পরীক্ষা করুন

উন্নত বিকল্পগুলি দেখান নির্বাচন করুন: কোনটিতে প্রক্সি সেটিংস সেট করুন।


1

যখন আমি এই ত্রুটিটি পেয়েছি, কারণ এটি সার্ভার দ্বারা সমর্থিত প্রোটোকল (টিএলএস সংস্করণ) এবং / অথবা সাইফার স্যুটগুলি ডিভাইসে (এবং সম্ভবত সমর্থিত নয়) সক্ষম ছিল না। এপিআই 16-19- এর জন্য, টিএলএসভি 1.1 এবং টিএলএসভি 1.2 সমর্থিত তবে ডিফল্টরূপে সক্ষম নয়। একবার আমি এই সংস্করণগুলির জন্য তাদের সক্ষম করে ফেললাম, তবুও ত্রুটিটি পেয়েছি কারণ এই সংস্করণগুলি আমাদের ডাব্লুএস ক্লাউডফ্রন্টের নজরে কোনও সাইফারকে সমর্থন করে না।

যেহেতু অ্যান্ড্রয়েডে সাইফার যুক্ত করা সম্ভব নয়, তাই আমাদের ক্লাউডফ্রন্ট সংস্করণটি টিএলএসভি 1.২_2018 থেকে টিএলএসভি 1.1_2016 এ স্যুইচ করতে হয়েছিল (এটি এখনও টিএলএসভি 1.2 সমর্থন করে; এটি কেবল এটির প্রয়োজন হয় না), যার চারটি সাইফার সমর্থিত রয়েছে পূর্ববর্তী অ্যান্ড্রয়েড সংস্করণগুলি যার মধ্যে দুটি এখনও শক্তিশালী বলে বিবেচিত হয়।

এই মুহুর্তে, ত্রুটিটি অদৃশ্য হয়ে গেল এবং কলগুলি হয়ে গেল (টিএলএসভি 1.2 সহ) কারণ ডিভাইস এবং সার্ভারটি ভাগ করে নিয়েছিল সেখানে কমপক্ষে একটি প্রোটোকল এবং কমপক্ষে একটি সাইফার ছিল।

পড়ুন এই পৃষ্ঠাতে টেবিল যা প্রোটোকল এবং সাইফারগুলির দ্বারা সমর্থিত এবং Android এর যা সংস্করণের উপর সক্রিয় দেখতে।

অ্যান্ড্রয়েড এখন কী ত্রুটি বার্তার অংশ হিসাবে "sslv3 সতর্কতা হ্যান্ডশেক ব্যর্থতা" দ্বারা উল্লিখিত হিসাবে SSLv3 ব্যবহার করার চেষ্টা করছে? আমি এটাকে সন্দেহ করি; আমার সন্দেহ হয় এটি এসএসএল লাইব্রেরির একটি পুরানো কোবওয়েব যা পরিষ্কার করা হয়নি তবে আমি নিশ্চিতভাবে বলতে পারি না।

TLSv1.2 সক্ষম করতে (এবং TLSv1.1), আমি SSLSocketFactoryঅন্য কোথাও দেখা (যেমন NoSSLv3SocketFactory) এর চেয়ে অনেক সহজ ব্যবহার করতে সক্ষম হয়েছি । এটি কেবল নিশ্চিত করে তোলে যে সক্ষম করা প্রোটোকলগুলিতে সমস্ত সমর্থিত প্রোটোকল অন্তর্ভুক্ত রয়েছে এবং সক্ষম সাইফারগুলিতে সমস্ত সমর্থিত সাইফার অন্তর্ভুক্ত রয়েছে (পরবর্তীটি আমার জন্য প্রয়োজনীয় ছিল না তবে এটি অন্যদের জন্যও হতে পারে) - configure()নীচে দেখুন। আপনি যদি কেবলমাত্র সর্বশেষ প্রোটোকলগুলি সক্ষম করতে চান তবে আপনি এমন socket.supportedProtocolsকিছু arrayOf("TLSv1.1", "TLSv1.2")(একইভাবে সিফারদের জন্য) দিয়ে প্রতিস্থাপন করতে পারেন :

class TLSSocketFactory : SSLSocketFactory() {

    private val socketFactory: SSLSocketFactory

    init {
        val sslContext = SSLContext.getInstance("TLS")
        sslContext.init(null, null, null)
        socketFactory = sslContext.socketFactory
    }

    override fun getDefaultCipherSuites(): Array<String> {
        return socketFactory.defaultCipherSuites
    }

    override fun getSupportedCipherSuites(): Array<String> {
        return socketFactory.supportedCipherSuites
    }

    override fun createSocket(s: Socket, host: String, port: Int, autoClose: Boolean): Socket {
        return configure(socketFactory.createSocket(s, host, port, autoClose) as SSLSocket)
    }

    override fun createSocket(host: String, port: Int): Socket {
        return configure(socketFactory.createSocket(host, port) as SSLSocket)
    }

    override fun createSocket(host: InetAddress, port: Int): Socket {
        return configure(socketFactory.createSocket(host, port) as SSLSocket)
    }

    override fun createSocket(host: String, port: Int, localHost: InetAddress, localPort: Int): Socket {
        return configure(socketFactory.createSocket(host, port, localHost, localPort) as SSLSocket)
    }

    override fun createSocket(address: InetAddress, port: Int, localAddress: InetAddress, localPort: Int): Socket {
        return configure(socketFactory.createSocket(address, port, localAddress, localPort) as SSLSocket)
    }

    private fun configure(socket: SSLSocket): SSLSocket {
        socket.enabledProtocols = socket.supportedProtocols
        socket.enabledCipherSuites = socket.supportedCipherSuites
        return socket
    }
}

তুমি এটা কিভাবে ব্যবহার কর?
কুলমাইন্ড

0

আমি এর দ্বারা সমস্যার সমাধান করেছি: NoSSLv3SketFactory.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.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;

public class NoSSLv3SocketFactory extends SSLSocketFactory {
    private final SSLSocketFactory delegate;

    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);
            super.setEnabledProtocols(new String[]{"TLSv1.2"});
        }
    }

    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);
        }
    }
}

প্রধান শ্রেণি:

URL url = new URL("https://www.example.com/test.png");
URLConnection l_connection = null;
SSLContext sslcontext = SSLContext.getInstance("TLSv1.2");
sslcontext.init(null, null, null);
SSLSocketFactory NoSSLv3Factory = new NoSSLv3SocketFactory(sslcontext.getSocketFactory());

0

আমার উত্তর উপরের উত্তরগুলির নিকটে তবে আপনাকে কিছু পরিবর্তন না করে ক্লাসটি লিখতে হবে।

public class TLSSocketFactory extends SSLSocketFactory {

private SSLSocketFactory delegate;

public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {
    SSLContext context = SSLContext.getInstance("TLS");
    context.init(null, null, null);
    delegate = context.getSocketFactory();
}

@Override
public String[] getDefaultCipherSuites() {
    return delegate.getDefaultCipherSuites();
}

@Override
public String[] getSupportedCipherSuites() {
    return delegate.getSupportedCipherSuites();
}

@Override
public Socket createSocket() throws IOException {
    return enableTLSOnSocket(delegate.createSocket());
}

@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
    return enableTLSOnSocket(delegate.createSocket(s, host, port, autoClose));
}

@Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
    return enableTLSOnSocket(delegate.createSocket(host, port));
}

@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
    return enableTLSOnSocket(delegate.createSocket(host, port, localHost, localPort));
}

@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
    return enableTLSOnSocket(delegate.createSocket(host, port));
}

@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
    return enableTLSOnSocket(delegate.createSocket(address, port, localAddress, localPort));
}

private Socket enableTLSOnSocket(Socket socket) {
    if(socket != null && (socket instanceof SSLSocket)) {
        ((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.1", "TLSv1.2"});
    }
    return socket;
}

}

এবং এটি HttpsURL সংযোগের সাথে ব্যবহার করতে

HttpsURLConnection  conn = (HttpsURLConnection) url.openConnection();

int sdk = android.os.Build.VERSION.SDK_INT;
            if (sdk < Build.VERSION_CODES.LOLLIPOP) {
                if (url.toString().startsWith("https")) {
                    try {
                        TLSSocketFactory sc = new TLSSocketFactory();
                        conn.setSSLSocketFactory(sc);
                    } catch (Exception e) {
                        String sss = e.toString();
                    }
                }
            }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.