HTTPS Sebst signiertes Zertifikat

  • Hallo zusammen,


    ich versuche schon seit Stunden, eine HTTPS-Anfrage an meinen eigenen Server zu senden.
    Mein Zertifikat ist selbst erstellt und liegt als .crt-File vor.


    Sämtliche Codes im Internet machen folgendes:


    Java
    HttpsURLConnection.setDefaultSSLSocketFactory(EIGENE_FACTORY);


    Es wird eine eigene SSLSocketFactory erstellt, die aus den Android-Ressourcen das .crt bzw. .bks-File ließt und nur dem eigenen Zertifikat vertraut.
    Allerdings sind alle Codes zum erstellen der eigenen Factory veraltet, und ich habe sie nicht integrieren können.


    Bin schon fast verzweifelt. Wie kann ich meine eigene SSLSocketFactory instanzieren, die nur meine eigenen Zertifikat traut?


    Wie mache ich das: meinZertifikat.crt -> new SSLSocketFactory() ?


    Viele Dank!

  • Puh! Nach tagelangem Rumprobieren und lesen von etlichen Post habe ich es geschafft:


    1) .crt-Datei in einen neuen Keystore:


    - Mithilfe des Java-Tools "portecle-1.9" neuen Keystore BKS anlegen, .crt-Datei einfügen, speichern unter .bks
    2)
    In Android:
    Ordner erstellen: <Javaapp>\src\main\res\raw
    Dort die .bks-Datei einfügen.


    Somit hat man endlich eine eigene SSLSocketFactory, die nur dem eigenen selbst signierten Zertifikat vertraut.


    3) Anwendung:



    Java
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
    SSLSocketFactory sf = getSocketFactory(ctx);
    
    
    if(sf != null){
        conn.setSSLSocketFactory(sf);
        ...
        conn.close();
    }

    Viel Erfolg!


    EDIT:
    Für ältere Android-Phones muss mit einem anderen Keystore gearbeitet werden. Ansonsten erhält man die Meldung:
    Wrong version of Keystore
    Ihr solltet euren Keystore also zusätzlich als BKS-v1 exportieren und in den raw-ordner hinzufügen.



    Im Code fügt ihr dann eine Weiche ein, die den jeweils richtigen Keystore auswählt:


    Java
    int bks_version;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        bks_version = R.raw.bksdateiname; //The BKS file
    } else {
        bks_version = R.raw.bksdateiname_v1; //The BKS (v-1) file
    }
    KeyStore ks = KeyStore.getInstance("BKS");
    InputStream in = getResources().openRawResource(bks_version);

    Somit könnt ihr neue und alte Smartphones ideal bedienen.

    Einmal editiert, zuletzt von schirmo () aus folgendem Grund: Für ältere Versionen muss ein anderen Keystore-Format verwendet werden. Hinweis mit Quellcode ergänzt.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!