다음을 통해 공유


Windows 프라이빗 키 기본 수명

Windows에서 워크로드가 PKCS#12/PFX를 로드하는 동시에 PersistKeySet 또는 EphemeralKeySet의 스토리지 옵션을 설정하지 않는 경우, .NET은 더 이상 프라이빗 키가 필요하지 않으며 지워야 하는 시기를 결정합니다. 두 개의 서로 다른 논리 집합이 이전 버전의 .NET(및 .NET Framework)에서 사용되었습니다. 단일 논리 집합이 .NET 9에 있습니다.

이전 동작

이전에, 인증서(및 해당 프라이빗 키)를 new X509Certificate2(pfx, password, flags)(으)로 PKCS#12/PFX에서 로드하는 경우, 로드된 인증서가 프라이빗 키의 수명을 나타냅니다. 이러한 인증서 개체가 삭제(되었거나 삭제하지 않은 상태로 가비지 수집)된 경우에는 종료 시 연결된 프라이빗 키가 삭제되었습니다. 공유 소유권 또는 소유권 이전은 발생하지 않았습니다.

인증서(및 해당 프라이빗 키)를 PKCS#12/PFX에서 X509Certificate2Collection.Import(pfx, password, flags)(으)로 로드 시, 프라이빗 키를 가진 각 로드된 인증서는 단일 인증서 로드와 마찬가지로 수명을 추적합니다. 하지만 덧붙여 모든 복사본이 프라이빗 키 수명도 추적하기 위해 인증서의 네이티브 복사본에 마커를 배치해야 한다는 것을 나타냅니다. 두 번째 X509Certificate2 개체를 만들기 위해 동일한 기본 PCERT_CONTEXT 값을 사용한 경우에는 먼저 다른 복사본 아래에서 삭제되었거나 완료된 복사본이 프라이빗 키를 지웠습니다.

다음과 같은 코드가 실패했으며(CryptographicException 또는 NullReferenceException), 이는 프라이빗 키가 삭제되었기 때문입니다.

X509Certificate2Collection coll = new X509Certificate2Collection(pfx, password, X509KeyStorageFlags.DefaultKeySet);
X509Certificate2Collection coll2 = coll.Find(X509FindType.FindBySubjectName, "", false);

coll2 = null;
GC.Collect();
GC.WaitForPendingFinalizers();

using (RSA key = coll[0].GetRSAPrivateKey())
{
    key.SignData(pfx, HashAlgorithmName.SHA256, RSASignaturePadding.Pss);
}

새 동작

수명은 .NET 9부터 PKCS#12/PFX 로드에서 직접 생성된 X509Certificate2 인스턴스와 항상 연결됩니다.

이전 동작 섹션의 동일한 코드 조각이 성공합니다.

도입된 버전

.NET 9 미리 보기 7

호환성이 손상되는 변경의 형식

이 변경 사항은 동작 변경입니다.

변경 이유

PKCS#12/PFX를 로드하는 대부분의 워크로드는 단일 인증서 로드를 사용하며 해당 메서드 관련 수명 메커니즘을 이해하고 있습니다. 컬렉션 부하 관련 메커니즘은 종종 놀라우며, 가끔은 조기 키 삭제를 발생시킬 수 있습니다.

컬렉션 로드 수명 관리를 이해하고 있으며 키 삭제를 발생시키기 위해 클론에서 Dispose을(를) 호출하는 데 의존하는 경우, 원래 로드된 개체를 호출하거나 (대신) Dispose을(를) 호출하는지 여부를 확인하세요.

영향을 받는 API