javax.net.ssl.SSLHandshakeException

Hi,
ich versuche gerade eine App zu programmieren und bin dabei das Login/Signin backend zu schreiben. Ich versuche Aktuell folgendes und zwar Daten in meine MySql Datenbank zu schreiben. Rufe ich die Seite dazu einfach im Browser auf via https://localhost/LoginRegister/signup.php funktioniert es wie es soll möchte ich jetzt allerdings diese URL in meinem Java Script aufrufen erhalte ich folgenden Error:
Java:
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

Ich weiß nicht was ich tun soll. Ich habe schon recherchiert allerdings finde ich nur solche Antworten wie: Du brauchst das Zertifikat. Das Ding ist ich weiß nicht wie ich ein solches Zertifikat erstellen kann -> ich bin ja selbst der Host. Und ich wüsste auch nicht wo ich das dann einfügen müsste in meinem Android Projekt.

Vielen Dank schon mal für jede Hilfe

Hier ist auch noch der Java Code:
Code:
package com.example.ychat;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.material.textfield.TextInputEditText;
import com.vishnusivadas.advanced_httpurlconnection.PutData;

public class SignUp extends AppCompatActivity {
    TextInputEditText fullname, username, passsword, email;
    Button signUp;
    TextView textViewLogin;
    ProgressBar progressBar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sign_up);

        fullname = findViewById(R.id.fullname);
        username = findViewById(R.id.username);
        passsword = findViewById(R.id.password);
        email = findViewById(R.id.email);

        signUp = findViewById(R.id.buttonSignUp);

        textViewLogin = findViewById(R.id.loginText);

        progressBar = findViewById(R.id.progress);

        signUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String fullnametext, usernametext, emailtext, passwordtext;
                fullnametext = String.valueOf(fullname.getText());
                usernametext = String.valueOf(username.getText());
                emailtext = String.valueOf(email.getText());
                passwordtext = String.valueOf(passsword.getText());

                if(!fullnametext.equals("") && !usernametext.equals("") && !emailtext.equals("") && !passwordtext.equals("")) {
                    progressBar.setVisibility(View.VISIBLE);
                    Handler handler = new Handler(Looper.getMainLooper());
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            //Starting Write and Read data with URL
                            //Creating array for parameters
                            String[] field = new String[4];
                            field[0] = "fullname";
                            field[1] = "username";
                            field[2] = "password";
                            field[3] = "email";
                            //Creating array for data
                            String[] data = new String[4];
                            data[0] = fullnametext;
                            data[1] = usernametext;
                            data[2] = passwordtext;
                            data[3] = emailtext;
                            PutData putData = new PutData("https://192.168.0.77/LoginRegister/signup.php", "POST", field, data);
                            if (putData.startPut()) {
                                if (putData.onComplete()) {
                                    String result = putData.getResult();
                                    progressBar.setVisibility(View.GONE);
                                    if(result.equals("Sign Up Success")){
                                        Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
                                        Log.i("Result", result);
                                        Intent intent = new Intent(getApplicationContext(), LogIn.class);
                                        startActivity(intent);
                                        finish();

                                    }
                                    else{
                                        Log.i("Result", result);
                                        Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
                                    }
                                }
                            }
                            //End Write and Read data with URL
                        }
                    });
                }
                else{
                    Toast.makeText(getApplicationContext(), "All fields are requiered", Toast.LENGTH_LONG).show();
                }
            }
        });


    }
}

Und falls es wichtig sein sollte hier auch noch mein AndroidManifest:
Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:usesCleartextTraffic="true"
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:enableOnBackInvokedCallback="true"
        android:supportsRtl="true"
        android:theme="@style/Theme.YChat"
        tools:targetApi="31">
        <activity
            android:name=".LogIn"
            android:exported="false">
            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
        <activity
            android:name=".SignUp"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
        <activity
            android:name=".MainActivity"
            android:exported="false">

            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
    </application>

</manifest>
 

LimDul

Top Contributor
Was für ein Server läuft den auf Localhost? Da wird ja eine PHP Seite angesteuert - also sollte da irgendwo ein HTTP-Server mit PHP laufen.

In dem Server brauchst du, wenn du https verwendest, ein gültiges Zertifikat. Vermutlich kommt da aktuell ein Self-Signed Zertifikat. Jetzt hast du mehrere Möglichkeiten:
a) Ein ordentliches Zertifikat besorgen (dürfte für Localhost nicht gehen, da brauchst eine Domain für)
b) Auf http umstellen (Nur sinnvoll zum testen, später im Echtbetrieb sollte es https sein - aber dann solltest du auch eine Domain haben mit einem entsprechenden funktionierenden Zertifikat)
c) Das Self-Signed Zertifikat in Android importieren

Anleitungen findest du per Google, z.B. hier: https://support.securly.com/hc/en-u...ll-Securly-SSL-certificate-on-Android-device-

Wie du an das Zerifikat kommst - du kannst es eigentlich direkt im Browser, wenn du auf die Seite gehst runterladen, ansonsten anschauen wo der http Server das ablegt. Das ist aber dann Doku vom http Server
 

KonradN

Super-Moderator
Mitarbeiter
Also auf http würde ich nicht zurück gehen. Da dann lieber https ohne Prüfung des Zertifikats / des Hostnamen nutzen.

https://stackoverflow.com/a/33104839 zeigt, wie das aussehen kann.

Die Lösung dort besteht aus zwei Schritten:
a) Einer Klasse die X509TrustManager implementiert und die dann bei dem SSLContext als default eingetragen wird (Das wird dann von HttpsUrlConnection genutzt worauf das PostData / FetchData der von Dir verwendeten Library beruht)
b) Einem HostNameVerifier - Dazu ist ein HostnameVerifier zu erstellen und da reicht es dann, bei verify immer true zurück zu geben. Wird dann in der HttpsUrlConnection als default hinterlegt.

==> Fertig!

An der Stelle aber noch der wichtige Hinweis: Davon wird abgeraten! Das öffnet Tür und Tor für "man in der middle" Angriffe. Das kann man für kleine Spielereien im lokalen Netz machen aber sonst rate ich eindringlich davon ab. Jede etwas andere Umgebung sollte eine saubere PKI Infrastruktur haben. Dazu kann man zur Not einfach per openssl ein eigenes Root Zertifikat erstellen, und damit ein Intermediate Zertifikat. Dann hast Du damit Deine eigene CA und kannst dann für beliebige Systeme Zertifikate ausstellen. Und das Root Zertifikat wird dann in den Systemen hinterlegt als vertrauenswürdiges Zertifikat. Das wäre also bei rein lokalen Netzen (wie ja 192.168.* eins ist) eine gute Möglichkeit. Statt IP Adresse hat man dann sowas wie myserver.fritz.box oder so - also Hostnamen sind wichtig!

Noch besser wäre es natürlich, sowas über das Internet zu machen. Dann hast Du einen Server, der von außen erreichbar ist. Mit einem DNS Namen, der auflösbar ist. Dann kann einfach per letsencrypt ein Zertifikat erstellt und automatisch erneuert werden. Ist ein minimaler Aufwand und die automatische Erneuerung ist trivial, wenn man ein Apache oder nginx nutzt oder so. (Das würde ich immer als Frontend davor setzt. Das macht alles viel einfacher. SSL und so erledigt der Webserver und gewisse Anfragen gehen dann lokal per http weiter an einen Server Deiner Wahl (Also ein Tomcat oder so macht dann nur http auf 127.0.0.1)
 
Noch besser wäre es natürlich, sowas über das Internet zu machen. Dann hast Du einen Server, der von außen erreichbar ist. Mit einem DNS Namen, der auflösbar ist. Dann kann einfach per letsencrypt ein Zertifikat erstellt und automatisch erneuert werden. Ist ein minimaler Aufwand und die automatische Erneuerung ist trivial, wenn man ein Apache oder nginx nutzt oder so. (Das würde ich immer als Frontend davor setzt. Das macht alles viel einfacher. SSL und so erledigt der Webserver und gewisse Anfragen gehen dann lokal per http weiter an einen Server Deiner Wahl (Also ein Tomcat oder so macht dann nur http auf 127.0.0.1)
Also erst mal danke euch beiden! Zweitens wollte ich fragen ob du dafür zufällig eine Website empfehlen kannst die genauer erklärt wie man das einrichten kann ansonsten such ich einfach selber :)
 
Zuletzt bearbeitet:

Neue Themen


Oben