none
SSL Server with Client Authentification and Self Signed Certificates RRS feed

  • Frage

  • Hallo an alle

    Folgende Situation: Ich habe ein Zertifikat (X509 Self Signed) vom Clienten und möchte dies nun in .NET vertrauen können. Ich lade also das Zertifikat und speicher es im X509Store ab (LocalMachine in Root). Funktioniert auch alles und das Zertifikat befindet sich im 'Trusted Root Certification Authorities' der 'Local Machine'. Starte ich nun den Server und will mit meinem Clienten drauf connecten fragt mich der Server nach einem Zertifikat 

    sslStream->AuthenticateAsServer(cert, true, SslProtocols::Tls, true);

    Nun das Problem: Teste ich das ganze lokal auf Windows 10 dann funktioniert das ganze. Da er das Protokoll TLS verwendet, KANN der Server (muss er aber nicht) eine Liste von Certificate Authorities übergeben, denen er vertraut. Bei Windows 10 macht er dies genau nicht und der Client sendet einfach sein Zertifikat, der Server findet dies in seinem Truststore und fertig. Alles Läuft!

    Andere Situation (die ich nun leider habe): Ich will von einem anderem Computer auf den Server connecten. Der Server läuft jetzt auf Windows 7. Anscheinend ist aber in Windows 7 das ganze so eingestellt, dass der Server, wenn er ein Client Zertifikat erwartet eine Liste von Certificate Authorities mitsendet. Problem: Das Zertifikat ist hier nicht drin, der Client findet sein Zertifikat also auch nicht als vertraut und sendet daraufhin gar keins => Die Verbindung wird abgebrochen.

    Hier mal ein bisschen Code: So wird die Verbindung aufgebaut.

    sslStream = gcnew SslStream(client->GetStream(), false);
    	//require client cert
    	try {
    		sslStream->ReadTimeout = 1000;
    		sslStream->WriteTimeout = 1000;
    		sslStream->AuthenticateAsServer(cert, true, SslProtocols::Tls, true);
    	}
    	catch (AuthenticationException^ ae) { //sslrequired must be set to true for this exception to happen
    		l->Error("AuthenticationException occured. Closing Connection!", ae);
    		sslStream->Close();
    		return nullptr;
    	}

    Und hier schreibe ich mein Zertifikat in den Store: 

    X509Certificate2^ cert = gcnew X509Certificate2;
    		cert->Import(certificateFileTruststore);
    X509Store^ store = gcnew X509Store(StoreName::Root, StoreLocation::LocalMachine); //windows Truststore!
    		store->Open(OpenFlags::ReadWrite);
    		store->Add(cert);
    		store->Close();

    Ich kann mir folgendes vorstellen:

    1. Der Computer benutzt für die Verifizierung des Clients nicht den Store, in das ich das Zertifikat schreibe (wenn ja welchen benutzt er??)
    2. Es besteht überhaupt gar nicht die Option einem Selbssigniertem Zertifikat vom Clienten zu vertrauen.
    3. Es gibt andere Änderungen, die ich vornehmen muss, damit das ganze läuft (beispielsweise irgendwelche Werte in der Registry ändern oder Config-Files 

    Ich fände es sehr schön, wenn ich dieses ganze Problem programmtechnisch lösen könnte. 

    Über Ideen wäre ich sehr dankbar. Sitze an diesem Problem schon eine ganze Weile.

    Dienstag, 15. Dezember 2015 11:27