“云无界、端无边” OGeek 技术峰会 9月17日 南京不见不散! 了解详情
写点什么

在 Windows 和 Azure 中使用加密证书提高 web.config 的安全性

  • 2018 年 7 月 27 日
  • 本文字数:4645 字

    阅读完需:约 15 分钟

本文要点

  • 加密证书可限制具有机密访问权限的人数。
  • 加密证书本身并不会降低对稳健性和多层安全计划的需求。
  • pfx 解密密钥文件必须存储在一个安全的离线位置,并与密码分开存储。
  • 掌握 PowerShell 的知识,有助于简化认证相关的任务。

数据泄密的发生越来越频繁,因此使应用尽可能安全是非常重要的。而 web.config 文件通常以纯文本形式存储,常常缺少安全防范。一旦入侵者可以访问该文件,那么就可以轻易地从内部或外部访问数据库和其它资源。

问题并非一开始就是如此。在.NET 首次推出时,很多应用运行在单个 Windows 域中。通常并不需要 web.config 文件存储密码,数据库访问权利可以直接赋予运行应用的用户账户。

但对于现代应用,情况则大相径庭。在分布式环境下,数据库及其它资源通常运行在 Windows 域之外,可能并不受同一家企业的控制。在这种环境下,非常有必要正确地存储密码、应用令牌以及其它一些系统标识。

本文介绍的技术并非最新提出的。 Jouni Heikniemi 在 2013 年的一次演讲中就介绍过,SQL Azure 团队在此之前三年也做过介绍。但是这些年来,部分工具已不再推荐使用,用户界面也在不断地发生变化,一些特定的操作步骤不再有效。纵是如此,其中的原始概念仍然有效。

增加安全性

在开始介绍特定的技术之前,读者应注重理解加密 web.conf 文件的两个方面。一是加密 web.conf 文件只是应用整体安全计划中的一个步骤;二是应了解加密 web.conf 提供了哪些方面的保护,未对哪些方面提供保护。

应用要使用 web.conf 文件,必须可以解密该文件。如果将解密密钥以文件形式存储在 web.conf 文件旁边,那么显然攻击者会在获取 web.conf 文件时轻易获取该文件。如果将加密密钥嵌入到应用中,虽然增加了一个额外步骤,但是也易于被攻破。攻击者仅需要对窃取的代码运行反编译。

但是解密证书则不同。证书是存储在操作系统层面的,攻击者无法轻易地从硬盘中获取。除非经用户明确允许,否则证书甚至不可能从存储的计算机中导出。

这并非说证书是一个完美的解决方案。如果攻击者获取了应用目录的写权限,那么他就可以通过更改应用去解密 web.config 并解读其中的内容。这意味着,对包含应用代码的目录做写保护是同等重要的。理想情况下,只有用户的构建服务器具备生产服务器应用目录的写权限。但是这部分内容超出了本文的范畴。

另一个需要关注的问题是如何保护解密证书自身的拷贝。在建立一个新的服务器时,需要拷贝解密证书。证书也可以离线保存,或是保存在其它一些安全位置。另一方面,加密证书可根据需求共享。

创建加密证书

加密证书类似于 SSL/TLS 证书,由公钥和私钥组成。但是加密证书是自签名的,因为不需要验证文件的创建者和加密者。过去 Windows 开发人员需要使用 makecert.exe 生成证书,但是该工具目前已经不推荐使用了(虽然在 Windows SDK 中依然可见)。

当前正确的工具是使用 PowerShell 在 Windows 机器上创建证书。创建证书的命令如下:(注意:PowerShell 命令需要以管理员运行。)

复制代码
$cert = New-SelfSignedCertificate -Type DocumentEncryptionCert -Subject "CN=DevConfig" -KeyExportPolicy Exportable -KeySpec KeyExchange
Export-Certificate -Cert $cert -FilePath ".\DevConfig.cer"
$mypwd = ConvertTo-SecureString -String "1234" -Force -AsPlainText
Export-PfxCertificate -Cert $cert -FilePath ".\DevConfig.pfx" -Password $mypwd
$cert

如命令名称所示, New-SelfSignedCertificate 命令自身创建证书。在本例中,证书命名为“DevConfig”,用户也可以根据个人能喜好自行定义。

此后,我们使用 Export-Certificate 命令将加密证书导出为“.cer”文件。该文件就是创建加密配置文件所用的公钥。

其后两行命令使用 Export-PfxCertificate 命令将解密证书导出为“.pfx”文件。需要注意的是,该文件应该存储在一个安全的离线位置,并与使用 ConvertTo-SecureString 命令定义的密码分开存储(当然,也要避免使用“1234”这样不太安全的密码)。

用户需要知道证书指纹(thumbprint),它可能会被随后的命令所使用。最后一行命令“$cert”实现在屏幕上显示指纹。指纹本身并不被认为是秘密的。

将加密证书导入 Windows

如果用户需要配置一台可加密配置文件但不用解密的机器,那么可使用如下命令。否则,跳到下一节内容。

Import-Certificate -Filepath ".\DevConfig.cer" -CertStoreLocation cert:\LocalMachine\My详细信息,参见 Import-Certificate 文档

将解密证书导入 Windows

该步骤实际完成加密和解密后的证书(也就是公钥和私钥)的导入。

复制代码
$mypwd = ConvertTo-SecureString -String "1234" -Force -AsPlainText
Import-PfxCertificate -FilePath ".\DevConfig.pfx" -CertStoreLocation Cert:\LocalMachine\My -Password $mypwd

如果使用 Import-PfxCertificate 命令导入证书,那么默认证书是不可导出的。这意味着其他人将不能从该机器导出证书到另一台机器。在生产环境中最好如此配置,但是在开发机器上应标记证书为可导出的。

要验证证书是否正确安装,可使用 Certificate Management Tool

将解密证书导入到 Windows Azure

对于 Azure App Service,证书解密并非免费的服务。因此,下面的操作需要用户至少具有 B1 层级,支持 SSL 连接。

在 Azure Portal 中使用“SSL Settings”选项卡。然后点击“Upload Certificate”按钮安装证书。之后在屏幕下方可看到如下图所示界面信息:

下一步,用户需要将证书暴露给应用。具体操作是将 WEBSITE_LOAD_CERTIFICATES键值加入到“Application Setting”选项中。用户可以填写以以逗号分隔的多个指纹值,或是设置值为“*”,即将用户所有的证书暴露给 Web 应用。

提供受保护配置(Protected Configuration Provider)

ProtectedConfigurationProvider 实现加密和解密的处理。在本文中,我们使用了Pkcs12ProtectedConfigurationProvider。该类最初是由 Microsoft 创建的,并为兼容 Azure App Service 而做了一些微小改进。

对用户代码而言,插入Pkcs12ProtectedConfigurationProvider到配置读取流水线是透明的。这非常有用,用户可以灵活地选择使用加密还是非加密的配置文件。

用户可以在项目中直接添加 Pkcs12ProtectedConfigurationProvider,也可以通过 NuGet 软件包 WebConfigEncrypter 下载。本文假定用户设定了使用 NuGet 软件包。

设置用于加密的 web.config 文件

一旦项目中添加了Pkcs12ProtectedConfigurationProvider类,用户需要设置 web.config 文件实现加密。

1 在 web.config 文件中添加如下部分:

复制代码
<configuration>
[...]
<configProtectedData>
<providers>
<add name="Pkcs12Provider" thumbprint="1234123412341234123412341234123412341234" type="WebConfigEncrypter.Pkcs12ProtectedConfigurationProvider, WebConfigEncrypter" storeLocation="LocalMachine"/>
</providers>
</configProtectedData>

2 更改thumbprint属性值为用户证书值。

3 如果用户使用的是 NuGet 软件包,那么更新type属性值为ProtectedConfigurationProvider DLL 类的完全限定类名和程序集名。

加密 web.config 配置中的连接串

开始本步骤操作前,应确保对 web.conf 文件做了备份拷贝。

首先,确保aspnet命令行工具使用的是用户的ProtectedConfigurationProvider类。在 Visual Studio 命令行输入“where aspnet_regiis”。拷贝下列文件到输出结果指定的目录中。

  • WebConfigEncrypter.dll
  • System.Configuration.ConfigurationManager.dll
  • System.Security.Cryptography.Xml.dll

然后,在 web.config 所在的文件夹中运行下面的命令:

aspnet_regiis -pef "connectionStrings" "." -prov "Pkcs12Provider"加密配置部分的内容如下:

复制代码
<connectionStrings configProtectionProvider="Pkcs12Provider">
<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes192-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<KeyName>rsaKey</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>Moy/a2XO2zvnn/HZW53DyC8aAJWo16+0KmnpC4SCSmuQZU0RT+HNFEA33pAGCzve+m6MTaRzhx6jVVRoAvpSNzfYG1bU1z7a1YnbW4OGxrmYYfdWW6cZQZ57dZnL6YSAlkJ5WlqPDGUPJa6FV/hTic3x4fJYy5vdSucmO6X3opuo1998LWNkL6fIS4WkjkG/SOFbI2Qx3HHogdN670jDHKNDON1z7bFHhLNyVj7RTO3xuQN9kF4PqbFtvwm1bYXTbZpdNxu/fcXZKONSAu8HN3QX5vTRyP/I4BG+NK7TUig3gxD4tq9GR7aSSGKJyt02PiCEO0JpyyIbHZ9xbck9kw==</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>TeV0yJaFlEhpyZUlQoG7M3O7sfQ7uG3ndgmhxipOrwoEsrI+Zvt1NI7arefOFWGNW4CEaoLo4mKy2Kwr4ZgK+6rAwOmx1IRyheWtF7z/8+CiGOqSRXLyGEkDQBEVOWKU0Y6TaWtPu0ZM3bp5pvKaztBnthgGnrGYmigaufu5rZW1GWPtHyL2iWdAkU9iaf+AOpA/GSvoVtZmnfJ1rwy6U8PTO0h0Ws/PdkcOKuXGkx31t/Y32ivFoy7xYPnPt/Z/aNMiHvbO7faQAwuJ/NsG9G1FFRRHCqc73TUsRdKHVuf17BEp526RG6RBZtM3F3V3o0d8/sLmyrNI9tFfksB4qcWiN4P+BRtGr0iacmBfBOvAFSozfUYxjMpx+BYPOpD1pf4fMFoKxxKeJYY31XqZoQLp75RgmWhWYm8URHq4Cjs=</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>

上面的配置适用于 Windows IIS。其中,configProtectionProvider键值指定了应用所使用的解密类和证书。如果配置未起作用,那么重新运行上面介绍的Import-PfxCertificate命令。

加密自定义配置部分

用户不仅可以加密连接串,而且可以加密使用 IConfigurationSectionHandler构建的自定义配置部分。要实现该功能,类似于对WebConfigEncrypter.dll的操作,用户必须将定义用户配置类的软件库拷贝到aspnet_regiis所在的目录。

首先,要确定在configSections列表中对自定义配置使用了完全限定类名和程序集名。例如:

复制代码
<configSections>
<section name="protectedSettings" type="MyConfigSectionHandler.MyHandler, WebApplication1" />
</configSections>

这是aspnet_regiis的要求的,无论用户是否只能提供类名。

然后,用户需要再次运行加密命令,并将其中的-pef参数替换为自定义部分名称。

aspnet_regiis -pef "protectedSettings" "." -prov "Pkcs12Provider"## Azure App Services 中的一些特殊考虑

由于 Azure App Service 使用当前用户而非机器存储并提供证书,因此需要对storeLocation属性做如下更改:

<add name=“Pkcs12Provider” thumbprint=“1234123412341234123412341234123412341234" type=“WebConfigEncrypter.Pkcs12ProtectedConfigurationProvider, WebConfigEncrypter” storeLocation=“CurrentUser”/>## 作者简介

Jonathan Allen 在 90 年代后期开始为一家健康诊所开发 MIS 项目,将逐步从 Access 和 Excel 迁移成为一个企业解决方案。在为金融行业开发自动交易系统五年后,他成为各种项目的顾问,其中包括机器人仓库的用户界面、癌症研究软件的中间层以及大型房地产保险公司的大数据解决方案。在空闲时间,他喜欢学习有关 16 世纪武术的东西。

查看英文原文: Securing web.config with Encryption Certificates on Windows and Azure

2018 年 7 月 27 日 17:461121
用户头像

发布了 390 篇内容, 共 109.8 次阅读, 收获喜欢 251 次。

关注

评论

发布
暂无评论
发现更多内容

线上500万数据查询时间在37秒,作者将问题解决了,我却看到了更大的坑

谙忆

大数据文件浏览器

聚变

yyds!用飞桨玩明日方舟

百度大脑

百度 飞桨

从程序员角度看湖南电信网络全崩,如何防范服务器被攻击以及解决方案

北游学Java

Java 网络安全 网络 服务器

Spark测试用例生成apache iceberg结果

聚变

大数据 iceberg

你看起来很美味?独家揭露视频推荐系统AI秘方

脑极体

如何完成日千万级别以上的订单对账(二)

谙忆

低代码之所以能火,离不开这些原因!

优秀

低代码

聪明人的训练(十三)

Changing Lin

4月日更

活久见,58同城居然也有这么牛的Java内部教程

Java架构师迁哥

金三拿到5个offer,全靠这份Alibaba内部Java面试指南

Java 编程 程序员 架构 面试

MOOM集团模式

飞亚科技

感谢Github帮我斩获了8家大厂Offer

Java架构师迁哥

重读《重构2》- 内联函数

顿晓

重构 4月日更

颜色值JavaScript换算(HSV、RGB、十六进制颜色码)

空城机

JavaScript 大前端 颜色值换算

阿里P9纯手打的JDK文档太吊了,微软都开始学习了!

Java架构师迁哥

[TcaplusDB知识库]TcaplusDB的高可用性和数据安全性介绍

TcaplusDB

数据库 nosql 数据 TcaplusDB

一个可递归遍历的Vue树型组件

空城机

JavaScript vue.js 大前端 4月日更

魔晶面膜

飞亚科技

干货 | Redis进阶笔记

ninetyhe

redis 缓存 原理分析

混战的低代码江湖,如何区分「李逵」和「李鬼」?

ToB行业头条

如何完成日千万级别以上的订单对账(一)

谙忆

缓存系统设计精要

比伯

Java 互联网 面试 程序人生 技术宅

一文搞懂MySQL体系架构!!

冰河

MySQL 数据库 程序员 系统架构 数据存储

Scrum Patterns:小团队(译)

Bruce Talk

敏捷开发 译文 Agile Scrum Patterns

不确定的海浪中,更需要数字化转型的定海神针

脑极体

java基础集合之HashMap

false℃

颠覆微服务认知:深入思考微服务的七个主流观点

xcbeyond

微服务 4月日更

cat监控http请求-CatFilter

qx

监控 cat

《中寰卫星导航项目管理部负责人卜钢:智能网联行业的问题与前景》(采访提纲):

谙忆

首届腾讯云大数据峰会暨Techo TVP开发者峰会

首届腾讯云大数据峰会暨Techo TVP开发者峰会

在Windows和Azure中使用加密证书提高web.config的安全性_.NET_Jonathan Allen_InfoQ精选文章