Pytanie IIS 7.x, dodanie strony obsługującej HTTPS: SiteCollection.Add (ciąg, łańcuch, ciąg, bajt []) Przeciążenie


Muszę programowo dodać stronę IIS 7.x i utknąłem, gdy powinno to być domyślnie utworzone za pomocą powiązania HTTPS / SSL, usig SiteCollection.Add (przeciążenie łańcucha, ciągu, ciągu znaków, bajtu []).

Dający https:*:80:test.localhost  https:*:443:test.localhost tak jak bindingInformation zgłasza wyjątek ArgumentException z tym komunikatem: Określone powiązanie HTTPS jest nieprawidłowe.

Co jest złego w tej wiążącej informacji?

Dziękuję Ci.

EDYTOWAĆ: Korzystam z zestawu Microsoft.Web.Administration.


10
2018-02-03 12:32


pochodzenie


Zły port (443)? Brakujący certyfikat? - CodeZombie
@ZombieHunter Nie ma brakującego certyfikatu, poprawnie ładuję go, mam tablicę bajtów. Port ... Mmmm, dobra hahaha - Matías Fidemraizer
@ZombieHunter Bez powodzenia, to nie port. - Matías Fidemraizer
Zgadnij: Twój certyfikat wydano dla "test.localhost"? - CodeZombie
@ZombieHunter Jest dla localhost "jak jest" - Matías Fidemraizer


Odpowiedzi:


Oto, co zrobiłem, aby stworzyć stronę https i zadziałało. Oczywiście pomijam niektóre części kodu.

using Microsoft.Web.Administration
...
using(var manager = new ServerManager())
{
    // variables are set in advance...
    var site = manager.Sites.Add(siteName, siteFolder, siteConfig.Port);

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

    // certHash is my certificate's hash, byte[]
    var binding = site.Bindings.Add("*:443:", certHash, store.Name);
    binding.Protocol = "https";

    store.Close();

    site.ApplicationDefaults.EnabledProtocols = "http,https";

    manager.CommitChanges();
}

UPD: certyfikat jest tworzony z pliku pfx w następujący sposób:

// get certificate from the file
string pfx = Directory.GetFiles(folder, "*.pfx", SearchOption.AllDirectories).FirstOrDefault();
var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite);

var certificate = new X509Certificate2(pfx, certPassword, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
store.Add(certificate);
store.Close();
certHash = certificate.GetCertHash();

15
2018-02-03 13:17



Wydaje się, że jest to droga, ale kiedy zatwierdzam zmiany, generuje wyjątek UnauthorizedAccessException i nie ma opisu. Czy spotkałeś się również z tym problemem? - Matías Fidemraizer
Aby administrować iis, musisz mieć uprawnienia administracyjne i pracować z autologicznym magazynem certyfikatów głównych. - ElDog
To nie jest świetna srebrna kula, ale dałeś mi dobrą wskazówkę, a teraz działa dobrze. Dziękuję Ci bardzo! - Matías Fidemraizer
W jaki sposób uzyskujesz wartość dla certHash? - Jason Jackson
Jeśli inna poddomena w tej samej lokacji używa już tego samego certyfikatu (* .yourdomain.com), możesz pożyczyć certyfikat certHash i storeName. Nie trzeba ładować certyfikatu z pliku. - Jeroen K


O ile widzę BindingInformation jest bez protokołu:

Wartością tej właściwości jest łańcuch rozdzielany dwukropkami, który zawiera   adres IP, port i nazwę hosta powiązania.

Źródło: http://msdn.microsoft.com/en-us/library/microsoft.web.administration.binding.bindinginformation%28v=vs.90%29.aspx

Istnieje również przeciążenie, które przyjmuje parametr BindingProtocol:

public Site Add(
    string name,
    string bindingProtocol,
    string bindingInformation,
    string physicalPath
)

Źródło: http://msdn.microsoft.com/en-us/library/bb359364%28v=vs.90%29.aspx

Może powinieneś użyć obiektu Binding oferowanego przez instancję Site, ponieważ oferuje więcej ustawień niż instancja SiteCollection.


1
2018-02-03 13:07



Dzięki za twój wysiłek. Nawiasem mówiąc, dałem link do dokumentu przeładowania w MSDN, a jeśli sprawdzasz uwagi, przekonasz się, że to przeciążenie obsługuje protokół w informacji o wiązaniu. Na drugim miejscu starałem się zrobić inaczej, jak twoja sugestia z takim samym skutkiem. - Matías Fidemraizer
NP. Cieszę się, że znalazłeś działające rozwiązanie :-) - CodeZombie