2014-06-07 14 views
5

Rozwinąłem hostowane przez siebie api.http dodać sslcert kończy się niepowodzeniem, gdy jest programowany programowo

Ruch api musi działać przez SSL.

Za pomocą kombinacji poleceń netsh udało mi się pomyślnie dodać certyfikat, a następnie powiązać trasę z moją usługą. Szczęśliwe dni.

Ale, muszę napisać instalator, aby to zrobić programowo.

Problemem jest to, że kiedy dodać certyfikat przy moim C# kod, mogę go zobaczyć MMC certyfikat, ale gdy próbuję powiązać z nim pojawia się błąd:

SSL Certificate add failed, Error: 1312 
A specified log-on session does not exist. It may already have been terminated. 

Jak mówię, kiedy to zrobić ręcznie z tych etapów nie rozumiem problemu ...

  1. przedmiot
  2. dwukrotnie kliknąć na plik .pfx.
  3. Otwiera się MMC.
  4. Wybieram "Komputer lokalny"
  5. Na następnym ekranie potwierdzam lokalizację i nazwę pliku .pfx.
  6. wprowadzić hasło do certyfikatu i wybierz „Uwzględnij wszystkie właściwości rozszerzone”
  7. Na następnym ekranie I niech to domyślnie „Automatycznie wybierz magazyn certyfikatów na podstawie typu certyfikatu”
  8. I wtedy dostać ekran potwierdzenia.
  9. Po kliknięciu „Zakończ” pojawia się komunikat „Import był udany”

mogę wtedy zobaczyć go w MMC pod osobistym> Certyfikaty

I to pozwala mi dodać trasę użyciu narzędzie Netsh wiersz polecenia - Happy Days.

Kiedy spróbować zrobić to programowo z następującego kodu:

public static bool ConfigureSSLCertificate(string file, string password, string method) 
    { 
     try 
     { 
      X509Certificate2 cert = new X509Certificate2(file, password); 

      var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
      store.Open(OpenFlags.ReadWrite); 
      if (!store.Certificates.Contains(cert)) 
      { 
       if (method == "add") 
       { 
        store.Add(cert); 
       } 
      } 
      if (method == "remove") 
      { 
       store.Remove(cert); 
      } 
      return true; 
     } 
     catch { return false; } 
    } 

Certyfikat pojawia się w moim MMC w dokładnie tym samym miejscu, ale gdy próbuję dodać trasę z dokładnie tego samego polecenia netsh jak przed Otrzymałem komunikat o błędzie opisany powyżej:

netsh>http add sslcert ipport=0.0.0.0:8088 certhash=fb93ce2c4d8bd88c82e63e3372a050ba84f15e94 appid={bb14356a-a14f-4589-82ce-b80d38b8741e} 

Z jakiegoś powodu, gdy ręcznie dodam certyfikat za pomocą MMC, a po uruchomieniu kodu coś się zmieni. Coś, co zatrzymuje dodawanie trasy.

Czy ktoś może zasugerować, co robię źle, proszę?

+0

mam ten sam problem :( – nemke

Odpowiedz

1

Rozwiązaniem jest rzeczywiście prosta - Ja też zmagali się z tego, a teraz znalazł rozwiązanie. W jaki sposób ręcznie dodany certyfikat różni się od dodanego programowo? Cóż, krótka odpowiedź, aby zmienić swoje świadectwo wolnej burty do tego:

X509Certificate2 cert = new X509Certificate2(file, password, X509KeyStorageFlags.MachineKeySet); 

Kluczem byt, który ostatni parametr, który mówi certyfikat, aby zapisać klucz prywatny zapisany w lokalizacji urządzenia, a nie od lokalizacji użytkownika. Następnie komenda netsh może znaleźć klucz prywatny i może działać.

Rozwiązanie zostało znalezione w tekście wyjaśniającym przez Paul Stovell i niektóre kopanie, aby zobaczyć, jak mogę ustawić tę flagę podczas ładowania certyfikatu do sklepu.

Teraz, dlaczego nie mogę zrobić programowo funkcja netsh to inna sprawa ...

0

Myślę, że to naprawiłem.

wystąpił problem z plikiem .pfx, który próbowałem zainstalować. Nie mam pojęcia dlaczego.co to ustalone dla mnie eksportowała świadectwo pracy z mojego osobistego sklepu z wszystkie opcje ustawione na true, a następnie uruchomić go w następujących przypadkach:

public static bool ServiceInstall(string serviceName, string serviceDescription, string executablePath) 
    { 
     try 
     { 
      ServiceProcessInstaller ProcesServiceInstaller = new ServiceProcessInstaller(); 
      ProcesServiceInstaller.Account = ServiceAccount.LocalSystem; 

      ServiceInstaller ServiceInstallerObj = new ServiceInstaller(); 
      InstallContext Context = new System.Configuration.Install.InstallContext(); 
      String path = String.Format("/assemblypath={0}", executablePath); 
      String[] cmdline = { path }; 

      Context = new System.Configuration.Install.InstallContext("", cmdline); 
      ServiceInstallerObj.Context = Context; 
      ServiceInstallerObj.DisplayName = serviceName; 
      ServiceInstallerObj.Description = serviceDescription; 
      ServiceInstallerObj.ServiceName = serviceName; 
      ServiceInstallerObj.StartType = ServiceStartMode.Automatic; 
      ServiceInstallerObj.Parent = ProcesServiceInstaller; 

      System.Collections.Specialized.ListDictionary state = new System.Collections.Specialized.ListDictionary(); 
      ServiceInstallerObj.Install(state); 
      return true; 
     } 
     catch 
     { 
      return false; 
     } 

    } 

a następnie użyć tego pliku pfx

nie mam pojęcia dlaczego stary pfx działał z linii poleceń, ale nie działał z kodu.

HTH

+0

Wszystko zrobiłem to, że właśnie eksportowany certyfikat jako .pfx z kluczem prywatnym, i niż przy użyciu tego samego kodu (ale z nowo utworzonym certyfikatem) wszystko działało dobrze. – nemke

Powiązane problemy