2017-04-27 115 views
0

在我当前的ASP.NET核心项目中,我使用Azure Active Directory身份验证和X509Certificate来访问密钥保管库。需要在机器上安装证书以允许应用程序访问它并最终从Key Vault读取值。现在我正在将此应用程序迁移到Azure Service Fabric。我上传的证书修饰手臂模板库的关键,通过添加:从Azure服务结构中托管的ASP.NET核心应用程序访问Azure密钥保管库

"osProfile": { 
    "secrets": [ 
     { 
      "sourceVault": { 
      "id": "{KeyVaultIdHere}" 
      }, 
      "vaultCertificates": [ 
      { 
       "certificateUrl": "{CertificateUrlHere}", 
       "certificateStore": "My" 
      } 
      ] 
     } 
     ] 
}, 

但是当我部署我的应用程序Azure的服务织物好像它没有获得证书。我是否正确理解当我使用此类ARM模板创建群集时,正在安装证书LocalMachine\My存储?如果是,是否有可能,在哪个应用程序运行的操作系统用户没有权限访问私钥?当我在本地计算机上运行集群时,我必须给予ASF本地集群用户特殊权限才能读取私钥。也许Azure上的ASF需要完成相同的工作?怎么办?提前致谢。

+0

我已经远程从ASF集群虚拟机,事实证明,这个证书上缺少私钥许可。但我无法手动设置它,因为“管理员”对此证书只具有“读取”权限。出于这个原因,我将尝试修改ARM模板,以便“解除”运行ASF群集的NETWORK_SERVICE的私钥。 –

+0

“NETWORK_SERVICE”的ACL应该在配置证书时自动完成。访问KeyVault的代码如何?也许你的方法是默认查看'cert:\ currentuser \ my',这对SF来说当然是不正确的! – Mardoxx

+0

我的方法确实在看'localmachine/my'商店。当我运行ASF本地集群时,它工作正常。有趣的是,你提到的是,NETWORK_SERVICE应该可以访问使用ARM模板安装的这种证书的私钥。显然,它没有。只有'System'完全可以访问它。还提到了'Administrators'组,但只有'Read'权限。 –

回答

1

好的,所以解决方法是修改ARM模板,使其能够访问NETWORK SERVICE用户的证书私钥。为此,需要编写适当的PowerShell(如:https://social.technet.microsoft.com/Forums/windowsserver/en-US/1557e379-26a8-46d0-bf26-d32176395085/how-to-grant-permission-to-private-key-from-powershell?forum=winserverpowershell),并在ARM模板(virtualMachineProfile/extensionProfile/extensions)中附加CustomScriptExtension。它只能在ARM部署期间完成,因为由于某些原因,Administrators只有通过ARM模板安装的证书才能访问Read

0

这是我的一个应用程序的应用程序清单之一。

<?xml version="1.0" encoding="utf-8"?> 
<ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="S-Innovations.ServiceFabric.GatewayApplicationType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric"> 
    <Parameters> 
    <Parameter Name="GatewayService_InstanceCount" DefaultValue="-1" /> 
    <Parameter Name="AzureADServicePrincipal" DefaultValue="" /> 
    <Parameter Name="TenantId" DefaultValue="" /> 
    <Parameter Name="ApplicationStorageAccountId" DefaultValue="" /> 
    <Parameter Name="AzureResourceManagerCertThumbrint" DefaultValue="C03BB5A6410741CDD2927B4FF88C3E67215A393B" /> 
    <Parameter Name="Azure.KeyVault.Uri" DefaultValue="https://earthml-core-k3ci.vault.azure.net/" /> 
    <Parameter Name="ASPNETCORE_ENVIRONMENT" DefaultValue="Development" /> 
    </Parameters> 
    <!-- Import the ServiceManifest from the ServicePackage. The ServiceManifestName and ServiceManifestVersion 
     should match the Name and Version attributes of the ServiceManifest element defined in the 
     ServiceManifest.xml file. --> 
    <ServiceManifestImport> 
    <ServiceManifestRef ServiceManifestName="S-Innovations.ServiceFabric.GatewayServicePkg" ServiceManifestVersion="1.0.0" /> 
    <ConfigOverrides> 
     <ConfigOverride Name="Config"> 
     <Settings> 
      <Section Name="AzureResourceManager"> 
      <Parameter Name="AzureADServicePrincipal" Value="[AzureADServicePrincipal]" IsEncrypted="true" /> 
      <Parameter Name="TenantId" Value="[TenantId]" /> 
      <Parameter Name="ApplicationStorageAccountId" Value="[ApplicationStorageAccountId]" /> 
      <Parameter Name="Azure.KeyVault.Uri" Value="[Azure.KeyVault.Uri]" /> 
      </Section> 
     </Settings> 
     </ConfigOverride> 
    </ConfigOverrides> 
    <EnvironmentOverrides CodePackageRef="Code"> 
     <EnvironmentVariable Name="ASPNETCORE_ENVIRONMENT" Value="[ASPNETCORE_ENVIRONMENT]" /> 
    </EnvironmentOverrides> 
    <Policies> 
     <RunAsPolicy CodePackageRef="Code" UserRef="Admin" EntryPointType="All" /> 
    </Policies> 
    </ServiceManifestImport> 
    <DefaultServices> 
    <!-- The section below creates instances of service types, when an instance of this 
     application type is created. You can also create one or more instances of service type using the 
     ServiceFabric PowerShell module. 

     The attribute ServiceTypeName below must match the name defined in the imported ServiceManifest.xml file. --> 
    <Service Name="GatewayService"> 
     <StatelessService ServiceTypeName="GatewayServiceType" InstanceCount="[GatewayService_InstanceCount]"> 
     <SingletonPartition /> 
     </StatelessService> 
    </Service> 
    <Service Name="GatewayServiceManagerActorService" GeneratedIdRef="ef5ab963-c061-486e-bb1c-84bf1c2fc7e1|Persisted"> 
     <StatefulService ServiceTypeName="GatewayServiceManagerActorServiceType"> 
     <UniformInt64Partition PartitionCount="2" LowKey="-9223372036854775808" HighKey="9223372036854775807" /> 
     </StatefulService> 
    </Service> 
    </DefaultServices> 
    <Principals> 
    <Users> 
     <User Name="Service1" AccountType="NetworkService" /> 
     <User Name="Admin"> 
     <MemberOf> 
      <SystemGroup Name="Administrators" /> 
     </MemberOf> 
     </User> 
    </Users> 
    </Principals> 
    <Policies> 
    <SecurityAccessPolicies> 
     <SecurityAccessPolicy ResourceRef="MyCert" PrincipalRef="Service1" ResourceType="Certificate" /> 
    </SecurityAccessPolicies> 
    </Policies> 
    <Certificates> 
    <SecretsCertificate X509FindValue="[AzureResourceManagerCertThumbrint]" Name="MyCert" /> 
    </Certificates> 
</ApplicationManifest> 

我一直在使用那个没有任何你提到应用程序没有访问证书的问题。也许这可以帮助你使你的手臂脚本更简单:)

相关问题