Mam kod, który wywołuje usługę internetową innej firmy, która jest zabezpieczona certyfikatem X.509.
Jeśli zadzwonię bezpośrednio do kodu (za pomocą testu jednostkowego), działa to bez żadnych problemów.
Po wdrożeniu ten kod zostanie wywołany za pośrednictwem usługi WCF. Dodałem drugi test jednostkowy, który wywołuje usługę WCF, jednak kończy się to niepowodzeniem z CryptographicException
komunikatem, "Keyset does not exist"
gdy wywołuję metodę w usłudze sieci Web innej firmy.
Zakładam, że dzieje się tak, ponieważ moja usługa WCF będzie próbowała wywołać usługę sieci Web innej firmy przy użyciu innego użytkownika.
Czy ktoś może rzucić dodatkowe światło na tę kwestię?
Jest to najprawdopodobniej spowodowane tym, że użytkownik usług IIS nie ma dostępu do klucza prywatnego Twojego certyfikatu. Możesz to ustawić, wykonując następujące kroki ...
źródło
Miałem identyczny problem zeszłej nocy. Uprawnienia do klucza prywatnego zostały ustawione poprawnie, wszystko było w porządku, z wyjątkiem błędu Keyset nie istnieje. Ostatecznie okazało się, że certyfikat został najpierw zaimportowany do bieżącego magazynu użytkowników, a następnie przeniesiony do lokalnego magazynu maszynowego. Jednak - to nie spowodowało przeniesienia klucza prywatnego, który nadal znajdował się w
C: \ Documents and settings \ Administrator ...
zamiast
C: \ Dokumenty i ustawienia \ Wszyscy użytkownicy ...
Mimo że uprawnienia do klucza zostały ustawione poprawnie, ASPNET nie mógł uzyskać do niego dostępu. Gdy ponownie zaimportowaliśmy certyfikat, aby klucz prywatny został umieszczony w gałęzi Wszyscy użytkownicy, problem zniknął.
źródło
Aby rozwiązać problem „Zestaw kluczy nie istnieje” podczas przeglądania z poziomu usług IIS: Może to być za pozwoleniem prywatnym
Aby wyświetlić i przyznać uprawnienia:
Aby udzielić pozwolenia:
źródło
Wystąpił ten sam problem podczas próby uruchomienia aplikacji WCF z programu Visual Studio. Rozwiązałem to, uruchamiając Visual Studio jako administrator.
źródło
Napotkałem ten problem, moje certyfikaty miały klucz prywatny, ale otrzymywałem ten błąd ( „Zestaw kluczy nie istnieje” )
Przyczyna: Twoja witryna internetowa działa na koncie „Usługi sieciowe” lub ma mniejsze uprawnienia.
Rozwiązanie : Zmień tożsamość puli aplikacji na „System lokalny”, zresetuj usługi IIS i sprawdź ponownie. Jeśli zacznie działać, jest to problem z uprawnieniami / mniejszymi uprawnieniami, możesz podszywać się pod inne konta, a następnie używać innych kont.
źródło
Całkowicie frustrujące, miałem ten sam problem i próbowałem większości z powyższych. Wyeksportowany certyfikat poprawnie miał uprawnienia do odczytu pliku
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
, jednak okazuje się, że nie ma uprawnień do folderu. Dodałem i zadziałałoźródło
IISAPPPool\www.mywebsite.com
która jest nazwą użytkownika Windows dla mojego appoola i zadziałało :-)Ja też mam dokładnie podobny problem. Użyłem polecenia
wynik pokazuje, że klucz prywatny znajduje się w folderze c: \ ProgramData zamiast C: \ Documents and settings \ All users ..
Kiedy usuwam klucz z folderu c: \ ProgramData, ponownie uruchamiam polecenie findPrivatekey nie powiedzie się. to znaczy. nie znajduje klucza.
Ale jeśli wyszukam ten sam klucz zwrócony przez wcześniejsze polecenie, nadal mogę znaleźć klucz w
C: \ Dokumenty i ustawienia \ Wszyscy użytkownicy ..
Tak więc, zgodnie z moim zrozumieniem, usługi IIS lub hostowane WCF nie znajdują klucza prywatnego z C: \ Documents and settings \ All users ...
źródło
Otrzymałem błąd: CryptographicException „Keyset nie istnieje”, kiedy uruchamiam aplikację MVC.
Rozwiązanie było następujące: aby przyznać dostęp do certyfikatów osobistych kontu, na którym działa pula aplikacji. W moim przypadku było to dodanie IIS_IUSRS i wybranie odpowiedniej lokalizacji rozwiązało ten problem.
źródło
Odpowiedź Steve'a Sheldona rozwiązała problem za mnie, jednak ponieważ piszę uprawnienia certyfikatów w skryptach bez interfejsu GUI, potrzebowałem rozwiązania skryptowego. Starałem się znaleźć miejsce przechowywania mojego klucza prywatnego. Nie było klucza prywatnego
-C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
, w końcu odkryłem, że faktycznie byłC:\ProgramData\Microsoft\Crypto\Keys
. Poniżej opisuję, jak się tego dowiedziałem:Próbowałem,
FindPrivateKey
ale nie udało mi się znaleźć klucza prywatnego, a przy użyciu programu PowerShell$cert.privatekey.cspkeycontainerinfo.uniquekeycontainername
był pusty / pusty.Na szczęście
certutil -store my
wymieniłem certyfikat i podałem szczegóły potrzebne do napisania scenariusza rozwiązania.Następnie przeskanowałem
c\ProgramData\Microsoft\Crypto\
folder i znalazłem plik 8787033f8ccb5836115b87acb_ca96c65a-4b42-a145-eee62128a w C: \ ProgramData \ Microsoft \ Crypto \ Keys .Przyznanie mojemu kontu usługi dostępu do odczytu tego pliku rozwiązało problemy
źródło
Znalazłem brakujące informacje, które pomogły mi w uzyskaniu mojej usługi WCF z zabezpieczeniami na poziomie wiadomości poza „Zestaw kluczy nie istnieje”, na który natrafiłem pomimo przyznania uprawnień do wszystkich kluczy wygenerowanych na podstawie przykładów w Internecie.
W końcu zaimportowałem klucz prywatny do magazynu zaufanych osób na komputerze lokalnym, a następnie nadałem kluczowi prywatnemu odpowiednie uprawnienia.
To wypełniło dla mnie puste miejsca i ostatecznie pozwoliło mi zaimplementować usługę WCF z zabezpieczeniami na poziomie wiadomości. Buduję WCF, który musi być zgodny z HIPPA.
źródło
Właśnie ponownie zainstalowałem certyfikat na komputerze lokalnym i wszystko działa poprawnie
źródło
Jeśli używasz ApplicationPoolIdentity dla swojej puli aplikacji, możesz mieć problem z określeniem uprawnień dla tego „wirtualnego” użytkownika w edytorze rejestru (nie ma takiego użytkownika w systemie).
Więc użyj subinacl - narzędzia wiersza poleceń, które umożliwia ustawienie listy ACL rejestru lub czegoś podobnego.
źródło
Chciałem tylko dodać odpowiedź sprawdzającą poczytalność. Otrzymałem dokładnie ten sam błąd, nawet po zainstalowaniu certyfikatów we właściwych sklepach na moich komputerach i posiadaniu wszystkich odpowiednich uprawnień bezpieczeństwa dla klienta. Okazuje się, że pomyliłem certyfikat klienta i certyfikat usługi. Jeśli wypróbowałeś wszystkie powyższe, dwukrotnie sprawdziłbym, czy masz te dwa proste. Kiedy to zrobiłem, moja aplikacja pomyślnie wywołała usługę sieciową. Ponownie, tylko test poczytalności.
źródło
Otrzymałem ten błąd podczas używania openAM Fedlet w IIS7
Zmiana konta użytkownika dla domyślnej witryny sieci Web rozwiązała problem. Idealnie byłoby, gdyby było to konto usługi. Może nawet konto IUSR. Zasugeruj wyszukanie metod utwardzania usług IIS, aby całkowicie je ustalić.
źródło
Udało mi się to w moim projekcie sieci szkieletowej usług po tym, jak certyfikat używany do uwierzytelniania w naszym magazynie kluczy wygasł i został obrócony, co zmieniło odcisk palca. Otrzymałem ten błąd, ponieważ przegapiłem aktualizację odcisku palca w pliku applicationManifest.xml w tym bloku, co dokładnie robi to, co sugerowały inne odpowiedzi - do danej USŁUGI SIECIOWEJ (którą wszystkie moje exes działają jako standardowa konfiguracja dla klastra Azure servicefabric) do uzyskać dostęp do lokalizacji magazynu LOCALMACHINE \ MY cert.
Zwróć uwagę na wartość atrybutu „X509FindValue”.
źródło
To jedyne rozwiązanie, które u mnie zadziałało.
Odniesienie 1
Odniesienie 2
źródło
źródło