آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

ارتباط با https در نسخه های پایین اندروید

kazemian  5 سال پیش  3 سال پیش
+1 0

سلام دوستان
وقتتون بخیر

من برای ارتباط با سرور از رتروفیت استفاده میکنم ، الان مشکلی که دارم در نسخه ی بالاتر از 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)
 برای این سوال 1 پاسخ وجود دارد. مشاهده پاسخ صحیح
پاسخ به سوال 
navid  5 سال پیش
+2 0

 پاسخ صحیح

با سلام دوست عزیز.. 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 ها این چنین نیست پس با یه گوشی فیزیکی که اندرویدش پایینه امتحان کنید...   ایشالاه که مشکلتون حل میشه

+1 0
توضیحاتتون خییییلی عاالی بود ، خیلی ممنونم ازتون . با اضافه کردن فقط آخرین تکه کد یعنی شرط if کارم راه افتاد (5 سال پیش)
+1 0
خواهش میکنم خوشحال شدم مشکلتون حل شد. (5 سال پیش)
0 0
متاسفانه یه مشکل جدید پیدا شده ، الان وقتی از https استفاده میکنم ، توی اندروید ۶ Header ست نمیشه نمیدونم چرا اما اگه http استفاده کنم به خوبی کار میکنه ! (5 سال پیش)
0 0
چطوره از param برای ارسال اطلاعات استفاده کنید!! (5 سال پیش)
0 0
یعنی چطوری ؟ منظورتون اینه که با get و post اطلاعات رو بفرستم ؟ (5 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .