Autor Beitrag
paddy14
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122



BeitragVerfasst: Di 07.06.11 10:05 
Guten Tag Forum,

hat vllt einer von euch nen Link, wo beschrieben ist wie ich mit Openssl ein Zertifikat erstellen kann damit ich das in meinem Programm verwenden kann, ist keine Webanwendung nur ein Server und dann die Clients.

Mein Programm sollte Daten über SSLStream versenden. Dafür muss ich mir ja ein Zertifikat erstellen und mir dann mit X509Certificate ein x509 Zertifikat erstellen.
Es sollte ja eine .cer datei sein aber wie geht das nun mit dem Privaten und Öffentlichen Schlüssel von statten.

Danke für eure Antworten.

Mfg Patrick
gfoidl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 157
Erhaltene Danke: 19

Win XP
C#, Fortran 95 - Visual Studio
BeitragVerfasst: Di 07.06.11 21:33 

_________________
Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
paddy14 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122



BeitragVerfasst: Di 07.06.11 22:23 
sslStream.AuthenticateAsClient(serverName)

Was muss anstelle von serverName stehen, hoffe ihr könnt mir das beantworten???
paddy14 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122



BeitragVerfasst: Mi 08.06.11 13:27 
Ich habe schon überall gegooglet aber nix passendens gefunden.
Mein Problem ist das ich nicht genau weiß wie ich ein Zertifikat richtig erstelle damit ich in csharp mit sslstream arbeiten kann.
Bekomme hier immer diese Fehlermeldung:
ausblenden C#-Quelltext
1:
X509Certificate cert = X509Certificate.CreateFromCertFile(certi);					

Der ursprüngliche Signaturgeber wurde nicht gefunden.
Danach habe ich auch schon gesucht aber nix dolles gefunden.

Wenn ihr mir helfen könnt bitte nicht mehr auf iwelche Seiten verweisen, die habe ich schon so gut wie alle durch ok.

Danke
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mi 08.06.11 14:06 
Hallo,

also das Zertifikat kannst Du so erstellen:
ausblenden Quelltext
1:
makecert.exe -sr CurrentUser -ss My -a sha1 -n CN=Server -sky exchange -pe					
Das Zertifikat mit private Key landen dann im Zertifikatsspeicher.
Diese kannst Du dann entweder direkt aus dem Speicher laden (was natürlich das Beste ist), oder Du exportierst dem privaten Schlüssel (der öffnetliche ist ja per default dabei) und lädtst es dann mit Deinem genannten Code.

Für die Client-Server-Geschichte ist diese Seite ganz hilfreich:
www.leastprivilege.c...SslStreamSample.aspx
LG
paddy14 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122



BeitragVerfasst: Mi 08.06.11 15:32 
Danke für deine Antwort, das makecert geht nicht da muss iwas mit der Sytax net stimmen.
Ich habe es dann mal mit dieser versucht.
ausblenden Quelltext
1:
2:
3:
makecert -sk myNewKey -r -n "CN=Jay Adams, 
   OU=Certification,O=A Datum Corporation,E=adatum@adatum.com"  
      -ss my myNew.cer


so und das ist erstmal mein ganz einfacher code vom server:

[/cs]
TcpClient client;
IPAddress ip = IPAddress.Parse("192.168.100.50");
TcpListener listener = new TcpListener(ip, 13000);
listener.Start();
client = listener.AcceptTcpClient();
string Certificate = "C:\\Programme\\Microsoft.NET\\SDK\\v1.1\\BIN\\savecert.cer";
SslStream ssl = new SslStream(client.GetStream(), false);
X509Certificate cert = X509Certificate.CreateFromCertFile(Certificate);
ssl.AuthenticateAsServer(cert);
Console.WriteLine("ok:" + ssl.IsAuthenticated);
ausblenden C#-Quelltext
1:
Und dieser ist vom Client:					

int port = 13000;
IPAddress ip = IPAddress.Parse("192.168.100.50");
TcpClient client = new TcpClient();
client.Connect(ip, port);
SslStream ssl = new SslStream(client.GetStream());
ssl.AuthenticateAsClient("C:\\Programme\\Microsoft.NET\\SDK\\v1.1\\BIN\\savecert.cer");
Console.WriteLine("geht:"+ssl.IsAuthenticated);
[cs]
Vllt ist ja auch was mit meinem code net in Ordnung.

Danke schonmal für die Hilfe.
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mi 08.06.11 17:29 
Hi,
also, das Serverzertifikat muss einen privaten Schlüssel besitzen, ansonsten geht es nicht.
Und beim Client muss auch das vom Server gesendete Zertifikat durch ein Callback geprüft werden.
Ich poste einfach mal etwas Code:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
static void Main(string[] args)
{
  new Thread(StartServer).Start();
  new Thread(ConnectClient).Start(); 
  Console.ReadKey();
}

private static void StartServer()
{
  TcpListener listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 13000);
  listener.Start();
  using (TcpClient client = listener.AcceptTcpClient())
  {
    using (SslStream ssl = new SslStream(client.GetStream()))
    {
      X509Certificate cert = X509Certificate.CreateFromCertFile("C:\\temp\\pfxFile.pfx");
      ssl.AuthenticateAsServer(cert, false, SslProtocols.Default, false);
      Console.WriteLine("Server ok:" + ssl.IsAuthenticated);
    }
  }
}

private static void ConnectClient()
{
  using (TcpClient client = new TcpClient())
  {
    client.Connect(IPAddress.Parse("127.0.0.1"), 13000);
    using (SslStream sslStream = new SslStream(client.GetStream(), falsenew RemoteCertificateValidationCallback(CertificateValidationCallback)))
    {
      sslStream.AuthenticateAsClient("client1");
      Console.WriteLine("geht:" + sslStream.IsAuthenticated);
    }
  }    
}

private static bool CertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
  //hier würde das Serverzertifikat überprüft werden
  return true;
}

Soviel erstmal

Für diesen Beitrag haben gedankt: paddy14