2010-12-21 8 views
12

Mam certyfikat .pem dla SSL, chcę go rozpowszechnić z moją aplikacją WWW w MSI (musi działać na komputerach klientów). Następnie muszę go zaimportować (do jakiegoś sklepu z danymi uwierzytelniającymi?) I poinformować o powiązaniach z witryną, aby go użyć. Ale jak mogę to zrobić w kodzie? Odkryłem Microsoft.Web.Administration, ale nie wiem, skąd się tam udać ...Programatycznie zaimportować certyfikat do IIS?

To jest w IIS7 btw.

EDYCJA: Celem jest tutaj aplikacja internetowa, którą klienci mogą uruchamiać w swoich intranetach. Działa głównie jako API dla aplikacji na iPhone'a. (Może to nie jest najlepszy projekt, ale teraz jesteśmy zablokowani.) Klient instaluje MSI, a voila ma serwis internetowy. Teraz musi istnieć uwierzytelnianie hasła między iPhonem a usługą sieciową; najprostszym sposobem było zrobienie tego w https. Zrobiłem więc samopodpisany certyfikat.

Jestem świadomy, że redystrybucja jednego certyfikatu jest generalnie złym pomysłem, ale próbujemy po prostu pokonać zwykłych hakerów tutaj ... to będzie tylko intranet i tylko dla firm, wydaje się mało prawdopodobne, że ktokolwiek się pojawi robić coś zbyt szalonego, a interfejs API surowo ogranicza ilość złych rzeczy, które i tak można zrobić w bazie danych.

Wychodzimy, celem jest uwierzytelnienie hasłem w intranetowej aplikacji internetowej za pomocą instalacji jednym kliknięciem (ish). :-D

+0

ciekawy problem, ale czy naprawdę chcesz być ponownie przy użyciu certyfikatu SSL? Nawet jeśli jest to naciśnięcie przycisku dla ogromnego klastra obsługującego własną aplikację internetową, prawdopodobnie chcesz być bardziej ostrożny przy korzystaniu z certyfikatów. – Rup

+0

Należy pamiętać, że tryb "człowiek w środku" jest nadal możliwy z samopodpisanym certyfikatem, chyba że wszystkie telefony klienckie mają ten certyfikat wstępnie zainstalowany w zaufanych magazynach głównych certyfikatów, zanim skontaktują się z interfejsem API. – yfeldblum

Odpowiedz

22

odpowiedź, drodzy czytelnicy, to:

// Assume 'site' is already set to your site via something like 
// Site site = mgr.Sites.Add(siteName, directory, 443); 

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite); 

// Here, directory is my install dir, and (directory)\bin\certificate.pfx is where the cert file is. 
// 1234 is the password to the certfile (exported from IIS) 
X509Certificate2 certificate = new X509Certificate2(directory + @"\bin\certificate.pfx", "1234"); 

store.Add(certificate); 

var binding = site.Bindings.Add("*:443:", certificate.GetCertHash(), store.Name); 
binding.Protocol = "https"; 
store.Close(); 

Dzięki tej losowej wątku: http://forums.iis.net/t/1163325.aspx

+4

Nie zapomnij zadzwonić do mgr.CommitChanges(). –

2

Musisz zawęzić swoje pytanie. Do czego służy certyfikat (dokładnie)?

Jeśli twój certyfikat służy do uwierzytelniania po stronie klienta (w celu uwierzytelnienia klienta na serwerze), dystrybucja go z twoją aplikacją sprawia, że ​​takie uwierzytelnienie jest bezużyteczne, ponieważ ujawniałbyś tajny klucz.

Jeśli musisz zweryfikować certyfikat serwera (i otrzymałeś certyfikat serwera lub łańcuch certyfikatów w pliku PEM), może to zadziałać, ale dlaczego musisz zainstalować certyfikat w magazynie certyfikatów?

Należy zauważyć, że format PEM nie jest natywnie obsługiwany przez biblioteki systemu Windows lub .NET, dlatego przed wdrożeniem należy przekonwertować go na format PFX, a następnie zaimportować PFX lub po prostu utworzyć w pamięci w oparciu o PFX (znaleźć mnóstwo informacji, szukając PFX lub PKCS # 12 na StackOVerflow).

Aktualizacja: lepszym rozwiązaniem byłoby generowanie certyfikatu przy każdym zainstalowaniu aplikacji i umożliwienie użytkownikowi posiadania własnego certyfikatu (np. Możliwe jest, że mają już ważny certyfikat dla swojej strony internetowej).

+0

Przepraszam, dwukrotność niejasności;) Edytowane powyżej. – Dave

+0

@Dave aktualizacja dodana do mojej odpowiedzi –

+0

Hmm dobry punkt; chociaż domyślam się, że zawsze utkniesz w tym oknie dialogowym potwierdzającym autentyczność podpisu w przeglądarce? Jestem za tym podejściem ... ale jak mam to zrobić w kodzie?(Jestem programistą programowania systemu Windows :-D) EDYCJA: Pomysł polega na tym, że ludzie instalujący to oprogramowanie nie znają komputerów, więc gdyby to było wszystko zautomatyzowane, byłoby najlepiej. – Dave