다음을 통해 공유


표준 .NET 애플리케이션에서 X509Certificate를 사용하여 PFX 파일 설치

이 문서는 표준 .NET 애플리케이션에서 사용하여 X509Certificate PFX 파일을 설치할 때 예외를 해결하는 데 도움이 됩니다.

원래 제품 버전: .NET Framework
원래 KB 번호: 950090

증상

표준 .NET 애플리케이션은 다음 예제와 같은 코드와 함께 또는 X509Certificate 클래스를 사용하여 X509Certificate2 프로그래밍 방식으로 PFX 파일(PKCS12)에 인증서를 설치하려고 합니다.

X509Certificate2 cert = new X509Certificate2("a.pfx", "password");
X509Store store = new X509Store(StoreName.My);
store.Open(OpenFlags.ReadWrite);
store.Add(cert);

또는

X509Certificate2 cert = new X509Certificate2("a.pfx", "password", X509KeyStorageFlags.MachineKeySet);
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(xCertificate);

다른 애플리케이션 내에서 인증서의 프라이빗 키를 사용하려고 할 때 다음과 같은 유형의 예외가 발생합니다.

처리되지 않은 예외: System.Security.Cryptography.CryptographicException: 키 집합이 없습니다.
at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters 매개변수, Boolean randomKeyContainer)
at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
에서 System.Security.Cryptography.RSACryptoServiceProvider. ctor(Int32 dwKeySize, CspParameters 매개 변수, Boolean useDefaultKeySize)
에서 System.Security.Cryptography.RSACryptoServiceProvider. ctor(CspParameters 매개 변수)
at System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey()
C:\UseCertPrivateKey\Program.cs:line 20의 UseCertPrivateKey.Program.Main(String[] args)에서

원인

인증서가 또는 X509Certificate 클래스 X509Certificate2X509CertificateX509Certificate2 사용하여 설치되거나 기본적으로 프라이빗 키를 가져오는 임시 컨테이너를 만드는 경우 프라이빗 키에 대한 참조가 더 이상 없으면 프라이빗 키가 삭제됩니다.

해결 방법

프라이빗 키에 대한 영구 키 컨테이너를 만들려면 .NET에서 키 X509KeyStorageFlags.PersistKeySet 컨테이너를 삭제하지 못하도록 플래그를 사용해야 합니다. 대신 다음 코드를 사용해야 합니다.

X509Certificate2 cert = new X509Certificate2("a.pfx", "password", X509KeyStorageFlags.PersistKeySet);
X509Store store = new X509Store(StoreName.My);
store.Open(OpenFlags.ReadWrite);
store.Add(cert);

또는

X509Certificate2 cert = new X509Certificate2("a.pfx", "password", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(xCertificate);