CryptographicException 'Anahtar kümesi mevcut değil', yalnızca WCF aracılığıyla


157

X.509 sertifikası ile korunan bir üçüncü taraf web hizmetine çağrı yapan bazı kod var.

Kodu doğrudan ararsam (birim testi kullanarak) sorunsuz bir şekilde çalışır.

Konuşlandırıldığında, bu kod bir WCF Hizmeti aracılığıyla çağrılır. WCF Hizmeti'ni çağıran ikinci bir birim sınama ekledim, ancak üçüncü taraf web hizmetinde bir yöntemi çağırdığımda bu bir CryptographicException, iletisi ile başarısız oluyor "Keyset does not exist".

Bunun, WCF Hizmetimin üçüncü taraf web hizmetini kendime farklı bir kullanıcı kullanarak aramaya çalışacağını varsayıyorum.

Herkes bu konuda ek bir ışık tutabilir mi?

Yanıtlar:


168

Muhtemelen sertifikada bir izin sorunu olacaktır.

Birim testi yürütürken, kendi kullanıcı bağlamınız altında ( istemci sertifikasının bulunduğu mağazaya bağlı olarak ) bu sertifikanın özel anahtarına erişebilecek olanları yürüteceksiniz.

Ancak, WCF hizmetiniz IIS altında veya bir Windows Hizmeti olarak barındırılıyorsa, büyük olasılıkla bir hizmet hesabı (Ağ Hizmeti, Yerel Hizmet veya başka bir kısıtlanmış hesap) altında çalışacaktır.

Hizmet hesabının buna erişmesine izin vermek için özel anahtarda uygun izinleri ayarlamanız gerekir. MSDN ayrıntılara sahip


Calcs çalıştırmak bana tamamen farklı bir sorun için yardımcı oldu teşekkürler
John

3
Uygulamamı yönetici olarak çalıştırıyorum, sorun gitti.
derek

1
MSDN belgeleri ve listelenen adımlar için +1 , bir Web Uygulaması için bile geçerlidir
Naren

Sertifika güvenlik izinlerine "AĞ HİZMETİ" eklemek bunu benim için çözdü, teşekkürler!
OpMt

276

Bunun nedeni, IIS kullanıcısının sertifikanız için özel anahtara erişimi olmamasıdır. Bunu, aşağıdaki adımları izleyerek ayarlayabilirsiniz ...

  1. Başlat -> Çalıştır -> MMC
  2. Dosya -> Snapin Ekle / Kaldır
  3. Sertifika Ekini Ekleme
  4. Bilgisayar Hesabı'nı seçin, ardından İleri'ye basın
  5. Yerel Bilgisayar'ı (varsayılan) seçin, ardından Son'u tıklayın
  6. Sol panelde Konsol Kökü'nden Sertifikalar (Yerel Bilgisayar) -> Kişisel -> Sertifikalar'a gidin
  7. Sertifikanız büyük olasılıkla burada olacaktır.
  8. Sertifikanızı sağ tıklayın -> Tüm Görevler -> Özel Anahtarları Yönet
  9. Özel anahtar ayarlarınızı burada yapın.

1
Ortamım tuhaf yapılandırılmadıkça bunun Server 2003'te bir seçenek olmadığını belirtmek gerekir. Bunu Windows 7'de de yapabilirim.
Shawn Hubbard

burada set özel anahtar ile ne demek istiyorsun ?? Yani sadece erişim hakkına sahip kullanıcı ekleyebilirsiniz !?
mastervv

10
Teşekkürler, iis7.5 kullanırsanız ve uygulama havuzunun uygulama güvenliği olarak çalışırsa, dosyaya IIS AppPool \ DefaultAppPool kullanıcı izinlerini vermeniz gerektiğini belirtmek istedim. Bu benim için sorunu düzeltti.
Ronen Festinger

25
Benim için çalışması için IIS_IUSRS'e izin vermek zorunda kaldım.
TrueEddie

1
IIS express çalıştırırken bunu alıyorsanız, kendi giriş izinlerinizi vermeniz gerekir.
Jez

38

Dün gece aynı sorunu yaşadım. Özel anahtardaki izinler doğru ayarlandı, Anahtar Seti hatası dışında her şey yolundaydı. Sonunda sertifikanın önce geçerli kullanıcı deposuna alındığı ve ardından yerel makine deposuna taşındığı ortaya çıktı. Ancak, bu hala özel anahtarın

C: \ Belgeler ve anlaşmalar \ Yönetici ...

onun yerine

C: \ Belgeler ve anlaşmalar \ Tüm kullanıcılar ...

Anahtardaki izinler doğru bir şekilde ayarlanmasına rağmen, ASPNET buna erişemedi. Özel anahtarın Tüm kullanıcılar dalına yerleştirilmesi için sertifikayı yeniden içe aktardığımızda sorun ortadan kalktı.


Aynı sorun. Microsoft güvenlik bozosuna sığınma izni vermesine izin vermemelidir.
Paul Stovell

2
3 saat kaybettikten sonra bu sorunumu çözdü - Teşekkürler. FindPrivateKey örneğini kullandım ve MMC ek bileşeni aracılığıyla LocalMachine'de görünse bile neden kullanıcının anahtar deposunda göründüğünü karıştırdım.
Rob Potter

Sana her cevabın bana söylediği gibi izinlerle uğraştığım saatlerce bira satın alırdım.
Scott Scowden

Teşekkürler teşekkürler teşekkürler! Bu korkunç sorun sayesinde hayatımın yaklaşık 2,5 saatini kaybettim ve bunu görmeseydim 2.5 gününü kaybederdim.
Frank Tzanabetis

Aynı sorunu tersine de yaşadım. İlk önce Yerel Makineye, ardından Geçerli Kullanıcıya kurulur. Her iki mağazadan tüm sertifikaları kaldırmak ve Geçerli Kullanıcı altında yeniden yüklemek sorunu düzeltti.
Bart Verkoeijen

24

IIS'den göz atarken “Tuş takımı yok” u çözmek için: Özel izin için olabilir

İzlemek ve izin vermek için:

  1. Çalıştır> mmc> evet
  2. dosyaya tıkla
  3. Ek bileşen ekle / kaldır'ı tıklayın…
  4. Sertifikaya çift tıklayın
  5. Bilgisayar Hesabı
  6. Sonraki
  7. Bitiş
  8. Tamam
  9. Sertifikalara tıklayın (Yerel Bilgisayar)
  10. Kişisel tıklayın
  11. Tıklama Sertifikaları

İzin vermek için:

  1. Sertifika adına sağ tıklayın
  2. Tüm Görevler> Özel Anahtarları Yönet…
  3. Ayrıcalık ekleyin ve verin (IIS_IUSRS ekleyerek ayrıcalığın benim için çalışmasına izin verin)

1
Bir uygulama havuzu altında çalışıyorsanız, bu kullanıcıyı "IIS AppPool \ DefaultAppPool" yerine ekleyin
Sameer Alibhai

Bu da bana yardımcı oldu. IIS_IUSRS izinlerini verir vermez çalışmaya başladı.
Andrej Mohar

18

Visual Studio'dan WCF uygulamasını çalıştırmaya çalışırken aynı sorunu vardı. Visual Studio'yu yönetici olarak çalıştırarak çözdüm.


11

Bu sorunla karşı karşıya kaldım, sertifikalarım nerede özel anahtara sahip ama bu hatayı alıyordum ( " Tuş takımı yok" )

Neden: Web siteniz "Ağ hizmetleri" hesabı altında çalışıyor veya daha az ayrıcalığa sahip.

Çözüm : Uygulama havuzu kimliğini "Yerel Sistem" olarak değiştirin, IIS'yi sıfırlayın ve tekrar kontrol edin. Çalışmaya başlarsa izin / Daha az ayrıcalık sorunudur, başka hesapları kullanarak da kimliğe bürünebilirsiniz.


8

Tamamen sinir bozucu, aynı sorunu vardı ve yukarıdakilerin çoğunu denedim. Dışa aktarılan sertifikanın dosyayı doğru okuma izni vardı C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys, ancak ortaya çıktığı gibi klasörde izni yoktu. Ekledi ve işe yaradı


Bu sorunu çözmek için çok şey denedim, ama bu hile yaptı!
Gyum Fox

vay - çalışmak için beklemiyordum ama yaptı. Eklediğim IISAPPPool\www.mywebsite.compencereler benim appool için kullanıcı adı olan ve :-) çalıştı
Simon_Weaver

bunun neden işe yaradığını bilen var mı? bir şey bozuk çünkü bu oldukça belirsiz
Simon_Weaver

Bunu yapma! Sunucu, RSRS \ MachineKeys klasörünün temel izinleri değiştiğinde, sertifikaların içe aktarıldığı ve "Microsoft Software KSP" sağlayıcı türüyle gösterildiği "kötü duruma" girer. Daha fazla bilgi reddit.com/r/sysadmin/comments/339ogk/… .
Dhanuka777

3

Benim de benzer bir sorunum var. Komutu kullandım

findprivatekey root localmachine -n "CN="CertName" 

sonuç, özel anahtarın C: \ Documents and settngs \ Tüm kullanıcılar yerine c: \ ProgramData klasöründe olduğunu gösterir.

Anahtarı c: \ ProgramData klasöründen sildiğimde tekrar findPrivatekey komutunu çalıştırmayı başaramaz. yani. anahtarı bulamaz.

Ancak, önceki komutla döndürülen aynı anahtarı ararsam, anahtarı yine de bulabilirim

C: \ Belgeler ve anlaşmalar \ Tüm kullanıcılar ..

Anladığım kadarıyla, IIS veya barındırılan WCF, C: \ Documents and settngs \ All users özel anahtarını bulamıyor.


2
Merhaba bu bağlantı size bu sorunu nasıl çözeceğinizi ve findprivatekey aracını nasıl bulacağınızı söyleyecektir : blogs.msdn.microsoft.com/dsnotes/2015/08/13/…
Tahir Khalid

3

Hata alıyordum: MVC uygulamasını çalıştırdığımda 'CryptographicException' Keyset yok '.

Çözüm şuydu: uygulama havuzunun altında çalıştığı hesaba kişisel sertifikalara erişim vermek. Benim durumumda IIS_IUSRS eklemek ve doğru konumu seçmek bu sorunu çözdü.

RC on the Certificate - > All tasks -> Manage Private Keys -> Add->  
For the From this location : Click on Locations and make sure to select the Server name. 
In the Enter the object names to select : IIS_IUSRS and click ok. 

2

Steve Sheldon'ın cevabı benim için sorunu düzeltti, ancak sertifika izinlerini bir GUI ile komut dosyası yazarken, komut dosyasılanabilir bir çözüme ihtiyacım vardı. Özel anahtarımın nerede saklandığını bulmak için mücadele ettim. Özel anahtar değildi -C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys, sonunda aslında olduğunu gördüm C:\ProgramData\Microsoft\Crypto\Keys. Aşağıda bunu nasıl öğrendiğimi açıklıyorum:

Denedim FindPrivateKeyama özel anahtarı bulamadı ve powershell kullanarak$cert.privatekey.cspkeycontainerinfo.uniquekeycontainername boş / boş.

Neyse ki, certutil -store mysertifikayı listeledi ve bana çözümü kodlamak için ihtiyacım olan ayrıntıları verdi.

================ Certificate 1 ================ Serial Number: 162f1b54fe78c7c8fa9df09 Issuer: CN=*.internal.xxxxxxx.net NotBefore: 23/08/2019 14:04 NotAfter: 23/02/2020 14:24 Subject: CN=*.xxxxxxxnet Signature matches Public Key Root Certificate: Subject matches Issuer Cert Hash(sha1): xxxxa5f0e9f0ac8b7dd634xx Key Container = {407EC7EF-8701-42BF-993F-CDEF8328DD} Unique container name: 8787033f8ccb5836115b87acb_ca96c65a-4b42-a145-eee62128a ##* ^-- filename for private key*## Provider = Microsoft Software Key Storage Provider Private key is NOT plain text exportable Encryption test passed CertUtil: -store command completed successfully.

Daha sonra c\ProgramData\Microsoft\Crypto\klasörü taradım ve C: \ ProgramData \ Microsoft \ Crypto \ Keys içinde 8787033f8ccb5836115b87acb_ca96c65a-4b42-a145-eee62128a dosyasını buldum .

Hizmet hesabımı okumaya bu dosyaya erişim izni vermek benim için sorunları düzeltti


1
"Certutil -store my" kullanmak sorunumu çözmek için anahtardı. Dosyayı bulmak için "Benzersiz kapsayıcı adı" ve sertifika dosyasındaki "Erişim Reddedildi" hatasını gidermek için Sysinternals İşlem İzleyicisi'ni kullandım. Benim durumumda NT Authority \ IUSR kullanıcısı için sertifika dosyasına okuma erişimi sağlamak zorunda kaldım.
hsop

1

Internet'teki örneklerden oluşturulan tüm anahtarlara izin verilmesine rağmen çalışmaya devam ettiğim "Keyset yok" mesaj iletisiyle WCF hizmetimi almama yardımcı olan bazı eksik bilgiler buldum.

Sonunda özel anahtarı yerel makinedeki güvenilir kişiler deposuna aldım ve sonra özel anahtara doğru izinleri verdim.

Bu benim için boşlukları doldurdu ve sonunda WCF hizmetini Mesaj düzeyinde güvenlikle uygulamama izin verdi. HIPPA uyumlu olması gereken bir WCF inşa ediyorum.


1

Sertifikamı yerel makineye yeniden yükledim ve sonra iyi çalışıyor


0

Uygulama havuzunuz için ApplicationPoolIdentity kullanıyorsanız, kayıt defteri düzenleyicisinde o "sanal" kullanıcı için izin belirtme konusunda sorun yaşayabilirsiniz (sistemde böyle bir kullanıcı yoktur).

Bu nedenle, set kayıt defteri ACL'lerini veya bunun gibi bir şeyi ayarlamayı sağlayan subinacl - komut satırı aracını kullanın .


0

Ben sadece akıl sağlığı kontrol yanıtı eklemek istedim. Sertifikaları makinelerimdeki doğru mağazalara yükledikten ve istemci için tüm doğru güvenlik ayrıcalıklarına sahip olduktan sonra bile aynı hatayı alıyordum. Müşteri sertifikamı ve Servis Sertifikamı karıştırdım. Yukarıdakilerin tümünü denediyseniz, bu iki düze sahip olup olmadığınızı iki kez kontrol ederim. Bunu yaptıktan sonra, uygulamam başarıyla web hizmetini aradı. Yine, sadece bir akıl sağlığı denetleyicisi.


0

IIS7'de openAM Fedlet'i kullanırken bu hatayı aldı

Varsayılan web sitesi için kullanıcı hesabını değiştirmek sorunu çözdü. İdeal olarak, bunun bir hizmet hesabı olmasını istersiniz. Belki de IUSR hesabı bile. IIS'yi sertleştirmek için tamamen çivilemek için yöntemler aramanızı öneririz.


0

Anahtar kasamızın kimlik doğrulamasında kullanılan sertifika sona erdikten ve döndürüldükten sonra servis kumaş projemde bunu başardım, bu da parmak izini değiştirdi. Bu hatayı aldım çünkü diğer blokların önerdiği tam olarak bu blokta applicationManifest.xml dosyasındaki parmak izini güncellemeyi kaçırmıştım - (tüm exes'im azure servicefabric küme için standart yapılandırma olarak çalışıyor) izinlerine LOCALMACHINE \ MY cert store konumuna erişin.

"X509FindValue" öznitelik değerini not alın.

<!-- this block added to allow low priv processes (such as service fabric processes) that run as NETWORK SERVICE to read certificates from the store -->
  <Principals>
    <Users>
      <User Name="NetworkService" AccountType="NetworkService" />
    </Users>
  </Principals>
  <Policies>
    <SecurityAccessPolicies>
      <SecurityAccessPolicy ResourceRef="AzureKeyvaultClientCertificate" PrincipalRef="NetworkService" GrantRights="Full" ResourceType="Certificate" />
    </SecurityAccessPolicies>
  </Policies>
  <Certificates>
    <SecretsCertificate X509FindValue="[[THIS KEY ALSO NEEDS TO BE UPDATED]]" Name="AzureKeyvaultClientCertificate" />
  </Certificates>
  <!-- end block -->


0

Benim için çalışılan tek çözüm bu.

    // creates the CspParameters object and sets the key container name used to store the RSA key pair
    CspParameters cp = new CspParameters();
    cp.KeyContainerName = "MyKeyContainerName"; //Eg: Friendly name

    // instantiates the rsa instance accessing the key container MyKeyContainerName
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);
    // add the below line to delete the key entry in MyKeyContainerName
    // rsa.PersistKeyInCsp = false;

    //writes out the current key pair used in the rsa instance
    Console.WriteLine("Key is : \n" + rsa.ToXmlString(true));

Referans 1

Referans 2


0
This issue is got resolved after adding network service role.

CERTIFICATE ISSUES 
Error :Keyset does not exist means System might not have access to private key
Error :Enveloped data  
Step 1:Install certificate in local machine not in current user store
Step 2:Run certificate manager
Step 3:Find your certificate in the local machine tab and right click manage privatekey and check in allowed personnel following have been added:
a>Administrators
b>yourself
c>'Network service'
And then provide respective permissions.

## You need to add 'Network Service' and then it will start working.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.