2016-06-03 3 views
6

일부 비밀을 검색하기 위해 Azure Key Vault로 인증 할 코드가 있습니다. 클라이언트 ID와 비밀 대신 클라이언트 ID와 인증서를 사용하여 인증합니다. 이 코드는 일반 콘솔 응용 프로그램에서 잘 작동 :로컬 클러스터에 대한 인증서 설치

var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); 
try 
{ 
    store.Open(OpenFlags.ReadOnly); 

    var matchingCertificates = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false); 
    if (matchingCertificates.Count != 1) 
    { 
     return null; 
    } 

    return matchingCertificates[0]; 
} 
finally 
{ 
    if (store != null) store.Close(); 
} 

을 최대한 빨리 더 이상 인증서를 찾을 수있는 상태 서비스 응용 프로그램에서이 코드를 사용하려고한다.

인증서를 로컬 클러스터에서 사용할 수 있도록 설치하려면 어떻게합니까?

답변

2

서비스 팩 응용 프로그램은 네트워크 서비스 계정에서 실행되므로 계정에 인증서에 대한 액세스 권한이 있는지 확인해야합니다.

편집 : 클러스터 로컬 상자에서 실행되는

당신이 그 인증서를 찾는 중 다음 스냅인을 마우스 오른쪽> 모든 작업을 클릭> 개인 키를 관리하고 certmgr.msc를 또는 관련 MMC를 사용하여 NETWORK SERVICE에 읽기 권한을 부여합니다.

Azure의 원격 클러스터의 경우 원하는 권한을 설정하는 PowerShell 스크립트를 실행하는 축척 세트의 VM에서 custom script extension을 사용하여 수행 할 수 있습니다. 예를 들어, 다음과 같이 할 수있다 :

$certificate = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Thumbprint -eq $certificateThumbprint} 

# Get file path 
$certificateFilePath = "C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\" + $cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName 

# Take ownership of the file so that permissions can be set 
takeown /F $certificateFilePath 

# Give the NETWORK SERVICE read permissions 
$acl = (Get-Item $certificateFilePath).GetAccessControl('Access') 
$rule = new-object System.Security.AccessControl.FileSystemAccessRule "NETWORK SERVICE","Read","Allow" 
$acl.SetAccessRule($rule) 
Set-Acl -Path $certificateFilePath -AclObject $acl 
+0

보기? – Dismissile

+0

네, 맞습니다. 수동으로 액세스 권한을 부여하는 대신 Service Fabric에서 ApplicationManifest.xml의 사용자, 그룹 및 액세스 정책을 정의하여 특정 인증서에 대한 액세스 권한을 자동으로 부여 할 수 있습니다. 이 설정에 대한 자세한 내용은이 문서를 참조하십시오. https://azure.microsoft.com/en-us/documentation/articles/service-fabric-application-runas-security/#a-complete-application-manifest-example –

+0

Can Service Fabric에서 인증서에 대한 액세스 권한을 부여하는 방법에 대한 자세한 내용을 제공합니까? 그 문서는 SSL 종단점 인증서에 대해 이야기하지만 그것은 나의 유스 케이스가 아니다. KeyVault 자원으로 인증하기 위해 인증서 개인 키를 사용하고 있습니다. – Dismissile

6

서비스 패브릭 구성하지 않고에 액세스 할 수없는, 네트워크 서비스 계정으로 실행되기 때문에이 그대로 작동하지 않는 이유는 증명서.

Microsoft.Azure.KeyVault에서 제공 한 KeyVaultClient을 사용하여 인증서를 사용하여 키 저장소에 연결할 때 최소한이 시나리오로 인해 "키 세트가 존재하지 않음"예외가 발생했습니다.

이 해결 방법은 ApplicationManifest.xml에 인증서를 포함시키는 것입니다.이 인증서는 Service Fabric에게 네트워크 서비스 계정에 인증서에 대한 액세스 권한을 부여하도록 지시합니다. 두 NetworkServiceAccountKeyVaultCert 사용자 및 인증서를 참조하도록 <SecurityAccessPolicy /> 요소에 의해 사용될 임의의 이름이다

<ApplicationManifest> 
    <!-- snip --> 
    <Principals> 
     <Users> 
     <User Name="NetworkServiceAccount" AccountType="NetworkService" /> 
     </Users> 
    </Principals> 
    <Policies> 
     <SecurityAccessPolicies> 
     <SecurityAccessPolicy ResourceRef="KeyVaultCert" PrincipalRef="NetworkServiceAccount" GrantRights="Full" ResourceType="Certificate" /> 
     </SecurityAccessPolicies> 
    </Policies> 
    <Certificates> 
     <SecretsCertificate X509FindValue="1ABCD86B815F37123459A34C1BA9EDEBABCEDF1" Name="KeyVaultCert" /> 
    </Certificates> 
</ApplicationManifest> 

....

그래서 아직도 한 그들에 액세스 할 수 있습니다로, 내 로컬 컴퓨터에 설치된 모든 인증서를 볼 수도 https://azure.microsoft.com/en-us/documentation/articles/service-fabric-application-runas-security/#a-complete-application-manifest-example

+0

이 대답이 더 깔끔하고 쉽게됩니다. 작동 완벽! – rfcdejong

+0

이 솔루션에서는 인증서 롤오버가 지원되지 않는 것으로 보입니다.Azure 서비스 패브릭은 포트를 "netsh http ssl remove .."와 같은 포트에서 등록 해제하지 않고 새 지문으로 응용 프로그램을 업그레이드하지 못합니다 ... – rfcdejong