เชื่อมต่อเซิร์ฟเวอร์ที่ลงนามด้วยตนเอง: javax.net.ssl.SSLPeerUnverifiedException: ชื่อโฮสต์ 192.168.x.x ไม่ได้รับการยืนยัน

ฉันจะขอบคุณมากหากคุณสามารถช่วยฉันแก้ไขปัญหานี้ได้ ฉันกำลังพัฒนาแอพ Android เมื่อเร็ว ๆ นี้ และตอนนี้ฉันต้องเชื่อมต่อกับเซิร์ฟเวอร์ด้วยใบรับรองที่ลงนามด้วยตนเองผ่าน Https ฉันต้องทำให้ชัดเจนว่าใบรับรองนั้นลงนามด้วยตนเอง และแน่นอนว่าใบรับรองนั้นไม่น่าเชื่อถือบนอุปกรณ์ Android ของฉัน ดังนั้นฉันจึงทำตามขั้นตอนใน https://developer.android.com/training/articles/security-ssl.htmlอย่างระมัดระวัง รหัสมีดังนี้:

SSLSocketFactory sslSocketFactory = getSSL(context);
URL url = new URL(address);
HttpsURLConnection urlConnection = (HttpsURLConnection)url.openConnection();
urlConnection.setSSLSocketFactory(sslSocketFactory);
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.connect();


protected static SSLSocketFactory getSSL(Context context) {
    SSLSocketFactory sslSocketFactory = null;
    try {
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        InputStream caInput = context.getResources().getAssets().open("softRSAroot.cer");
        Certificate ca;
        try {
            ca = cf.generateCertificate(caInput);
            Log.d("maggie", "ca= " + ((X509Certificate) ca).getSubjectDN());
        }finally {
            caInput.close();
        }
        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);

        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);

        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, tmf.getTrustManagers(), null);
        sslSocketFactory = sslContext.getSocketFactory();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return sslSocketFactory;
}

จากนั้นฉันก็ได้รับสิ่งนี้:

java.util.concurrent.ExecutionException: javax.net.ssl.SSLPeerUnverifiedException: ชื่อโฮสต์ 192.168.3.33 ไม่ได้รับการยืนยัน: ใบรับรอง: sha1/gJuuHkIr9IeY7Q42In3rrg0PvKw= DN: CN=192.168.3.33,OU=YJY,O=xxx,L=xxx,ST =xxx,C=CN subjectAltNames: []

ที่อยู่ IP ตรงกับ CN ฉันกำลังพยายามอย่างหนักต่อไป ขอบคุณที่อ่านและช่วยเหลือฉัน


person Maggie    schedule 03.05.2017    source แหล่งที่มา
comment
คุณสร้างใบรับรองถูกต้องหรือไม่?   -  person Krish    schedule 03.05.2017
comment
คุณพูดถูก! ฉันไม่รับผิดชอบต่อเซิร์ฟเวอร์ นักพัฒนาให้ใบรับรองเพื่อเพิ่มเข้าไป และปรากฏว่าพวกเขาไม่ได้เพิ่ม subjectAltNames ตอนนี้ฉันได้แก้ไขสิ่งนี้แล้วโดย javax.net.ssl.SSLPeerUnverifiedException : ชื่อโฮสต์ไม่ได้รับการยืนยัน:   -  person Maggie    schedule 04.05.2017