Laden...

[erledigt] Codeteil zum Speichern von Zertifikaten funktioniert nur in Visual Studio

Erstellt von darklight vor 11 Jahren Letzter Beitrag vor 11 Jahren 905 Views
D
darklight Themenstarter:in
15 Beiträge seit 2012
vor 11 Jahren
[erledigt] Codeteil zum Speichern von Zertifikaten funktioniert nur in Visual Studio

Guten Tag,

ich steh momentan vor einem eher seltsamen Problem. Ich versuche in den X509-Store eines PCs ein selbst signiertes Zertifikat für eine SSL-Verbindung einzuschleusen. Für diesen Vorgang werden Adminrechte benötigt. Aus diesem Grund prüfen ich in meinem Programm ob es mit Adminrechten ausgeführt wurde. Wenn nicht startet es erneut mit der Bitte nach Adminrechten, versucht dann das Zertifikat zu erstellen und es zu "installieren".

Wenn ich das Programm nun normal starte sagt es mir es benötige Adminrechte und es startet sich dann neu. Sobald ich ihm Adminrechte gewähren erscheint die Oberfläche, ein Command-Fenster erscheint (der Befehl für die Zertifikatserstellung wird ausgeführt) und schließt sich danach. Ich muss aber feststellen, das das Zertifikat nicht in den Store geschrieben wurde.

Wenn ich aber Visual Studio 2010 mit Adminrechten starte und dann mein Programm ausführe wird das Zertifikat ohne meckern erstellt.

Ich weiß leider nicht wo das Problem liegt. Vielleicht hat einer von euch schonmal mit einem ähnlichen Problem zu kämpfen gehabt. Ich hoffe ihr könnt mir helfen.

Hier noch mein Codeteil:



if (!this.serverData.ExistsServerCertificate())
{
   if (!IsAdmin())
   {
      System.Windows.Forms.MessageBox.Show("Für den weiteren Programmablauf sind Adminrechte notwendig.\r\nDiese Adminrechte werden einmalig für die Erstellung des SSL-Zertifikates benötigt. Nach der Zertifikatserstellung kann das Programm ohne Adminrechte betrieben werden.\r\n\r\nDas Programm startet sich nun mit Adminrechten neu.", "Fehler: ");
      RestartElevated();
   }
   else this.serverData.MakeServerCertificate();
}

public bool ExistsServerCertificate()
{
   X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
   store.Open(OpenFlags.ReadOnly);
   var certificates = store.Certificates.Find(X509FindType.FindBySubjectDistinguishedName, "CN=WhoChat", false);
   store.Close();
   if (certificates.Count == 0) return false;
   else return true;
}

public void MakeServerCertificate()
{
   AddLogMessage("Zertifikat nicht gefunden");
   File.WriteAllBytes("makecert.exe", WhoChat.Properties.Resources.makecert);
   Process.Start("cmd.exe", "/c makecert -sr LocalMachine -ss root -r -n \"CN=WhoChat\" -sky exchange -sk 123456");
   AddLogMessage("Zertifikat neu erstellt");
   File.Delete("makecert.exe");
}

private void RestartElevated()
{
   ProcessStartInfo startInfo = new ProcessStartInfo();
   startInfo.UseShellExecute = true;
   startInfo.WorkingDirectory = Environment.CurrentDirectory;
   startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
   startInfo.Verb = "runas";
   try
   {
      Process p = Process.Start(startInfo);
   }
   catch (System.ComponentModel.Win32Exception ex)
   {
      this.serverData.AddLogMessage(ex.ToString());
      return;
   }
   Environment.Exit(2);
}

16.842 Beiträge seit 2008
vor 11 Jahren

Dürfte daran liegen, dass Du das WorkingDirectory bei Process.Start("cmd..." nicht setzt.
Ähnliches Thema hatten wir neulich erst und ist ein häufiges Problem beim Aufruf der cmd.exe über C#.

Warum startest Du aber nicht die Ziel-Exe direkt, sondern gehst den cmd-exe-Umweg?

D
darklight Themenstarter:in
15 Beiträge seit 2012
vor 11 Jahren

Hm, den umweg über die cmd.exe gehe ich weil ich es noch nie anderst probiert habe 😃
Ich werde mal versuchen deine angesprochene Methode zu verwenden.

Nichtsdestotrotz, wäre dies hier so richtig ?


public void MakeServerCertificate()
{
   AddLogMessage("Zertifikat nicht gefunden");
   File.WriteAllBytes("makecert.exe", WhoChat.Properties.Resources.makecert);
   ProcessStartInfo pInfo = new ProcessStartInfo();
   pInfo.FileName = "cmd.exe";
   pInfo.Arguments = "/c makecert -sr LocalMachine -ss root -r -n \"CN=WhoChat\" -sky exchange -sk 123456";
   pInfo.WorkingDirectory = @"C:\Windows\System32\";
   Process.Start(pInfo);
   AddLogMessage("Zertifikat neu erstellt");
   File.Delete("makecert.exe");
}

16.842 Beiträge seit 2008
vor 11 Jahren

Ausprobiern 😉

D
darklight Themenstarter:in
15 Beiträge seit 2012
vor 11 Jahren

Wunderbar, dankeschön 😃
Das Zertifikat wird nun ohne Probleme erstellt.