2016-09-15 3 views
2

나는 X509Store와 그의 친구들 X509Certificate2X509Certificate2Collection을 사용 해왔다. 모든 것은 괜찮 았지만 코드에 대한 테스트를 작성하기 시작했고 문제가 발생했습니다. 새 테스트 인증서를 생성하고 각 테스트를 시작하기 위해 설치 한 다음 끝에 테스트 인증서를 제거하십시오. 테스트 인증서는 생성 일이 과거에 만료되고 만료 날짜가 미래에도 발생 함에도 불구하고 비 결정 론적으로 유효하지 않습니다.X509Store를 올바르게 사용하는 방법은 무엇입니까?

전체 GC를 실행하고 TearDown에서 finalizers를 기다리는 것이 테스트를 수정한다는 것을 알았습니다.

여기에서 참조 소스를 파고 있습니다. X509Certificate2을 삭제해야하는 것 같습니다. 그렇지 않으면 저장소에 추가하는 등 성공을 이미 반환 한 작업을 실제 저장소로 플러시 할 수 없습니다. Windows API의 동작은 CertCloseStoreCRYPT_E_PENDING_CLOSE 결과를 참조하십시오.

X509Certificate2Collection은 기본적으로 단지 List<X509Certificate2> 인 것 같습니다. 따라서 이러한 인증서 목록이 생성 될 때마다 저장소의 Certificates 속성을 읽는 것처럼 모든 인스턴스를 삭제해야합니다. Find 방법을 사용하는 경우 또한

는이 임시 저장소를 만드는 인증서 표시를 추가하고 관리되지 않는 코드에서 다시 밖으로 다시 인증서 표시를 읽고, 모든해야 인증서 표시의 새 컬렉션을 만드는 작업이 포함됩니다 폐기.

실제로 이것은 X509Store을 사용하는 올바른 방법입니까? .NET API가 사일런트 실패와 사방에 완전히 문서화되지 않은 실패 모드로 올바르게 사용하기에는 너무 위험하고 어렵 기 때문에 믿을 수없는 것처럼 보입니다. 나는 명백한 무언가를 놓치고 있는가, 아니면이 수업들을 모두 피해야 하는가?

+2

[문서에 나와 있습니다.] (https://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509store (v = vs.110) .aspx) :'Starting 이 유형은 .NET Framework 4.6에서 IDisposable 인터페이스를 구현합니다. 유형 사용이 끝나면 직접 또는 간접적으로 폐기해야합니다 .' –

+0

'using '을 사용할 수 없습니까? – starmandeluxe

답변

1

문서화되지 않은 오류 모드는 무엇입니까? 당신은 자신이 소유 한 모든 일회용 물건을 처분해야합니다. 이것은 특히 을 알고있을 때 네이티브 코드를 처리 할 때 적용됩니다. 이것은 인증서 인터페이스에만 해당되는 것은 아닙니다. 파일은 동일한 방식으로 작동하며 데이터베이스 트랜잭션은 동일한 방식으로 작동하며 소켓은 동일한 방식으로 작동합니다. 이것이 바로 IDisposable 인터페이스가 존재하는 이유입니다. "완료되면 전화 해주세요"라는 일반적인 인터페이스입니다. 파일을 닫으라는 메시지가 나타나면 파일 I/O 사용을 중단 했습니까? 파일을 닫으시겠습니까? 아니면 아직 필요하다는 것을 눈치 채지 못하셨습니까?

SChannel을 다루는 전체 암호화 모듈은 SChannel 상단의 얇은 래퍼 이상입니다. 즉, 네이티브 interop, 네이티브 객체에 대한 관리되는 래퍼 등 거의 모든 일이 있습니다.

그러나 정확한 문제는 중요하지 않습니다. 요점은 여전히 ​​일회용품을 처분해야한다는 것입니다. 네가하지 않는다고해도 일들이 일종의 것처럼 보이기 때문에 물건 처분을 생략해도 괜찮은 것은 아니다.

+0

그래,하지만 나는 그걸 소유하지 않아. 방금 가게에서 물건을 읽었 어. 그렇다고해서 갑자기 상점의 모든 인증서 사본을 소유하고있는 것은 아닙니다. 그리고 Find 메서드는 내가 갑자기 다른 복사본을 소유하고 있다고 제안하지 않습니다. 인터페이스는 내가 사물의 소유권을 갖거나 심지어 모든 자원이 만들어 졌다는 것을 사소한 것으로 나타내지는 않습니다.이것이 .NET 4.6 이전에 어떻게 사용되어 졌는지는 말할 것도 없습니다. 또는 무서운 "무작위로 성공한 작전"이 일종의 일이 아닌지를 확인하는 것과 같습니다. 컬렉션 자체는 일회용이 아닙니다. – Puppy

+0

@Puppy 음, 설명서를 읽어야합니다. 저장소는 닫혀 있어야합니다 (.NET 2.0 문서 이후로 항상 사용 후 X.509 인증서 저장소를 닫아야합니다). 그리고 처음부터 Close 메소드가있었습니다. 물론 원래 상점에 IDisposable을 포함시키지 않는 것이 감독이었습니다. 그러나 나는 아직도 당신이 언급 한 다른 모든 시나리오에서 무서운 "무작위로 성공한 작업이 발생하지 않았다"는 것을 고려하지 않는다는 점이 흥미 롭다. (그리고 나는 언급하지 않았다.) .NET은 * managed * 객체에 대한 보증 만 제공합니다. X509 저장소는 관리되지 않습니다. – Luaan

+0

그 밖의 모든 경우에서 정확성은 결코 만들지 않으려 고 의도 한 적이없는 다른 개체를 처분하는 것에 달려 있습니다. – Puppy

관련 문제