TLS/SSL을 사용하여 통신하는 C#, .NET4.5.2 클라이언트/서버 시스템을 개발했습니다. 인증서는 파일에서로드됩니다. 나는 'MakeCert'유틸리티를 사용하여 .pvk 및 .cer 파일을 생성 한 인증서 파일을 생성 한 다음 'pvk2pfx'유틸리티를 사용하여 .pfx 파일로 결합했습니다. 인증서의 부하가 될 것을 나는 시간이 지남에 나타났습니다X509Certificate 생성자가 특정 사용자에 대해 6 초 이상 실행합니다.
X509Certificate2(string filePath, string password)
:
는 문자열로 파일 경로와 암호를 전달하는 내가 과부하로 X509Certificate2 생성자를 사용하여 그들을로드 인증서를 사용하려면 아주 느린. PFX 파일을 느리게 만들거나 점진적으로 만들었지 만 PFX 파일을로드하는 데는 최대 약 6 초가 걸리는 '이벤트'가 있는지 확실하지 않습니다. CER 파일을로드하는 데는 문제가 없으며 ~ 0.1 초 정도 걸립니다.저는 Windows 8.1을 실행 중이며 문제는 랩톱에서 내 사용자 로그인에만 해당됩니다.
private const string filePath = @"c:\testcert.pfx";
private const string password = "testpassword";
static void Main(string[] args)
{
var stopwatch = new Stopwatch();
try
{
Console.WriteLine("About to create certificate. Press Enter.");
Console.ReadLine();
stopwatch.Start();
var cert = new X509Certificate(filePath, password);
stopwatch.Stop();
Console.WriteLine(stopwatch.Elapsed);
Console.WriteLine("Certificate created. About to reset. Press Enter.");
Console.ReadLine();
cert.Reset();
Console.WriteLine("Certificate reset. Press Enter.");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
내가 자신의 PC에서 프로그램을 실행하는 일부 동료에게 물었다 :
나는이 문제를 확인하려면 다음 테스트 애플 리케이션을 썼습니다. 또한 VM 내에서 실행하고 내 자신의 랩톱에서 새 사용자를 설정하려고했습니다. 모든 경우에 ~ 0.1 초 후에 실행되었지만 정상적인 사용자 로그인의 경우 6 초 이상 실행됩니다.
처음에는 인증서의 'Reset()'을 호출하지 않았으므로 어딘가에 임시 파일과 관련된 문제가있을 수 있으므로 procmon을 사용하여 무슨 일이 일어나고 있는지 확인했습니다.
C:\Users\<username>\AppData\Roaming\Microsoft\Crypto\RSA\<SID>
그냥 확실하게 내가 삭제 시도했다 : 나는 (그들이 최대 정돈있어 있지만 응용 프로그램이 다시 설정하기 위해 호출하지 않고도 종료 할 때()) 일부 임시 파일은 다음 디렉토리에 생성되고 있다고 확인 이 디렉토리에있는 파일은 아무런 차이가 없습니다.
procmon을 사용하면로드가 빠른 시스템에서 발생하지 않는 인증서로드 중 파일/레지스트리 활동에 2 개의 갭이 있음을 알 수 있습니다. 첫 번째는 'dpapi.dll'을 사용하려고 시도한 직후입니다. 두 번째는 'C : \ Extend \ $ UsnJrnl : $ J : $ DATA'로 읽은 후입니다. DPAPI.dll은 Windows Data Protection의 인터페이스입니다. 후자의 파일은 파일 변경을 기록하는 NTFS 용 USN 저널입니다. 나는 어느 쪽이든에 전문가가 아니고 어느 쪽이든 관련이 있는지 확실하지 않다!
다음 API 호출 http://www.rohitab.com/apimonitor을 사용하여 시스템 호출을 관찰 해 보았습니다. 다시는 전문가가 아니지만 일시 중지 직전에 어떤 일이 발생했는지 알기 위해 트롤링했습니다. 거기에 많이 관련이있을 수도 있고 그렇지 않을 수도 있습니다 이해가 안되며 문제에 집중할 수 있도록 의견을 환영합니다. 나는에 어려운 찾을
# Time of Day Thread Module API Return Value Error Duration
64922 6:38:44.348 AM 1 DPAPI.dll SystemFunction040 (0x00ac5a30, 8, RTL_ENCRYPT_OPTION_SAME_LOGON) STATUS_SUCCESS 0.0000402
64923 6:38:44.349 AM 1 CRYPTBASE.dll RtlInitUnicodeString (0x0090e5a8, "\Device\KsecDD") 0.0000004
64949 6:38:44.349 AM 1 RPCRT4.dll RtlInitUnicodeString (0x0090e0b0, "\RPC Control\protected_storage") 0.0000000
:
이# Module Address Offset Location
1 RPCRT4.dll 0x74f6378b 0x2378b I_RpcSendReceive + 0x1bb
2 RPCRT4.dll 0x74f6367b 0x2367b I_RpcSendReceive + 0xab
3 RPCRT4.dll 0x74f594df 0x194df NdrServerInitializeNew + 0x83f
4 RPCRT4.dll 0x74f63619 0x23619 I_RpcSendReceive + 0x49
5 RPCRT4.dll 0x74f6398b 0x2398b NdrSendReceive + 0x2b
까지 높은 잠재적으로 흥미 선이 될 것으로 보인다 :
2 제 2 간극 전에 마지막 호출은 다음과 같은 호출 스택과 함께 방어 적이기입니다 callstack을 추적하지만, 이것이 궁극적으로 CryptQueryObject라는 함수에서 오는 것이라고 생각합니다.
관련성이있을 수 있지만 Windows8.1이 아닌 다음 문서를 발견했습니다. 난 그냥 % windir % \ Temp 폴더를 삭제했지만 또한 도움이되지 않았습니다.
https://support.microsoft.com/en-gb/kb/931908
나는 지연이 액티브 디렉토리는 CryptQueryObject에서 호출하지만 링크를 찾을 수 없습니다 함께 할 수있는 뭔가가있을 수 있습니다 제안 어딘가에 기사를 찾아 기억한다.
정말 찾고 있어요 : 그것은하지 않도록
- 다시 또는 시스템 어떤 도움
감사를 사용하는 다른 사용자에 발생합니다.