CryptographicException 'Keyset tidak ada', tetapi hanya melalui WCF

157

Saya memiliki beberapa kode yang membuat panggilan ke layanan web pihak ketiga yang dijamin menggunakan sertifikasi X.509.

Jika saya memanggil kode secara langsung (menggunakan unit test) itu berfungsi tanpa masalah.

Ketika digunakan, kode ini akan dipanggil melalui Layanan WCF. Saya telah menambahkan tes unit kedua yang memanggil Layanan WCF, namun ini gagal dengan CryptographicExceptionpesan, "Keyset does not exist"ketika saya memanggil metode pada layanan web pihak ketiga.

Saya berasumsi bahwa ini karena Layanan WCF saya akan berusaha memanggil layanan web pihak ketiga menggunakan pengguna yang berbeda untuk saya sendiri.

Adakah yang bisa menjelaskan lebih lanjut tentang masalah ini?

Richard Ev
sumber

Jawaban:

168

Mungkin akan menjadi masalah izin pada sertifikat.

Saat menjalankan tes unit, Anda akan mengeksekusi mereka yang berada di bawah konteks pengguna Anda sendiri, yang (tergantung pada tempat penyimpanan sertifikat klien ) akan memiliki akses ke kunci pribadi sertifikat itu.

Namun jika layanan WCF Anda di-hosting di bawah IIS, atau sebagai Layanan Windows, kemungkinan layanan itu akan berjalan di bawah akun layanan (Layanan Jaringan, Layanan Lokal atau beberapa akun terbatas lainnya).

Anda perlu mengatur izin yang sesuai pada kunci pribadi untuk memungkinkan akses akun layanan itu. MSDN memiliki detailnya

blowdart
sumber
Menjalankan kalori membantu saya untuk masalah yang sama sekali berbeda terima kasih
John
3
Saya menjalankan aplikasi saya sebagai administrator masalah itu hilang.
derek
1
+1 untuk dokumentasi MSDN dan langkah-langkah yang tercantum berlaku bahkan untuk Aplikasi Web
Naren
Menambahkan "LAYANAN JARINGAN" ke izin keamanan sertifikat menyelesaikan ini untuk saya, terima kasih!
OpMt
276

Ini kemungkinan besar karena pengguna IIS tidak memiliki akses ke kunci pribadi untuk sertifikat Anda. Anda dapat mengatur ini dengan mengikuti langkah-langkah ini ...

  1. Mulai -> Jalankan -> MMC
  2. File -> Tambah / Hapus Snapin
  3. Tambahkan Snap Snap Sertifikat
  4. Pilih Akun Komputer, lalu tekan berikutnya
  5. Pilih Komputer Lokal (default), lalu klik Selesai
  6. Di panel kiri dari Root Konsol, navigasikan ke Sertifikat (Komputer Lokal) -> Pribadi -> Sertifikat
  7. Sertifikat Anda kemungkinan besar akan ada di sini.
  8. Klik kanan pada sertifikat Anda -> Semua Tugas -> Kelola Kunci Pribadi
  9. Tetapkan pengaturan kunci pribadi Anda di sini.
Steve Sheldon
sumber
1
Perlu dicatat bahwa ini bukan opsi di Server 2003, kecuali lingkungan saya sudah dikonfigurasi aneh. Saya dapat melakukan ini pada Windows 7.
Shawn Hubbard
apa maksudmu dengan mengatur kunci privat di sini ?? Maksudku, kamu hanya bisa menambahkan pengguna dengan akses kan !?
mastervv
10
Terima kasih, hanya ingin menunjukkan bahwa jika Anda menggunakan iis7.5 dan kumpulan aplikasi berjalan sebagai applicationpoolidentity, Anda harus memberikan izin pengguna IIS AppPool \ DefaultAppPool ke file. Ini memperbaiki masalah bagi saya.
Ronen Festinger
25
Saya harus memberikan izin kepada IIS_IUSRS untuk membuatnya berfungsi untuk saya.
TrueEddie
1
jika Anda mendapatkan ini saat menjalankan IIS express Anda harus memberikan izin masuk Anda sendiri.
Jez,
38

Saya memiliki masalah yang identik tadi malam. Izin pada kunci pribadi diatur dengan benar, semuanya tampak baik-baik saja kecuali Keyset tidak ada kesalahan. Pada akhirnya ternyata sertifikat diimpor ke toko pengguna saat ini terlebih dahulu dan kemudian pindah ke toko mesin lokal. Namun - itu tidak memindahkan kunci privat, yang masih di dalam

C: \ Documents and settngs \ Administrator ...

dari pada

C: \ Documents and settngs \ Semua pengguna ...

Meskipun izin pada kunci telah ditetapkan dengan benar, ASPNET tidak dapat mengaksesnya. Ketika kami mengimpor kembali sertifikat sehingga kunci pribadi ditempatkan di cabang Semua pengguna, masalahnya hilang.

Željko Tanović
sumber
Permasalahan yang sama. Microsoft harus berhenti membiarkan bozos keamanan menjalankan suaka.
Paul Stovell
2
Setelah 3 jam yang hilang, ini menyelesaikan masalah saya - Terima kasih. Saya menggunakan sampel FindPrivateKey , dan bingung mengapa itu muncul di keystore pengguna saya, bahkan ketika itu muncul di LocalMachine melalui snap-in MMC.
Rob Potter
Saya akan membelikan Anda bir selama berjam-jam yang terbuang sia-sia dengan izin seperti setiap jawaban yang saya katakan.
Scott Scowden
Terima kasih terima kasih terima kasih! Saya telah kehilangan sekitar 2,5 jam hidup saya berkat masalah mengerikan ini dan saya yakin saya akan kehilangan 2,5 hari jika saya tidak melihat ini.
Frank Tzanabetis
Saya memiliki masalah yang sama secara terbalik. Pertama kali dipasang di Mesin Lokal, kemudian di Pengguna Saat Ini. Menghapus semua sertifikat dari kedua toko dan menginstal ulang di bawah Pengguna Saat Ini memperbaikinya.
Bart Verkoeijen
24

Untuk mengatasi "Keyset tidak ada" saat menjelajah dari IIS: Ini mungkin untuk izin pribadi

Untuk melihat dan memberikan izin:

  1. Jalankan> mmc> yes
  2. klik pada file
  3. Klik Tambah / hapus snap-in ...
  4. Klik dua kali pada sertifikat
  5. Akun Komputer
  6. Lanjut
  7. Selesai
  8. Baik
  9. Klik pada Sertifikat (Komputer Lokal)
  10. Klik pada Pribadi
  11. Klik Sertifikat

Untuk memberikan izin:

  1. Klik kanan pada nama sertifikat
  2. Semua Tugas> Kelola Kunci Pribadi ...
  3. Tambahkan dan berikan hak istimewa (menambahkan IIS_IUSRS dan memberikannya hak istimewa bagi saya)
Md. Ilyas Hasan Mamun
sumber
1
Jika Anda menjalankan di bawah kumpulan aplikasi, tambahkan pengguna ini sebagai gantinya "IIS AppPool \ DefaultAppPool"
Sameer Alibhai
Ini telah membantu saya juga. Segera setelah saya memberi IIS_IUSRS izin, itu mulai berfungsi.
Andrej Mohar
18

Punya masalah yang sama ketika mencoba menjalankan aplikasi WCF dari Visual Studio. Memecahkannya dengan menjalankan Visual Studio sebagai administrator.

desegel
sumber
11

Saya telah menghadapi masalah ini, sertifikat saya di mana memiliki kunci pribadi tetapi saya mendapatkan kesalahan ini ( "Keyset tidak ada" )

Penyebab: Situs web Anda berjalan di bawah akun "Layanan jaringan" atau memiliki lebih sedikit hak istimewa.

Solusi : Ubah identitas kumpulan Aplikasi ke "Sistem Lokal", reset IIS dan periksa lagi. Jika itu mulai berfungsi itu adalah masalah izin / Kurang hak istimewa, Anda dapat berkedok kemudian menggunakan akun lain juga.

Vaibhav. Diinspirasi
sumber
8

Benar-benar membuat frustrasi, saya memiliki masalah yang sama dan mencoba sebagian besar di atas. Sertifikat yang diekspor dengan benar memiliki izin untuk membaca file C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys, namun ternyata tidak memiliki izin pada folder. Menambahkannya dan berhasil

anjing kampung
sumber
Saya mencoba banyak hal untuk menyelesaikan masalah ini, tetapi yang ini berhasil!
Gyum Fox
wow - TIDAK mengharapkan itu berfungsi tetapi itu berhasil. Saya menambahkan IISAPPPool\www.mywebsite.comyang merupakan nama pengguna windows untuk appool saya dan berhasil :-)
Simon_Weaver
Adakah yang tahu mengapa ini berhasil? adalah sesuatu yang rusak karena ini sangat tidak jelas
Simon_Weaver
Jangan lakukan ini! Server masuk ke "kondisi buruk" di mana sertifikat sedang diimpor dan muncul dengan jenis penyedia "Microsoft Software KSP" ketika folder ..RSA \ MachineKeys memiliki izin dasar yang berubah. Lebih detail reddit.com/r/sysadmin/comments/339ogk/… .
Dhanuka777
3

Saya punya masalah yang persis sama juga. Saya telah menggunakan perintah

findprivatekey root localmachine -n "CN="CertName" 

hasilnya menunjukkan bahwa kunci pribadi ada di folder c: \ ProgramData alih-alih C: \ Documents and settngs \ Semua pengguna ..

Ketika saya menghapus kunci dari folder c: \ ProgramData, sekali lagi jalankan perintah findPrivatekey tidak berhasil. yaitu. tidak menemukan kuncinya.

Tetapi jika saya mencari kunci yang sama dikembalikan oleh perintah sebelumnya, saya masih dapat menemukan kunci masuk

C: \ Documents and settngs \ Semua pengguna ..

Jadi menurut pemahaman saya, IIS atau WCF yang di-host tidak menemukan kunci pribadi dari C: \ Documents and settngs \ Semua pengguna ..

pengguna1773822
sumber
2
Hai tautan ini akan memberi tahu Anda cara mengatasi masalah ini dan juga menemukan alat findprivatekey : blogs.msdn.microsoft.com/dsnotes/2015/08/13/…
Tahir Khalid
3

Saya mendapatkan kesalahan: CryptographicException 'Keyset tidak ada' ketika saya menjalankan aplikasi MVC.

Solusi adalah: untuk memberikan akses ke sertifikat pribadi ke akun yang dijalankan oleh kumpulan aplikasi. Dalam kasus saya itu adalah menambahkan IIS_IUSRS dan memilih lokasi yang tepat untuk menyelesaikan masalah ini.

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. 
Dev
sumber
2

Jawaban dari Steve Sheldon memperbaiki masalah bagi saya, namun, karena saya menulis izin sertifikat tanpa gui, saya membutuhkan solusi skrip. Saya kesulitan menemukan di mana kunci pribadi saya disimpan. Kunci pribadi tidak dalam -C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys, akhirnya saya menemukan bahwa itu benar-benar dalam C:\ProgramData\Microsoft\Crypto\Keys. Di bawah ini saya jelaskan bagaimana saya mengetahui hal itu:

Saya mencoba FindPrivateKeytetapi tidak dapat menemukan kunci privat, dan menggunakan PowerShell $cert.privatekey.cspkeycontainerinfo.uniquekeycontainernamenull / kosong.

Untungnya, certutil -store mymendaftar sertifikat dan memberi saya rincian yang saya butuhkan untuk skrip solusi.

================ 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.

Saya kemudian memindai c\ProgramData\Microsoft\Crypto\folder dan menemukan file 8787033f8ccb5836115b87acb_ca96c65a-4b42-a145-eee62128a di C: \ ProgramData \ Microsoft \ Crypto \ Keys .

Memberi akses baca akun layanan saya file ini memperbaiki masalah bagi saya

Dai Bok
sumber
1
Menggunakan "certutil -store my" adalah kunci untuk menyelesaikan masalah saya. Saya menggunakan "Nama wadah unik" untuk mencari file dan Sysinternals Process Monitor untuk memecahkan masalah "Akses Ditolak" pada file sertifikat. Dalam kasus saya, saya harus menyediakan akses baca ke file sertifikat untuk pengguna NT Authority \ IUSR.
hsop
1

Saya menemukan beberapa informasi yang hilang yang membantu saya mendapatkan layanan WCF saya dengan keamanan tingkat pesan melewati "Keyset tidak ada" yang terus saya jalankan meskipun memberikan izin untuk semua kunci yang dihasilkan dari contoh-contoh di internet.

Saya akhirnya mengimpor kunci pribadi ke toko orang tepercaya di mesin lokal dan kemudian memberikan izin kunci yang benar kepada kunci pribadi.

Ini mengisi kekosongan bagi saya dan akhirnya memungkinkan saya untuk mengimplementasikan layanan WCF dengan keamanan tingkat pesan. Saya sedang membangun WCF yang harus sesuai dengan HIPPA.

pengguna1483373
sumber
1

Saya baru saja menginstal ulang sertifikat saya di mesin lokal dan kemudian berfungsi dengan baik

Muni Chittem
sumber
0

Jika Anda menggunakan ApplicationPoolIdentity untuk kumpulan aplikasi Anda, Anda mungkin memiliki masalah dengan menentukan izin untuk "virtual" pengguna dalam editor registri (tidak ada pengguna seperti itu dalam sistem).

Jadi, gunakan subinacl - alat baris perintah yang memungkinkan ACL mengatur registri, atau sesuatu seperti ini.

tyger
sumber
0

Saya hanya ingin menambahkan jawaban cek kewarasan. Saya mendapatkan kesalahan yang sama persis bahkan setelah menginstal sertifikat ke toko yang tepat di komputer saya dan memiliki semua hak keamanan yang tepat untuk klien. Ternyata saya mencampurkan Sertifikat klien dan Sertifikat Layanan saya. Jika Anda telah mencoba semua hal di atas, saya akan mengecek apakah Anda memiliki dua yang benar. Setelah saya melakukan itu, aplikasi saya berhasil memanggil layanan web. Sekali lagi, hanya pemeriksa kewarasan.

SoftwareSavant
sumber
0

Menerima kesalahan ini saat menggunakan OpenAM Fedlet di IIS7

Mengubah akun pengguna untuk situs web default menyelesaikan masalah. Idealnya, Anda ingin ini menjadi akun layanan. Mungkin bahkan akun IUSR. Sarankan mencari metode untuk pengerasan IIS untuk menghentikannya sepenuhnya.

Jeff Minder
sumber
0

Saya menemukan ini dalam proyek fabric service saya setelah sertifikat yang digunakan untuk mengotentikasi terhadap kubah kunci kami kedaluwarsa dan diputar, yang mengubah cap jempol. Saya mendapatkan kesalahan ini karena saya telah melewatkan memperbarui cap jempol di file applicationManifest.xml di blok ini yang tepat melakukan apa yang disarankan jawaban lain - untuk diberikan LAYANAN JARINGAN (yang semua dijalankan sebagai, konfigurasi standar untuk cluster kain biru) izin untuk mengakses lokasi toko LOCALMACHINE \ MY cert.

Perhatikan nilai atribut "X509FindValue".

<!-- 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 -->

Sat Thiru
sumber
0

Ini adalah satu-satunya solusi yang berhasil untuk saya.

    // 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));

Referensi 1

Referensi 2

CharithJ
sumber
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.
yuvraj
sumber