2017-01-31 3 views
0

저는 C#을 처음 사용합니다. 왜 문제가 발생하는지 이해할 수 없었습니다.CryptographicException : 키가 지정된 상태에서 사용하기에 유효하지 않습니다.

  CspParameters cspParams = new CspParameters(24); 
      cspParams.KeyContainerName = "XML_DISG_RSA_KEY"; 
      RSACryptoServiceProvider key = new RSACryptoServiceProvider(cspParams); 

아래의 코드는 내 로컬 설정에서 올바르게 작동합니다. 하지만 클라이언트에서 작동하지 않습니다.

그들은 예외입니다.

[CryptographicException : 키가 지정된 상태에서 사용하기에 유효하지 않습니다. ]

System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer) +4644432 
    System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle) +69 
    System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair() +92 
    System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize) +173 
    System.Security.Cryptography.RSACryptoServiceProvider..ctor(CspParameters parameters) +14 

도와 주시겠습니까?

답변

0

고객 중 한 명과 비슷한 코드 (UseExistingKey기를 지정했거나 지정하지 않은 상태)와 동일한 오류 메시지가 나타났습니다. 그들은 이전 도메인에서 새로운 도메인으로 모든 사용자를 이동 한 후 대략이 오류가 발생하는 것처럼 보였습니다. 특정 원인을 식별 할 수 없었지만 키 컨테이너 파일의 소유권 변경 (또는 이전 사용자 ID와 일치하는 키 컨테이너 파일이 시스템에있는 이전 도메인에서 여전히 발견됨)이 보안을 침해했을 가능성이 있습니다 RSACryptoServiceProvider (또는 crypto API 또는 관리되지 않는 기본 구현에 있음).

우리는 궁극적으로 다른 컴퓨터의 테스트 코드를 사용하여 수동으로 키 컨테이너 파일 이름 (CspKeyContainerInfo.UniqueKeyContainerName)을 확인한 다음 오류를 일으키는 잘못된 컨테이너 파일을 삭제하여 해결했습니다. CspParameters에 지정한 KeyContainerName은 매번 동일한 32 진수 파일 이름 접두어로 매핑되며 파일 이름의 나머지는 분명히 해당 파일을 만든 사용자에게 고유합니다. 컨테이너 파일은 컴퓨터 키 저장소 (UseMachineKeyStore 플래그가 지정된 경우) 또는 사용자의 키 저장소에서 해당 로밍 응용 프로그램 데이터 (일반적으로 C : \ Users \ userName \ AppData \ Roaming \ Microsoft \ Crypto \ ...)에 저장됩니다. .

다른 키 컨테이너 파일을 손상시키지 마십시오. 컴퓨터에서 다른 앱이나 서비스가 중단 될 수 있습니다.

새 키를 만들 때 생성자 호출에서 키 크기를 지정하면 도움이되는지 확인할 수도 있습니다. 1024 또는 2048 일을 시도해보십시오.