leon123
Goto Top

C-Sharp - Selbst Signierte Zertifikate prüfen

Hallo zusammen,

ich beschäftige mich gerade mit Zertifikaten, da ich Dateien gerne verschlüsselt von einem FTP holen möchte.

Mir ist klar, dass ich das Zertifikat beim Client zu den erlaubten Zertifikate hinzufügen könnte. Da ich aber ohne Adminrechte auskommen möchte, würde ich es gerne selbst prüfen.


Ich habe mir überlegt, das Zertifikat mit abzulegen und den Hash des Zertifikats vom Server sowie des abgelegten zu überprüfen:
         public bool myCertificateValidation(Object sender,
         X509Certificate cert,
         X509Chain chain,
         SslPolicyErrors Errors)
        {
            bool bRet = false;

            var pem = System.IO.File.ReadAllText("c:\temp\cert.crt");  
            byte certBuffer = GetBytesFromPEM(pem, "CERTIFICATE");  
            var certificate = new X509Certificate2(certBuffer);

            if (certificate.GetCertHashString().Equals(cert.GetCertHashString()))
            {
                bRet = true;
            }

            return bRet;
        }

Das würde jetzt auch funktionieren...

Aber ich glaube ich habe hier einen Denkfehler. Das Zertifikat wird vom Server ja an jeden geschickt, also könnte sich ein Angreifer (Man-in-the-Middle) sich das Zertifikat einfach kopieren.

Was wäre den der richtige weg das zu validieren?

Vielen Dank!

Content-Key: 365893

Url: https://administrator.de/contentid/365893

Printed on: April 19, 2024 at 19:04 o'clock

Mitglied: 135333
135333 Feb 23, 2018 updated at 09:44:21 (UTC)
Goto Top
Aber ich glaube ich habe hier einen Denkfehler. Das Zertifikat wird vom Server ja an jeden geschickt, also könnte sich ein Angreifer (Man-in-the-Middle) sich das Zertifikat einfach kopieren.
Jepp, Denkfehler. Ein Zertifikat hat immer zwei Teile, einen öffentlichen Part (crt) und einen privaten Teil (key). Ohne den privaten Key kann niemand etwas mit dem crt anfangen.
https://stackoverflow.com/questions/8908206/how-to-check-if-private-publ ...
https://blogs.msdn.microsoft.com/alejacma/2008/06/25/how-to-sign-and-ver ...
Verifying that a Private Key Matches a Certificate

Gruß Snap
Member: leon123
leon123 Feb 23, 2018 updated at 09:46:28 (UTC)
Goto Top
Dane für deine Antwort.

Ich habe im Filezilla ein eigenes Zertifikat erstellt und habe das ein .crt erhalten.

Wenn ich mich am Server anmelde schickt mir der Server das .crt. Wie kann ich jetzt sicherstellen, dass es auch der Server ist?

// ich check das einfach mit den zertifikaten nicht richtig glaub ich... ;)
Mitglied: 135333
135333 Feb 23, 2018 updated at 09:47:29 (UTC)
Goto Top
Zitat von @leon123:
Ich habe im Filezilla ein eigenes Zertifikat erstellt und habe das ein .crt erhalten.
Ja das schon, aber im Hintergrund hat Filezilla auch seinen privaten Schlüssel dafür, und ohne den kann jemand anderes dein Cert nicht verwenden da ihm der private Schlüssel dazu fehlt.
Wenn ich mich am Server anmelde schickt mir der Server das .crt. Wie kann ich jetzt sicherstellen, dass es auch der Server ist?
Ist oben verlinkt.
Hier nochmal
https://stackoverflow.com/questions/22076184/how-to-validate-a-certifica ...
Member: leon123
leon123 Feb 23, 2018 at 09:54:07 (UTC)
Goto Top
Die Stackoverflow links funktionieren nicht...

Kannst du bitte noch ein bisschen ausholen. Ich checke die Zertifikate Geschichte einfach immer noch nicht. Ich habe mir heute morgen schon einiges angesehen und das Grundkonzept sollte ich eigentlich verstanden haben (hat man ja auch irgendwann in der schule gelernt) aber wenn ich es jetzt praktisch anwenden will, tu ich mir verdammt schwer.

Ich habe jetzt ein certificat.crt vom Filezilla erhalten. Das habe ich auf den Client kopiert.
(Komischerweise kann ich das auch nicht installieren. Windows sagt mir ungültiges Sicherheitszertifikat und in der mmc Konsole kennt Windows den Dateityp nicht.)

Wenn ich mich jetzt zum Server Verbinde, schickt dieser mir das Zertifikat. Ich habe ja keinen privaten Key, das wäre ja fatal.
Mitglied: 135333
135333 Feb 23, 2018 updated at 10:00:41 (UTC)
Goto Top
Zitat von @leon123:

Die Stackoverflow links funktionieren nicht...
Doch, gehen hier einwandfrei.
Kannst du bitte noch ein bisschen ausholen. Ich checke die Zertifikate Geschichte einfach immer noch nicht. Ich habe mir heute morgen schon einiges angesehen und das Grundkonzept sollte ich eigentlich verstanden haben (hat man ja auch irgendwann in der schule gelernt) aber wenn ich es jetzt praktisch anwenden will, tu ich mir verdammt schwer.

Ich habe jetzt ein certificat.crt vom Filezilla erhalten.
Schau da mal rein ob dort ein private Key enthalten ist.
Das habe ich auf den Client kopiert.
(Komischerweise kann ich das auch nicht installieren. Windows sagt mir ungültiges Sicherheitszertifikat und in der mmc Konsole kennt Windows den Dateityp nicht.)
Dann ist das ein PEM mit öffentlichem und privatem Key. Windows erwartet hier PFX oder P12 Container.

Public und Private Key lassen sich auch schnell mit openssl trennen.
Wenn du sowas unvschlüsselt im Klartext ohne P12 oder PFX Container verschickst ist das natürlich unsicher hoch drei face-smile.
Wenn ich mich jetzt zum Server Verbinde, schickt dieser mir das Zertifikat. Ich habe ja keinen privaten Key, das wäre ja fatal.
Den private Key bleibt ja auch am Server!

Ich glaube du solltest die Grundlagen besser nochmal 2 3 mal durchlesen.
Member: leon123
leon123 Feb 23, 2018 at 10:04:17 (UTC)
Goto Top
Ich habe mir eben die Links angeschaut... Aber ich glaube wie du schon sagst fehlt mir noch was an der Grundlage....


Wenn ich das hier mache dann kann mir doch auch ein Man in the Middle ein selbst zertifiziertes Zertifikat schicken und so tun als wäre er der server? Da habe ich doch noch nichts gewonnen?!?
foreach (System.Security.Cryptography.X509Certificates.X509ChainStatus status in chain.ChainStatus)
          {
            if ((certificate.Subject == certificate.Issuer) &&
               (status.Status == System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.UntrustedRoot))
            {
              // Self-signed certificates with an untrusted root are valid. 
              continue;
            }
Mitglied: 135333
135333 Feb 23, 2018 updated at 12:42:40 (UTC)
Goto Top
Also nochmal:
Der Server verschlüsselt mit seinem privaten Schlüssel und seinem öffentlichen Schlüssel die Nachrichten.
Um nun festzustellen das die Nachrichten tatsächlich von deinem Server kommen erstellst du einen Hash über den modulus des öffentlichen Teils des Zertifikats und den Hash über deinen modulus des geheimen privaten Schlüssel mit sha256, sind beide Hashes identisch kannst du sicher sein das es dein Server ist.
Gibts überall
https://www.sslshopper.com/certificate-key-matcher.html

Du verwechselst hier Signatur und Verschlüsselung.

Viel Erfolg i'm out.
Member: leon123
leon123 Feb 23, 2018 at 10:22:38 (UTC)
Goto Top
Ich stehe aber immer noch auf dem Schlauch,

ich aktiviere bei FileZilla Server FTP über TLS. Soweit so gut.

Melde ich mich mit dem FileZilla Client am Server an, schickt der mir eine Aufforderung das Zertifikat zu akzeptieren, darauf hin schicke ich dem Server meine Zugangsdaten.

So jetzt gibt ein anderer als mein Server aus und schickt mir sein Zertifikat. Jetzt sag ich okay super nehm ich an und schick dem meine Daten.

Wo ist jetzt hier der Gewinn, wenn ich alle selbst Zertifizierten Zertifikate annehme?