Entwickler-Ecke

Basistechnologien - X509Certificate und openssl


paddy14 - Di 07.06.11 10:05
Titel: X509Certificate und openssl
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 - Di 07.06.11 21:33

Hallo,

siehe (selbes Thema) Zertifikate mit makecert.exe erstellen und mit c# verwenden [http://www.mycsharp.de/wbb2/thread.php?threadid=96056]


mfG Gü


paddy14 - Di 07.06.11 22:23

sslStream.AuthenticateAsClient(serverName)

Was muss anstelle von serverName stehen, hoffe ihr könnt mir das beantworten???


paddy14 - 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:

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 - Mi 08.06.11 14:06

Hallo,

also das Zertifikat kannst Du so erstellen:

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:
http://www.leastprivilege.com/SslStreamSample.aspx
LG


paddy14 - 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.

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);

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 - 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:

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