2010-06-29 2 views
6

계정이없는됩니다 오류가 발생하지만 키 컨테이너의 권한에는 영향을 미치지 않습니다.시도는 키에 액세스 할 수 있도록 내가 프로그래밍 방식에서 NetworkService을 허용하기 위해 다음 코드를 사용하고 효과

그러나, 명령 행 도구를 사용하여 같은 일을 할 경우 aspnet_regiis, 완벽하게 작동합니다 :

aspnet_regiis -pa "MyEncryptionKey" "NetworkService" 

나는 전체 관리자 권한으로 실행하는거야 - 나는 그 권한으로 실행하지 않는 경우는 예외입니다 던져. 또한 처음에 키를 생성 한 사용자로 실행 중입니다. 의 SID, S-1-5-20이 목록에 추가됩니다을 경우 aspnet_regiis와

S-1-5-18   -> LocalSystem 
S-1-5-32-544  -> Administrators 
S-1-5-5-0-135377 -> MyUser 

:

주요 컨테이너는 항상 다음 액세스 규칙을 가지고있다. 코드에서 영향을 미칠 수 없습니다.

sap에서 보안 식별자를 문자열 형식으로 만들려고 시도했지만 AddAccessRule 대신 SetAccessRule을 사용하려고 시도했습니다.

어떤 아이디어가 코드에서 실제로이 ACL 목록에 영향을 주나요?

답변

10

지속성을 호출하지 않는 것 같습니다. CryptoKeySecurity에 대한 변경 사항은 실제로 즉시 저장되지 않습니다. 실제로 변경 내용을 저장하려면 Persist(...) 메서드 중 하나를 사용해야합니다.

NativeObjectSecurity.Persist Method (String, AccessControlSections)

이러한 API의의가 변형 다소 복잡한 방법을 따르 보인다. 먼저 CspParameters를 만들고 필요한 변경 사항을 적용한 다음 해당 매개 변수에서 공급자를 구성해야합니다. Construction은 컨테이너에 대한 업데이트를 호출합니다.

var params = new CspParameters 
{ 
    KeyContainerName = "MyEncryptionKey", 
    Flags = CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore  
}; 

params.CryptoKeySecurity.AddAccessRule(
    new System.Security.AccessControl.CryptoKeyAccessRule(
    new SecurityIdentifier(WellKnownSidType.NetworkServiceSid, null), 
    CryptoKeyRights.GenericAll, 
    AccessControlType.Allow 
) 
); 

var RSA = new RSACryptoServiceProvider(params); 
+0

슬프게도 모든 Persist 메서드는 보호됩니다. –

+0

CspParameters를 사용하여 공급자를 만들기 전에 보안을 수정해야하는 것처럼 보입니다. CspParameters는 RSACryptoServiceProvider에 전달 될 때 persist를 호출합니다. API를 구축하는 이상한 방법이지만, 문서에 따르면, 그것이 어떻게 작동하는 것 같습니다. 답변이 반영되도록 업데이트되었습니다. – jrista

+4

그게 바로 궤도에있어. 위에 사용 된 CryptoKeySecurity 속성은 null이므로 throw됩니다. 새로운 것을 생성 할 수는 있지만 이미 존재하는 모든 권한을 없애 버립니다 (이것이 처음 실제 효과 였기 때문에 이제는 주키 스토어에서 잠겼습니다). 하지만 ... 키 저장소에서 키를 얻은 다음 RSA.CspKeyContainerInfo (공급자 이름 및 유형, 컨테이너 이름 및 CryptoKeySecurity 포함)에서 값을 복사하여 새 CspParamters를 만든 다음 수정하여 다른 RSA를 만들 수 있습니다 키 개체는 cspparameters를 사용하여, 그리고 완료, 모두 완료. simples ...? –