CryptographicException 'Keyset ไม่มีอยู่' แต่ผ่านทาง WCF เท่านั้น


157

ฉันมีรหัสบางอย่างที่ทำให้การโทรไปยังบริการเว็บของบุคคลที่สามที่มีความปลอดภัยโดยใช้การรับรอง X.509

ถ้าฉันเรียกรหัสโดยตรง (โดยใช้การทดสอบหน่วย) มันทำงานได้โดยไม่มีปัญหาใด ๆ

เมื่อใช้งานรหัสนี้จะถูกเรียกผ่านบริการ WCF ฉันได้เพิ่มการทดสอบหน่วยที่สองที่เรียกใช้บริการ WCF อย่างไรก็ตามสิ่งนี้ล้มเหลวด้วย a CryptographicExceptionข้อความ"Keyset does not exist"เมื่อฉันเรียกวิธีการในบริการเว็บบุคคลที่สาม

ฉันเชื่อว่านี่เป็นเพราะบริการ WCF ของฉันจะพยายามเรียกใช้บริการเว็บของบุคคลที่สามโดยใช้ผู้ใช้คนอื่นกับตัวเอง

ทุกคนสามารถหลั่งน้ำตาเพิ่มเติมเกี่ยวกับปัญหานี้หรือไม่

คำตอบ:


168

อาจเป็นปัญหาสิทธิ์ในใบรับรอง

เมื่อเรียกใช้การทดสอบหน่วยคุณจะต้องดำเนินการภายใต้บริบทผู้ใช้ของคุณซึ่ง (ขึ้นอยู่กับที่เก็บใบรับรองไคลเอ็นต์อยู่) จะสามารถเข้าถึงคีย์ส่วนตัวของใบรับรองนั้นได้

อย่างไรก็ตามหากบริการ WCF ของคุณโฮสต์อยู่ภายใต้ IIS หรือเป็นบริการ Windows อาจเป็นไปได้ว่าจะทำงานภายใต้บัญชีบริการ (บริการเครือข่ายบริการท้องถิ่นหรือบัญชีที่ถูก จำกัด อื่น ๆ )

คุณจะต้องตั้งค่าการอนุญาตที่เหมาะสมในคีย์ส่วนตัวเพื่อให้บัญชีบริการนั้นสามารถเข้าถึงได้ MSDN มีรายละเอียด


การใช้งาน calcs ช่วยฉันสำหรับปัญหาที่แตกต่างอย่างสิ้นเชิงขอบคุณ
John

3
ฉันเรียกใช้แอปในฐานะผู้ดูแลระบบปัญหาจะหายไป
ดีเร็ก

1
+1 สำหรับเอกสาร MSDNและขั้นตอนที่ระบุไว้ใช้กับเว็บแอปพลิเคชัน
Naren

การเพิ่ม "NETWORK SERVICE" ลงในสิทธิ์ความปลอดภัยของใบรับรองแก้ไขให้ฉันแล้วขอบคุณ!
OpMt

276

นี่เป็นไปได้มากที่สุดเนื่องจากผู้ใช้ IIS ไม่สามารถเข้าถึงคีย์ส่วนตัวสำหรับใบรับรองของคุณ คุณสามารถตั้งค่านี้โดยทำตามขั้นตอนเหล่านี้ ...

  1. เริ่ม -> Run -> MMC
  2. ไฟล์ -> เพิ่ม / ลบ Snapin
  3. เพิ่มใบรับรองสแนปอิน
  4. เลือกบัญชีคอมพิวเตอร์แล้วกดถัดไป
  5. เลือก Local Computer (ค่าเริ่มต้น) จากนั้นคลิกเสร็จสิ้น
  6. ที่แผงด้านซ้ายจากรูทคอนโซลให้ไปที่ใบรับรอง (Local Computer) -> ส่วนตัว -> ใบรับรอง
  7. ใบรับรองของคุณน่าจะอยู่ที่นี่มากที่สุด
  8. คลิกขวาที่ใบรับรองของคุณ -> งานทั้งหมด -> จัดการคีย์ส่วนตัว
  9. ตั้งค่าคีย์ส่วนตัวของคุณที่นี่

1
น่าสังเกตว่านี่ไม่ใช่ตัวเลือกใน Server 2003 เว้นแต่ว่าสภาพแวดล้อมของฉันได้รับการกำหนดค่าแปลกประหลาด ฉันสามารถทำสิ่งนี้บน Windows 7 ได้
Shawn Hubbard

คุณหมายถึงอะไรด้วยการตั้งค่าคีย์ส่วนตัวที่นี่ ฉันหมายความว่าคุณสามารถเพิ่มผู้ใช้ที่มีสิทธิ์การเข้าถึงเท่านั้น!
mastervv

10
ขอขอบคุณเพียงต้องการชี้ให้เห็นว่าถ้าคุณใช้ iis7.5 และกลุ่มแอปพลิเคชันทำงานเป็น applicationpoolidentity คุณจะต้องให้สิทธิ์ผู้ใช้ IIS AppPool \ DefaultAppPool กับไฟล์ นี่เป็นการแก้ไขปัญหาสำหรับฉัน
Ronen Festinger

25
ฉันต้องให้สิทธิ์กับ IIS_IUSRS เพื่อให้มันใช้งานได้สำหรับฉัน
TrueEddie

1
หากคุณได้รับสิ่งนี้ในขณะที่ใช้งาน IIS Express คุณจะต้องให้สิทธิ์การเข้าสู่ระบบของคุณเอง
Jez

38

เมื่อคืนนี้ฉันมีปัญหาเหมือนกัน ตั้งค่าการอนุญาตให้ใช้คีย์ส่วนตัวอย่างถูกต้องทุกอย่างดียกเว้นชุดคีย์ไม่มีข้อผิดพลาด ในท้ายที่สุดมันกลับกลายเป็นว่าใบรับรองถูกนำเข้าไปยังร้านค้าผู้ใช้ปัจจุบันก่อนแล้วจึงย้ายไปที่ร้านขายเครื่องท้องถิ่น อย่างไรก็ตาม - นั่นไม่ได้ย้ายคีย์ส่วนตัวซึ่งยังอยู่ใน

C: \ Documents and settngs \ Administrator ...

แทน

C: \ Documents and settngs \ ผู้ใช้ทั้งหมด ...

มีการตั้งค่าการอนุญาตระดับสูงสำหรับคีย์อย่างถูกต้อง ASPNET ไม่สามารถเข้าถึงได้ เมื่อเรานำเข้าใบรับรองอีกครั้งเพื่อให้วางกุญแจส่วนตัวในสาขาผู้ใช้ทั้งหมดปัญหาจะหายไป


ปัญหาเดียวกัน. Microsoft จำเป็นต้องหยุดให้การรักษาความปลอดภัย bozos เรียกใช้ที่ลี้ภัย
Paul Stovell

2
หลังจาก 3 ชั่วโมงที่หายไปสิ่งนี้ช่วยแก้ปัญหาของฉันได้ - ขอบคุณ ฉันใช้ตัวอย่างFindPrivateKeyและสับสนว่าเหตุใดจึงปรากฏในที่เก็บคีย์ผู้ใช้ของฉันแม้ว่าจะปรากฏใน LocalMachine ผ่านสแน็ปอิน MMC
Rob Potter

ฉันจะซื้อเบียร์ให้คุณเป็นเวลาหลายชั่วโมงโดยที่ไม่ได้รับอนุญาตเหมือนกับที่ทุก ๆ คำตอบบอก
Scott Scowden

ขอบคุณขอบคุณขอบคุณ! ฉันเสียชีวิตไป 2.5 ชั่วโมงจากปัญหาสยองขวัญนี้และฉันแน่ใจว่าฉันจะต้องสูญเสีย 2.5 วันหากฉันไม่เห็นสิ่งนี้
Frank Tzanabetis

ฉันมีปัญหาเดียวกันในสิ่งที่ตรงกันข้าม ติดตั้งครั้งแรกใน Local Machine จากนั้นในผู้ใช้ปัจจุบัน ลบ certs ทั้งหมดจากร้านค้าทั้งสองและติดตั้งใหม่ภายใต้ผู้ใช้ปัจจุบันแก้ไข
Bart Verkoeijen

24

เพื่อแก้ปัญหา“ ไม่มีคีย์เซ็ต” เมื่อเรียกดูจาก IIS: อาจเป็นการขออนุญาตส่วนตัว

วิธีดูและให้สิทธิ์:

  1. Run> MMC> ใช่
  2. คลิกที่ไฟล์
  3. คลิกที่เพิ่ม / ลบสแนปอิน ...
  4. ดับเบิลคลิกที่ใบรับรอง
  5. บัญชีคอมพิวเตอร์
  6. ต่อไป
  7. เสร็จสิ้น
  8. ตกลง
  9. คลิกที่ใบรับรอง (Local Computer)
  10. คลิกที่ส่วนบุคคล
  11. คลิกใบรับรอง

วิธีให้สิทธิ์:

  1. คลิกขวาที่ชื่อใบรับรอง
  2. งานทั้งหมด> จัดการคีย์ส่วนตัว ...
  3. เพิ่มและให้สิทธิ์ (เพิ่ม IIS_IUSRS และให้สิทธิ์ใช้งานได้สำหรับฉัน)

1
หากคุณกำลังทำงานภายใต้กลุ่มแอพให้เพิ่มผู้ใช้นี้แทน "IIS AppPool \ DefaultAppPool"
Sameer Alibhai

นี่ก็ช่วยฉันด้วย ทันทีที่ฉันให้สิทธิ์กับ IIS_IUSRS มันก็เริ่มทำงานได้
Andrej Mohar

18

พบปัญหาเดียวกันในขณะที่พยายามเรียกใช้แอป WCF จาก Visual Studio แก้ไขได้โดยการเรียกใช้ Visual Studio ในฐานะผู้ดูแล


11

ฉันประสบปัญหานี้ใบรับรองของฉันที่มีรหัสส่วนตัว แต่ฉันได้รับข้อผิดพลาดนี้ ( "ไม่มีชุดคีย์" )

สาเหตุ:เว็บไซต์ของคุณทำงานภายใต้บัญชี "บริการเครือข่าย" หรือมีสิทธิ์น้อยลง

การแก้ไข : เปลี่ยนข้อมูลประจำตัวของพูลโปรแกรมประยุกต์เป็น "Local System" รีเซ็ต IIS และตรวจสอบอีกครั้ง ถ้ามันเริ่มทำงานมันเป็นปัญหาสิทธิ์ / น้อยคุณสามารถเลียนแบบแล้วใช้บัญชีอื่นด้วย


8

น่าผิดหวังอย่างสิ้นเชิงฉันมีปัญหาเดียวกันและลองวิธีการด้านบน ใบรับรองที่ส่งออกอย่างถูกต้องมีสิทธิ์ในการอ่านไฟล์C:\ProgramData\Microsoft\Crypto\RSA\MachineKeysอย่างไรก็ตามมันกลายเป็นว่ามันไม่ได้รับอนุญาตในโฟลเดอร์ เพิ่มมันและมันทำงาน


ฉันลองหลายสิ่งหลายอย่างเพื่อแก้ไขปัญหานี้ แต่อันนี้ทำอุบาย!
Gyum Fox

ว้าว - ไม่ได้คาดหวังว่ามันจะทำงาน แต่มันก็ทำ ฉันเพิ่มIISAPPPool\www.mywebsite.comซึ่งเป็นชื่อผู้ใช้ windows สำหรับ appool ของฉันและมันทำงาน :-)
Simon_Weaver

ใครรู้ว่าทำไมงานนี้ เป็นสิ่งที่เสียหายเพราะเป็นสิ่งที่คลุมเครือ
Simon_Weaver

อย่าทำอย่างนี้! เซิร์ฟเวอร์เข้าสู่ "สถานะไม่ดี" ที่มีการนำเข้าใบรับรองและแสดงประเภทผู้ให้บริการ "Microsoft Software KSP" เมื่อโฟลเดอร์ .. RSA \ MachineKeys มีการเปลี่ยนแปลงสิทธิ์พื้นฐาน รายละเอียดเพิ่มเติมreddit.com/r/sysadmin/comments/339ogk/...
Dhanuka777

3

ฉันมีปัญหาที่คล้ายกันเช่นกัน ฉันได้ใช้คำสั่ง

findprivatekey root localmachine -n "CN="CertName" 

ผลลัพธ์แสดงว่าคีย์ส่วนตัวอยู่ในโฟลเดอร์ c: \ ProgramData แทนที่จะเป็น C: \ Documents และ settngs \ ผู้ใช้ทั้งหมด ..

เมื่อฉันลบคีย์ออกจากโฟลเดอร์ c: \ ProgramData ให้เรียกใช้คำสั่ง findPrivatekey อีกครั้งไม่สำเร็จ กล่าวคือ ไม่พบกุญแจ

แต่ถ้าฉันค้นหาคีย์เดียวกันที่ส่งคืนโดยคำสั่งก่อนหน้าฉันยังสามารถค้นหาคีย์ได้

C: \ Documents and settngs \ ผู้ใช้ทั้งหมด ..

ดังนั้นเพื่อความเข้าใจของฉัน IIS หรือ WCF ที่โฮสต์ไม่ค้นหาคีย์ส่วนตัวจาก C: \ Documents และตั้งค่า \ ผู้ใช้ทั้งหมด ..


2
สวัสดีการเชื่อมโยงนี้จะบอกวิธีการแก้ไขปัญหานี้และยังค้นหาfindprivatekeyเครื่องมือ: blogs.msdn.microsoft.com/dsnotes/2015/08/13/...
อับด์คาลิด

3

ฉันได้รับข้อผิดพลาด: CryptographicException 'Keyset ไม่มีอยู่' เมื่อฉันเรียกใช้แอปพลิเคชัน MVC

วิธีแก้ไขคือ: เพื่อให้การเข้าถึงใบรับรองส่วนบุคคลไปยังบัญชีที่มีแอพพลิเคชั่นกำลังทำงานอยู่ ในกรณีของฉันมันคือการเพิ่ม IIS_IUSRS และเลือกสถานที่ที่เหมาะสมแก้ไขปัญหานี้

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 แก้ไขปัญหาให้ฉันได้อย่างไรขณะที่ฉันกำลังอนุญาตให้ใช้สคริปต์โดยไม่ต้องใช้ gui ฉันต้องการโซลูชันที่ใช้สคริปต์ได้ ฉันพยายามหาที่เก็บคีย์ส่วนตัวของฉัน คีย์ส่วนตัวไม่ได้อยู่ในท้ายที่สุดผมพบว่ามันเป็นจริงใน-C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys C:\ProgramData\Microsoft\Crypto\Keysด้านล่างฉันอธิบายว่าฉันพบสิ่งนั้นได้อย่างไร:

ฉันพยายามFindPrivateKeyแต่ไม่สามารถหาคีย์ส่วนตัวและการใช้ powershell นั้น$cert.privatekey.cspkeycontainerinfo.uniquekeycontainernameเป็นโมฆะ / ว่างเปล่า

โชคดีที่certutil -store myแสดงใบรับรองและให้รายละเอียดที่ฉันต้องการในการเขียนสคริปต์โซลูชัน

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

จากนั้นผมก็สแกนc\ProgramData\Microsoft\Crypto\โฟลเดอร์และพบไฟล์8787033f8ccb5836115b87acb_ca96c65a-4b42-A145-eee62128aในC: \ ProgramData \ Microsoft \ Crypto \ คีย์

การให้สิทธิ์การเข้าถึงเพื่ออ่านเพื่อเข้าถึงบัญชีบริการของฉันแก้ไขปัญหาให้ฉันได้


1
การใช้ "certutil -store my" เป็นกุญแจสำคัญในการแก้ปัญหาของฉัน ฉันใช้ "ชื่อคอนเทนเนอร์ที่ไม่ซ้ำ" เพื่อค้นหาไฟล์และการตรวจสอบกระบวนการ Sysinternals เพื่อแก้ไขข้อผิดพลาด "การเข้าถึงถูกปฏิเสธ" ในไฟล์ใบรับรอง ในกรณีของฉันฉันต้องให้สิทธิ์การอ่านเพื่อเข้าถึงไฟล์ใบรับรองสำหรับผู้ใช้ NT Authority \ IUSR
hsop

1

ฉันพบข้อมูลที่ขาดหายไปซึ่งช่วยให้ฉันรับบริการ WCF ด้วยความปลอดภัยระดับข้อความผ่าน "Keyset ไม่มีอยู่" ที่ฉันยังคงทำงานอยู่แม้จะให้สิทธิ์กับคีย์ทั้งหมดที่สร้างจากตัวอย่างบนอินเทอร์เน็ต

ในที่สุดฉันก็นำเข้ากุญแจส่วนตัวไปยังร้านคนที่เชื่อถือได้บนเครื่องท้องถิ่นและจากนั้นให้อนุญาตกุญแจส่วนตัวให้ถูกต้อง

ซึ่งเต็มไปด้วยช่องว่างสำหรับฉันและในที่สุดก็อนุญาตให้ฉันใช้บริการ WCF ด้วยความปลอดภัยระดับข้อความ ฉันกำลังสร้าง WCF ที่ต้องสอดคล้องกับ HIPPA



0

หากคุณใช้ ApplicationPoolIdentity สำหรับกลุ่มแอปพลิเคชันของคุณคุณอาจมีปัญหาในการระบุสิทธิ์สำหรับผู้ใช้ "เสมือน" ในตัวแก้ไขรีจิสทรี (ไม่มีผู้ใช้ดังกล่าวในระบบ)

ดังนั้นให้ใช้subinacl - เครื่องมือบรรทัดคำสั่งที่เปิดใช้งานการตั้งค่า ACL ของรีจิสตรีหรืออะไรทำนองนี้


0

ฉันแค่อยากจะเพิ่มคำตอบตรวจสอบสติ ฉันได้รับข้อผิดพลาดเดียวกันแน่นอนแม้หลังจากติดตั้งใบรับรองไปยังร้านค้าที่ถูกต้องบนเครื่องของฉันและมีสิทธิ์ด้านความปลอดภัยที่เหมาะสมสำหรับลูกค้า ปรากฎว่าฉันผสมใบรับรองลูกค้าและใบรับรองบริการของฉัน หากคุณลองทั้งหมดข้างต้นแล้วฉันจะตรวจสอบอีกครั้งว่าคุณมีสองสิ่งนี้ตรง เมื่อฉันทำเช่นนั้นแล้วแอปพลิเคชันของฉันเรียกว่าบริการเว็บสำเร็จ อีกครั้งเพียงแค่ตัวตรวจสอบสติ


0

ได้รับข้อผิดพลาดนี้ขณะใช้ openAM Fedlet บน IIS7

การเปลี่ยนบัญชีผู้ใช้สำหรับเว็บไซต์เริ่มต้นแก้ไขปัญหาได้ เป็นการดีที่คุณต้องการให้บัญชีนี้เป็นบริการ บางทีแม้แต่บัญชี IUSR แนะนำวิธีค้นหา IIS ให้แข็งตัวเพื่อจัดการให้สมบูรณ์


0

ฉันพบสิ่งนี้ในโครงการบริการผ้าของฉันหลังจากที่ใบรับรองที่ใช้ในการรับรองความถูกต้องกับตู้นิรภัยหลักของเราหมดอายุและถูกหมุนซึ่งเปลี่ยนรหัสประจำตัว ฉันได้รับข้อผิดพลาดนี้เนื่องจากฉันพลาดการอัปเดตรหัสประจำตัวในไฟล์ applicationManifest.xml ในบล็อกนี้ซึ่งทำตามคำแนะนำอื่น ๆ อย่างแม่นยำ - เพื่อมอบให้กับ NETWORK SERVICE (ซึ่ง exes ทั้งหมดของฉันทำงานเป็นสิทธิ์การกำหนดค่ามาตรฐานสำหรับ เข้าถึงที่ตั้งร้านค้าใบรับรอง LOCALMACHINE \ MY

หมายเหตุค่าแอตทริบิวต์ "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 -->


0

นี่เป็นทางออกเดียวสำหรับฉัน

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

การอ้างอิง 1

การอ้างอิง 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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.