以下是我如何在没有Azure密钥保管库的情况下在Service Fabric中执行加密和解密。由于我们正在加密的数据没有改变,因此决定是使用证书加密这些值并将这些值放入正确的xml文件中。
- 生成或获取X509证书。确保KeyUsage具有“DataEncipherment”指示,这对数据加密至关重要
- 获取证书的指纹。你可以在你的MMC证书插件中得到这个。
- 使用powershell,使用PowerShell中的Invoke-ServiceFabricEncryptedText函数对文本进行加密。使用cert的指纹来加密文本。这将创建包含基本64位字符串的文本的加密,该字符串包含秘密密文以及有关用于加密它的证书的信息。这很关键!此外,使用证书在加密字符串上运行Inoke-ServiceFabricDecryptText方法以确保解密正确是个好主意。
- 现在来了一个有趣的部分,以正确的方式将其放入所有的XML文件,以使其发挥作用。 (这是它变得混乱的地方)。
- 首先您需要修改settings.xml文件。您想要加密的参数需要设置为IsEncrypted =“true”Value =“”和MustOverride =“true”。
- 接下来,您需要在ApplicationManifest.xml文件中声明override参数。确保应用程序清单中的参数名称与settinss中的相同。在applicationmanifest.xml文件的Parameters部分设置参数的名称,并设置value =“”。
- 在ConfigurationOverride部分中您引用了参数名称,将该值设置为参数部分中的参数。目前这将是空白的,还设置了IsEncrypted =“true”。
- 这是我卡住的地方。所有这些其他信息都很容易获得,下一节没有。接下来,在项目下的ApplicationParameters文件夹中,选择发布到服务结构时使用的XML文件。这是你将放置加密值。在本节中创建一个参数,将名称设置为您在ApplicationManifest中给出的名称,并将该值设置为从证书生成的加密值。
在部署该参数将被传递进来的加密值。要在代码中使用它,你需要确保你引用了DecryptValue。例如:
var decryptedPassword= configurationPackage.Settings.Sections["sectionname"].Parameters["ConnectionString"]>DecryptValue();
这将产生一个SecureString的,你可以在你的代码中使用。我使用众多参考之一将该值转换为字符串,以便如何将SecureString转换为可在线使用的字符串。
就是这样。我希望这可以帮助不使用Azure密钥保管库的其他人保护秘密。
约翰
其打造您使用的是旧的XAML构建或vNext建? –
我们正在使用vNext构建过程。 – john