2009-05-01 16 views
12

Próbuję użyć klasy HttpListener w aplikacji C#, aby mieć mini serwer dostarczający treści przez SSL. W tym celu potrzebuję użyć narzędzia httpcfg. Mam plik .pfx z moją parą kluczy publicznych i prywatnych. Jeśli zaimportuję tę parę kluczy ręcznie, używając mmc do lokalnego magazynu maszynowego, wszystko działa poprawnie. Jeśli jednak zaimportuję tę parę kluczy programowo przy użyciu klasy X509Store, nie będę mógł połączyć się z moim miniserwerem. Zauważ, że w obu metod certyfikat jest importowany do sklepu MY w LocalMachine. Dziwnie, jestem w stanie wyświetlić certyfikat w mmc, gdy programowo go zaimportuję, a kiedy go zobaczę, interfejs wskazuje, że klucz prywatny jest również dostępny dla tego certyfikatu.Zaimportuj certyfikat z kluczem prywatnym programowo

Kopiąc trochę głębiej, zauważam, że po ręcznym zaimportowaniu pary kluczy, widzę nowy plik pojawiający się w C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys, ale nie pojawia się, gdy importuję programowo. W powiązanej notatce, gdy usuwam ręcznie zaimportowany certyfikat, nie usuwa on odpowiedniego pliku klucza prywatnego z wcześniej wspomnianego katalogu.

W końcu moje pytanie brzmi następująco: Kiedy programowo dodaję certyfikat do sklepu, gdzie przechowywany jest klucz prywatny i dlaczego nie jest on dostępny dla klasy HttpListener (HttpApi)?

Należy zauważyć, że kwestia ta jest nieco podobne, ale nie sądzę Permissioning jest problem, ponieważ to wszystko jest robione jako ten sam użytkownik systemu Windows: How to set read permission on the private key file of X.509 certificate from .NET

Odpowiedz

28

Ok, wymyśliłem to. Miało to związek z kluczowymi parametrami przechowywania obiektu certyfikatu. Dla każdego, kto napotka na ten problem, upewnij się, że tworzysz obiekty X509Certificate2, które dodajesz do sklepu za pomocą flag flag X509KeyStorageFlags.PersistKeySet i X509KeyStorageFlags.MachineKeySet. Spowoduje to utrwalenie klucza prywatnego w lokalizacji zestawu kluczy maszynowych, która jest wymagana przez HttpApi (HttpListener).

+0

Proszę oznaczyć to jako odpowiedź – Developer

+0

Niestety muszę poczekać 48 godzin, zanim będę mógł to zrobić, w którym momencie prawdopodobnie zapomnę to zrobić. :( – Jason

+6

Zmarnowałem około 30 minut, próbując zrozumieć, dlaczego "X509KeyStorageFlags.MachineKeySet & X509KeyStorageFlags.PersistKeySet" nie działa. Oczywiście powinno to być "X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet." Jest to dość oczywiste, na wypadek gdyby ktoś inny próbuje tego samego głupiego co zrobiłem –

0

Czy ten 2 sposób SSL? Jeśli tak, to czy wysłałeś plik żądania certyfikatu SSL wygenerowany na twoim komputerze? Ten plik z żądaniem certyfikatu zostanie użyty do utworzenia SSL i razem tworzą parę publicznych kluczy prywatnych.

Czy próbowałeś również nadać uprawnienia do certyfikatu dla konta użytkownika, które jest używane do uruchamiania aplikacji internetowej? Możesz to zrobić za pomocą narzędzia Microsoft GPW 3.0.

+0

Po prostu używam pary kluczy generowanych samodzielnie do testowania w tej chwili, więc jest to żądanie certyfikatu. Nie grałem jeszcze z żadnymi uprawnieniami, ponieważ wszystko to odbywa się jako ten sam użytkownik (import certyfikatu i uruchomienie serwera). Nie ma żadnych usług IIS ani niczego innego. – Jason

+0

Powinno być napisane "nie ma żadnego żądania certyfikatu". – Jason

0

Niezupełnie odpowiedź na swoje pytanie, ale tutaj w celach innych, wykraczających tą drogą:

Here jest link do MS czat, który daje próbkę kodu C#, aby robić to, co httpcfg robi, eliminując tym samym potrzebę dla narzędzia podczas wdrażania.

+0

Dzięki, to dobry link.Przejrzałem to krótko, ale chodzi tylko o to, jak korzystać ze struktury URLACL_SET, a nie z SSL_SET, która jest potrzebna do zarządzania konfiguracją SSL w moim scenariuszu. Niestety, struktura SSL_SET jest nieco bardziej złożona, więc stało się po prostu niewygodne w obsłudze, a plik wykonywalny httpcfg był wygodniejszy. – Jason

Powiązane problemy