2016-07-19 2 views
0

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에서 호출하지만 링크를 찾을 수 없습니다 함께 할 수있는 뭔가가있을 수 있습니다 제안 어딘가에 기사를 찾아 기억한다.

정말 찾고 있어요 : 그것은하지 않도록

  • 어떻게 내 코드 확인을 보장하기 위해 인증서를로드하는 데 6 초하지 않도록 내 사용자 로그인을 해결하는 방법

    1. 다시 또는 시스템 어떤 도움

    감사를 사용하는 다른 사용자에 발생합니다.

  • 답변

    0

    이 문제는 지금 해결하고 난가 나는 이유를 이해 생각 !

    X509Certificate를 개인 키로로드하면 Windows는 파일에 키를 저장하고 '데이터 보호'를 사용하여 파일을 암호화합니다 (따라서 모니터링 한 DPAPI에 대한 호출).

    https://technet.microsoft.com/en-us/library/cc962112.aspx

    파일을 암호화하는 데 사용되는 키는 '마스터 키'라고합니다. 사용자 로그인을 기반으로하며 사용 암호를 변경할 때마다 갱신됩니다. 또한 90 일 후에 자동으로 만료됩니다. 위의 링크에서 설명 된 바와 같이

    http://www.passcape.com/index.php?section=docsys&cmd=details&id=28#33

    는, 마스터 키는 다음 디렉토리에 저장됩니다

    %APPDATA%/Microsoft/Protect/%SID% 
    

    내가보고 내의 MasterKey 실제로 90 일이 지난 것을 볼 수 있었다 해당 디렉토리에있는 파일의 '마지막으로 수정 한 날짜'. 따라서 인증서를로드 할 때마다 개인 키를 암호화 된 파일에 저장하려고 시도했으며 마스터 키가 유효 기간이 지났기 때문에 시도한 다음 업데이트하려고했습니다.

    필자는 ProcMon을 사용했지만 필자의 테스트 응용 프로그램에서 활동을 필터링하지 않았습니다. 그런 다음 Active Directory 서버에 대한 수많은 UDP 호출이 보안 및 암호 업데이트와 관련된 lsass.exe라는 프로세스에 의해 '갭'동안 만들어지고 있음을 알 수있었습니다 (스택 오버플로로 인해 다른 링크를 게시 할 수 없음). 제한하지만 쉽게 검색 할 수 있음).

    마스터 키를 업데이트하는 과정에서 ActiveDirectory 서비스에 대한 상호 작용이 필요하다고 생각합니다.

    원격으로 작업하고 VPN을 통해 회사 네트워크에 연결합니다. VPN은 ActiveDirectory 서버에 대한 액세스를 허용하지 않으므로 지연은 해당 서버에 대한 액세스 시도와 실패로 인해 발생했다고 생각합니다.

    나는 사무실에 내 다음 방문 때까지 기다렸다 최대한 빨리 네트워크에 연결하고 액티브 디렉토리 서버에 액세스 할 수 있기 때문에 다음로드 인증서의 지연이 사라졌다. MasterKey 파일도 업데이트되어 더 이상 유효하지 않습니다.

    은 내가 VPN을 통해 연결 및 지연이 여전히이 그만큼 마스터 키가 최신이 아니므로 OK인지 확인하는 것처럼 보인다 사라로드하는 동안 인증서를 다시 테스트.

    Active Directory 서비스에 액세스 할 수없는 것과 같은 문제로 인해 불행히도 VPN을 통해 암호를 변경할 수 없습니다.

    내 문제가 해결되었습니다. 나는 그것이 아마 상당히 유일하다고 인정하지만 나의 조사의 세부 사항이 어떤 시점에서 다른 누군가에게 도움이되기를 바랍니다!

    관련 문제