我有一个具有以下结构的SF应用程序。
Application1
- ServiceA -> Deployed to NodeType1
- ServiceB -> Deployed to NodeType2
- ServiceC -> Deployed to NodeType2
- ServiceD -> Deployed to NodeType2
ServiceA 是一种侦听TCP端口的前端服务,具有一些特定的安全要求。因此,它部署在 NodeType1 。
上服务B,C& D 是后端服务,并部署到 NodeType2 。
ServiceA 要求NetworkServiceAccount可以访问仅在 NodeType1 中安装的证书。因为这不是端点证书,我正在尝试为此证书资源定义SecurityAccessPolicy。最初我尝试在AppManifest.xml中定义以下内容。
<Principals>
<Users>
<User Name="SfServiceUser" AccountType="NetworkService" />
</Users>
</Principals>
<Policies>
<SecurityAccessPolicies>
<SecurityAccessPolicy ResourceRef="TLS Certificate" PrincipalRef="SfServiceUser" ResourceType="Certificate" />
</SecurityAccessPolicies>
</Policies>
<Certificates>
<SecretsCertificate X509FindValue="[TlsCertificateThumbprint]" Name="TLS Certificate" />
</Certificates>
注册ApplicationType时,它失败并出现“服务结构错误:应用程序所需的ACL文件夹或证书失败。错误:FABRIC_E_CERTIFICATE_NOT_FOUND”。这是因为“TLS证书”仅安装在NodeType1中,但SF也在NodeType2中查找此证书。
作为一种解决方法,我尝试在AppManifest.xml的ServiceManifestImport部分中定义SecurityAccessPolicy,如下所示。
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="ProtocolGateway.Host.Fabric.FrontEndPkg" ServiceManifestVersion="1.0.0" />
<Policies>
<RunAsPolicy CodePackageRef="Code" UserRef="SetupAdminUser" EntryPointType="Setup" />
<RunAsPolicy CodePackageRef="Code" UserRef="SfServiceUser" />
<SecurityAccessPolicy ResourceRef="TLS Certificate" PrincipalRef="SfServiceUser" ResourceType="Certificate" />
</Policies>
</ServiceManifestImport>
但是这也失败了 - “SecurityAccessPolicy中的ResouceRef'TLS证书'无效。相应的ServiceManifest中没有匹配的资源。”
虽然ServiceManifestImport部分中的SecurityAccessPolicy接受ResourceType作为证书,但ServiceManifest不支持将证书定义为资源。仅支持EndPoint。
虽然我可以在一个ApplicationType中定义ServiceA,而在另一个ApplicationType中定义其他服务,但我不打算这样做,因为这些是相关服务,我想使用SF版本来管理升级和回滚。
请建议我替代处理此要求。