سؤال

أقوم بإنشاء نسخة اختبار من تطبيق لعميل. يستخدم جزء من هذا التطبيق عرض ويب يستدعي موقعًا قائمًا على SSL. بدوره ، قدم العميل مجال اختبار حيث لا يتطابق اسم الشهادة مع FQDN. للأسف ، فهي ليست في وضع يسمح لها بتوفير شهادة تتطابق. :(

أنا أعمل حول هذه المشكلة على تطبيق IOS AD المخصص المصاحب مع سطر واحد من التعليمات البرمجية (مرة أخرى ، وليس للاستخدام الإنتاج - فقط لأغراض الاختبار). لقد بحثت عن معلومات مماثلة عن Android OS ، لكن الحلول التي رأيتها هنا وفي أماكن أخرى كافية لجعل رأسي تدور وقتًا كبيرًا بالمقارنة!

هل هناك طريقة واضحة للعمل حول هذا؟ حتى إعداد تواجه المستخدم مدسوس في مكان ما؟

أدلة موضع تقدير!

هل كانت مفيدة؟

المحلول

قم بإنشاء WebViewClient وتعامل مع onReceivedsSlerror الذي يبدو مثل هذا:

public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error)

داخل رد الاتصال هذا يمكنك الاتصال فقط handler.proceed() وستستمر الصفحة في التحميل. إذا لم تتعامل مع رد الاتصال هذا واتصل proceed() الطريقة ثم السلوك الافتراضي سيكون حتى يتم تحميل الصفحة.

نصائح أخرى

إجابة محدثة وفقًا لتحديث سياسة الأمان الجديد من Google لمعالج أخطاء SSL ، يرجى الاطلاع على مطوري Android هذا مقالة مركز المساعدة.

لمنع رفض التطبيق على Google Play لانتهاك سياسة السلوك الضار.

للتعامل بشكل صحيح مع التحقق من شهادة SSL ، قم بتغيير الكود الخاص بك لاستدعاء sslerrorhandler.proceed () كلما تلبي الشهادة المقدمة من الخادم توقعاتك ، واستدعاء sslerrorhandler.cancel () خلاف ذلك.

على سبيل المثال ، أقوم بإضافة مربع حوار تنبيه لجعل المستخدم قد أكد ويبدو أن Google لم تعد تعرض تحذيرًا.

@Override
public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
 String message = "SSL Certificate error.";
    switch (error.getPrimaryError()) {
        case SslError.SSL_UNTRUSTED:
            message = "The certificate authority is not trusted.";
            break;
        case SslError.SSL_EXPIRED:
            message = "The certificate has expired.";
            break;
        case SslError.SSL_IDMISMATCH:
            message = "The certificate Hostname mismatch.";
            break;
        case SslError.SSL_NOTYETVALID:
            message = "The certificate is not yet valid.";
            break;
    }
    message += " Do you want to continue anyway?";

    builder.setTitle("SSL Certificate Error");
    builder.setMessage(message);

builder.setPositiveButton("continue", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        handler.proceed();
    }
});
builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        handler.cancel();
    }
});
final AlertDialog dialog = builder.create();
dialog.show();

}

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top