CryptographicException '키셋이 없습니다', 그러나 WCF를 통해서만


157

X.509 인증을 사용하여 보호되는 타사 웹 서비스를 호출하는 코드가 있습니다.

단위 테스트를 사용하여 코드를 직접 호출하면 아무런 문제없이 작동합니다.

배포되면이 코드는 WCF 서비스를 통해 호출됩니다. WCF 서비스를 호출하는 두 번째 단위 테스트를 추가했지만 타사 웹 서비스에서 메서드를 호출하면 CryptographicException, 메시지 와 함께 실패 "Keyset does not exist"합니다.

WCF 서비스가 다른 사용자를 사용하여 타사 웹 서비스를 직접 호출하려고하기 때문이라고 생각합니다.

누구든지이 문제에 대해 더 밝힐 수 있습니까?

답변:


168

인증서에 대한 권한 문제 일 수 있습니다.

단위 테스트를 실행하면 클라이언트 인증서가있는 저장소에 따라 자신의 사용자 컨텍스트에서 해당 인증서의 개인 키에 액세스 할 수 있는 사용자 컨텍스트에서 실행 됩니다.

그러나 WCF 서비스가 IIS 또는 Windows 서비스로 호스팅되는 경우 서비스 계정 (네트워크 서비스, 로컬 서비스 또는 기타 제한된 계정)에서 실행될 가능성이 있습니다.

해당 서비스 계정이 개인 키에 액세스 할 수 있도록 개인 키에 대한 적절한 권한을 설정해야합니다. MSDN 에 자세한 내용이 있습니다.


calcs를 실행하면 완전히 다른 문제 덕분에 도움이되었습니다.
John

3
문제가 사라진 관리자로 APP을 실행합니다.
derek

1
MSDN 설명서 및 나열된 단계에 대한 +1 은 웹 응용 프로그램에도 적용
Naren

인증서 보안 권한에 "NETWORK SERVICE"를 추가하면이 문제가 해결되었습니다. 감사합니다.
03 분에 OpMt

276

IIS 사용자가 인증서의 개인 키에 액세스 할 수 없기 때문일 수 있습니다. 다음 단계에 따라이를 설정할 수 있습니다 ...

  1. 시작-> 실행-> MMC
  2. 파일-> 스냅인 추가 / 제거
  3. 인증서 스냅인 추가
  4. 컴퓨터 계정을 선택한 후 다음을 누르십시오.
  5. 로컬 컴퓨터 (기본값)를 선택한 다음 마침을 클릭하십시오.
  6. 콘솔 루트의 왼쪽 패널에서 인증서 (로컬 컴퓨터)-> 개인-> 인증서로 이동하십시오.
  7. 귀하의 인증서가 여기에있을 것입니다.
  8. 인증서를 마우스 오른쪽 버튼으로 클릭-> 모든 작업-> 개인 키 관리
  9. 여기에서 개인 키 설정을 지정하십시오.

1
내 환경이 이상하게 구성되어 있지 않으면 Server 2003에서이 옵션을 사용할 수 없습니다. 그래도 Windows 7 에서이 작업을 수행 할 수 있습니다.
Shawn Hubbard

여기서 개인 키를 설정하면 무슨 의미입니까 ?? 액세스 권한이있는 사용자 만 추가 할 수 있습니다!?
mastervv

10
고맙게도 iis7.5를 사용하고 응용 프로그램 풀이 응용 프로그램 풀 ID로 실행되는 경우 파일에 대한 IIS AppPool \ DefaultAppPool 사용자 권한을 부여해야한다고 지적했습니다. 이것은 나를 위해 문제를 해결했습니다.
Ronen Festinger

25
IIS_IUSRS에 권한을 부여하여 작동하도록했습니다.
TrueEddie

1
IIS Express를 실행하는 동안이 정보를 얻는 경우 고유 한 로그인 권한을 부여해야합니다.
Jez

38

어젯밤에 동일한 문제가 발생했습니다. 개인 키에 대한 권한이 올바르게 설정되었으므로 Keyset에 존재하지 않는 오류를 제외하고는 모든 것이 정상이었습니다. 결국 인증서를 현재 사용자 저장소로 가져온 다음 로컬 컴퓨터 저장소로 옮겼습니다. 그러나 여전히 개인 키는 이동하지 않았습니다.

C : \ Documents and settngs \ Administrator ...

대신에

C : \ Documents and settngs \ 모든 사용자 ...

키에 대한 충분한 권한이 올바르게 설정되었으므로 ASPNET이 액세스 할 수 없습니다. 개인 키가 모든 사용자 분기에 배치되도록 인증서를 다시 가져 오면 문제가 사라졌습니다.


같은 문제입니다. Microsoft는 보안 병이 망명을하게하는 것을 중단해야합니다.
Paul Stovell

2
3 시간을 잃어버린 후 내 문제가 해결됩니다. 감사합니다. FindPrivateKey 샘플을 사용 했는데 MMC 스냅인을 통해 LocalMachine에 나타날 때도 사용자의 키 저장소에있는 것처럼 보이는 이유가 혼란 스러웠습니다.
Rob Potter

나는 다른 모든 대답이 나에게 말한 것처럼 권한으로 엉망이되는 시간 동안 맥주를 사겠다.
Scott Scowden

고마워 고마워 이 끔찍한 문제로 인해 약 2.5 시간의 인생을 잃어 버렸는데 이것을 보지 않으면 2.5 일을 잃었을 것입니다.
Frank Tzanabetis 2016 년

나는 같은 문제를 거꾸로했다. 먼저 로컬 컴퓨터에 설치 한 다음 현재 사용자에 설치하십시오. 두 상점 모두에서 모든 인증서를 제거하고 현재 사용자로 다시 설치하면 문제가 해결되었습니다.
Bart Verkoeijen

24

IIS에서 찾아 볼 때 "키셋이 존재하지 않습니다"를 해결하려면 개인 권한에 대한 것일 수 있습니다.

보고 권한을 부여하려면 다음을 수행하십시오.

  1. 실행> mmc> 예
  2. 파일을 클릭하십시오
  3. 스냅인 추가 / 제거를 클릭하십시오…
  4. 인증서를 두 번 클릭하십시오
  5. 컴퓨터 계정
  6. 다음
  7. 확인
  8. 인증서 (로컬 컴퓨터)를 클릭하십시오
  9. 개인을 클릭하십시오
  10. 인증서를 클릭하십시오

권한을 부여하려면

  1. 인증서 이름을 마우스 오른쪽 버튼으로 클릭하십시오
  2. 모든 작업> 개인 키 관리…
  3. 권한 추가 및 제공 (IIS_IUSRS 추가 및 권한 부여)

1
앱 풀에서 실행중인 경우 "IIS AppPool \ DefaultAppPool"대신이 사용자를 추가하십시오.
Sameer Alibhai

이것은 나에게도 도움이되었습니다. IIS_IUSRS에 권한을 부여하자마자 작동하기 시작했습니다.
Andrej Mohar

18

Visual Studio에서 WCF 앱을 실행하는 동안 동일한 문제가 발생했습니다. Visual Studio를 관리자 권한으로 실행하여 해결했습니다.


11

개인 키가 있지만이 키가 발생하는 인증서 인이 문제에 직면했습니다 ( "키 세트가 없습니다" ).

원인 : 웹 사이트가 "네트워크 서비스"계정으로 실행 중이거나 권한이 적습니다.

해결 방법 : 응용 프로그램 풀 ID를 "로컬 시스템"으로 변경하고 IIS를 재설정 한 후 다시 확인하십시오. 작동이 시작되면 권한 /리스 권한 문제이므로 다른 계정으로 가장하여 사용할 수도 있습니다.


8

완전히 실망 스럽지만 같은 문제가 있었고 위의 대부분을 시도했습니다. 내 보낸 인증서에 파일을 읽을 수 C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys있는 권한이 있지만 폴더에 대한 권한이없는 것으로 나타났습니다. 그것을 추가하고 작동했습니다


나는이 문제를 해결하기 위해 많은 것을 시도했지만 이것도 트릭을 수행했습니다!
Gyum Fox

와우-그것이 작동하기를 기대하지는 않았지만 그렇게했습니다. IISAPPPool\www.mywebsite.com내 appool의 Windows 사용자 이름을 추가 하고 작동했습니다 :-)
Simon_Weaver

왜 이것이 작동하는지 알고 있습니까? 이것은 매우 모호하기 때문에 손상된 것입니다
Simon_Weaver

이러지 마! ..RSA \ MachineKeys 폴더의 기본 권한이 변경되면 서버가 인증서를 가져오고 "Microsoft Software KSP"공급자 유형으로 표시되는 "잘못된 상태"로 전환됩니다. 자세한 내용은 reddit.com/r/sysadmin/comments/339ogk/…를 참조하십시오 .
Dhanuka777

3

나는 비슷한 문제가 있습니다. 나는 명령을 사용했다

findprivatekey root localmachine -n "CN="CertName" 

결과는 개인 키가 C : \ Documents 및 settngs \ All users 대신 c : \ ProgramData 폴더에 있음을 나타냅니다.

c : \ ProgramData 폴더에서 키를 삭제하면 findPrivatekey 명령이 다시 실행되지 않습니다. 즉. 키를 찾지 못했습니다.

그러나 이전 명령에서 반환 한 동일한 키를 검색해도 여전히 키를 찾을 수 있습니다.

C : \ Documents and settngs \ 모든 사용자 ..

따라서 이해하기 위해 IIS 또는 호스팅 WCF는 C : \ Documents and settngs \ All users에서 개인 키를 찾지 못합니다.


2
안녕하세요이 링크는 어떻게이 문제를 해결하고 또한 찾을 방법을 알려주는 것입니다 findprivatekey : 도구 blogs.msdn.microsoft.com/dsnotes/2015/08/13/...
타히르 칼리드

3

오류가 발생했습니다 : MVC 응용 프로그램을 실행할 때 CryptographicException '키 세트가 없습니다'.

해결책은 응용 프로그램 풀이 실행되는 계정에 개인 인증서에 대한 액세스 권한을 부여하는 것입니다. 필자의 경우 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.uniquekeycontainernamenull / 비어 있습니다.

다행히 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\폴더 를 스캔 하고 C : \ ProgramData \ Microsoft \ Crypto \ Keys 에서 8787033f8ccb5836115b87acb_ca96c65a-4b42-a145-eee62128a 파일을 찾았습니다 .

내 서비스 계정에이 파일에 대한 액세스 권한을 부여하면 문제가 해결되었습니다.


1
"certutil -store my"를 사용하는 것이 내 문제를 해결하는 열쇠였습니다. "고유 컨테이너 이름"을 사용하여 파일을 찾고 Sysinternals Process Monitor를 사용하여 인증서 파일의 "액세스 거부"오류 문제를 해결했습니다. 필자의 경우 NT Authority \ IUSR 사용자의 인증서 파일에 대한 읽기 액세스 권한을 제공해야했습니다.
hsop

1

인터넷의 예제에서 생성 된 모든 키에 대한 권한을 부여했지만 "키셋이 존재하지 않습니다"라는 메시지 수준 보안을 사용하여 WCF 서비스를 얻는 데 도움이되는 정보가 누락되었습니다.

마지막으로 개인 키를 로컬 컴퓨터의 신뢰할 수있는 사용자 저장소로 가져온 다음 개인 키에 올바른 권한을 부여했습니다.

이것은 나를 위해 공백을 채웠으며 마침내 메시지 수준 보안으로 WCF 서비스를 구현할 수있었습니다. HIPPA를 준수해야하는 WCF를 구축 중입니다.


1

로컬 컴퓨터에 인증서를 다시 설치했는데 정상적으로 작동합니다.


0

응용 프로그램 풀에 ApplicationPoolIdentity를 사용하는 경우 레지스트리 편집기에서 해당 "가상"사용자에 대한 권한을 지정하는 데 문제가있을 수 있습니다 (시스템에는 해당 사용자가 없음).

따라서 subinacl- 레지스트리 ACL 설정 또는 이와 유사한 명령 행 도구를 사용하십시오.


0

방금 신원 확인 답변을 추가하고 싶었습니다. 내 컴퓨터의 올바른 저장소에 인증서를 설치하고 클라이언트에 대한 모든 올바른 보안 권한을 얻은 후에도 동일한 오류가 발생했습니다. 내 clientCertificate와 서비스 인증서를 혼합했습니다. 당신이 위의 모든 것을 시도했다면, 나는 당신이 그 두 가지를 가지고 있는지 재확인 할 것입니다. 일단 그렇게하면 내 응용 프로그램이 웹 서비스를 성공적으로 호출했습니다. 다시 한 번, 위생 검사기.


0

IIS7에서 openAM Fedlet을 사용하는 동안이 오류가 발생했습니다

기본 웹 사이트의 사용자 계정을 변경하면 문제가 해결되었습니다. 이상적으로는 이것이 서비스 계정이되기를 원할 것입니다. 아마도 IUSR 계정 일 수도 있습니다. IIS 보안 강화를위한 방법을 찾는 것이 좋습니다.


0

키 저장소에 대해 인증하는 데 사용 된 인증서가 만료되어 회전 한 후 지문을 변경 한 후 서비스 패브릭 프로젝트에서이 문제를 해결했습니다. 이 블록의 applicationManifest.xml 파일에서 지문을 업데이트하지 못했기 때문에이 오류가 발생했습니다. 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.