ارتباط با https در نسخه های پایین اندروید
سلام دوستان
وقتتون بخیر
من برای ارتباط با سرور از رتروفیت استفاده میکنم ، الان مشکلی که دارم در نسخه ی بالاتر از 5 به راحتی به سرور وصل میشه و اطلاعات رو دریافت میکنه اما توی نسخه های پایین ارور میده . من برا سایتم از ssl استفاده می کنم
اروری که دریافت میکنم این هست :
javax.net.ssl.SSLProtocolException:SSL handshake aborted:ssl=0xb996adb0: Failure in SSL library, usually a protocol error
error:1047742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version(external/openssl/ssl/s23_clnt.c:741 0x83c38770:0x00000000)
با سلام دوست عزیز.. SSL های ورژن بالا یعنی از 3 به بالا که TLS نام دارن.. در اندروید 5 به پایین ساپورت میشن ولی به صورت پیش فرض disable هستند... و سروری که از آن استفاده میکنید با SSLv4 یا TLSV1.2 خدمات میده که در اندروید 5 به پایین disable هست که باید Enable کنید.
یک کلاس جدید ایجاد کنید با نام TLSSocketFactory و کد پایین را در آنجا کپی کنید...
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
/**
* //by navid moshkbar :))))
*/
public class TLSSocketFactory extends SSLSocketFactory {
private SSLSocketFactory internalSSLSocketFactory;
public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, null, null);
internalSSLSocketFactory = context.getSocketFactory();
}
@Override
public String[] getDefaultCipherSuites() {
return internalSSLSocketFactory.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites() {
return internalSSLSocketFactory.getSupportedCipherSuites();
}
@Override
public Socket createSocket() throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket());
}
@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose));
}
@Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
}
@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort));
}
@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port));
}
@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
return enableTLSOnSocket(internalSSLSocketFactory.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;
}
}
و یک نمونه از کلاس TLSSocketFactory را به روش زیر در OKHttpClient با استفاده از ()sslSocketFactory وارد کنید و بعد از retrofit استفاده کنید
OkHttpClient okHttpClient = new OkHttpClient
.Builder()
.sslSocketFactory(new TLSSocketFactory())
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API_URL)
.client(okHttpClient)
.build();
و قبلا از OKHttpClient این خط از کد را وارد کنید
if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT){
ProviderInstaller.installIfNeeded(context);
}
توجه داشته باشید که اندروید 5 به پایین که میخواد ارتباط برقرار کنه باید google play services تو اون گوشی اپدیت یا نصب باشه که تو emulator ها این چنین نیست پس با یه گوشی فیزیکی که اندرویدش پایینه امتحان کنید... ایشالاه که مشکلتون حل میشه
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .