在Windows和Azure中使用加密证书提高web.config的安全性
\
本文要点
\\
- 加密证书可限制具有机密访问权限的人数。\\t
- 加密证书本身并不会降低对稳健性和多层安全计划的需求。\\t
- pfx解密密钥文件必须存储在一个安全的离线位置,并与密码分开存储。\\t
- 掌握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文件中添加如下部分:
\\
\\u0026lt;configuration\u0026gt;\ [...]\ \u0026lt;configProtectedData\u0026gt;\ \u0026lt;providers\u0026gt;\ \u0026lt;add name=\"Pkcs12Provider\" thumbprint=\"1234123412341234123412341234123412341234\" type=\"WebConfigEncrypter.Pkcs12ProtectedConfigurationProvider, WebConfigEncrypter\" storeLocation=\"LocalMachine\"/\u0026gt;\ \u0026lt;/providers\u0026gt;\ \u0026lt;/configProtectedData\u0026gt;
\\
2 更改thumbprint
属性值为用户证书值。
\\
3 如果用户使用的是NuGet软件包,那么更新type
属性值为ProtectedConfigurationProvider
DLL类的完全限定类名和程序集名。
\\
加密web.config配置中的连接串
\\
开始本步骤操作前,应确保对web.conf文件做了备份拷贝。
\\
首先,确保aspnet
命令行工具使用的是用户的ProtectedConfigurationProvider
类。在Visual Studio命令行输入“where aspnet_regiis”。拷贝下列文件到输出结果指定的目录中。
\\
- WebConfigEncrypter.dll\\t
- System.Configuration.ConfigurationManager.dll\\t
- System.Security.Cryptography.Xml.dll\
然后,在web.config所在的文件夹中运行下面的命令:
\\
\aspnet_regiis -pef \"connectionStrings\" \".\" -prov \"Pkcs12Provider\"
\\
加密配置部分的内容如下:
\\
\\u0026lt;connectionStrings configProtectionProvider=\"Pkcs12Provider\"\u0026gt;\ \u0026lt;EncryptedData Type=\"http://www.w3.org/2001/04/xmlenc#Element\"\ xmlns=\"http://www.w3.org/2001/04/xmlenc#\"\u0026gt;\ \u0026lt;EncryptionMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#aes192-cbc\" /\u0026gt;\ \u0026lt;KeyInfo xmlns=\"http://www.w3.org/2000/09/xmldsig#\"\u0026gt;\ \u0026lt;EncryptedKey xmlns=\"http://www.w3.org/2001/04/xmlenc#\"\u0026gt;\ \u0026lt;EncryptionMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#rsa-1_5\" /\u0026gt;\ \u0026lt;KeyInfo xmlns=\"http://www.w3.org/2000/09/xmldsig#\"\u0026gt;\ \u0026lt;KeyName\u0026gt;rsaKey\u0026lt;/KeyName\u0026gt;\ \u0026lt;/KeyInfo\u0026gt;\ \u0026lt;CipherData\u0026gt;\ \u0026lt;CipherValue\u0026gt;Moy/a2XO2zvnn/HZW53DyC8aAJWo16+0KmnpC4SCSmuQZU0RT+HNFEA33pAGCzve+m6MTaRzhx6jVVRoAvpSNzfYG1bU1z7a1YnbW4OGxrmYYfdWW6cZQZ57dZnL6YSAlkJ5WlqPDGUPJa6FV/hTic3x4fJYy5vdSucmO6X3opuo1998LWNkL6fIS4WkjkG/SOFbI2Qx3HHogdN670jDHKNDON1z7bFHhLNyVj7RTO3xuQN9kF4PqbFtvwm1bYXTbZpdNxu/fcXZKONSAu8HN3QX5vTRyP/I4BG+NK7TUig3gxD4tq9GR7aSSGKJyt02PiCEO0JpyyIbHZ9xbck9kw==\u0026lt;/CipherValue\u0026gt;\ \u0026lt;/CipherData\u0026gt;\ \u0026lt;/EncryptedKey\u0026gt;\ \u0026lt;/KeyInfo\u0026gt;\ \u0026lt;CipherData\u0026gt;\ \u0026lt;CipherValue\u0026gt;TeV0yJaFlEhpyZUlQoG7M3O7sfQ7uG3ndgmhxipOrwoEsrI+Zvt1NI7arefOFWGNW4CEaoLo4mKy2Kwr4ZgK+6rAwOmx1IRyheWtF7z/8+CiGOqSRXLyGEkDQBEVOWKU0Y6TaWtPu0ZM3bp5pvKaztBnthgGnrGYmigaufu5rZW1GWPtHyL2iWdAkU9iaf+AOpA/GSvoVtZmnfJ1rwy6U8PTO0h0Ws/PdkcOKuXGkx31t/Y32ivFoy7xYPnPt/Z/aNMiHvbO7faQAwuJ/NsG9G1FFRRHCqc73TUsRdKHVuf17BEp526RG6RBZtM3F3V3o0d8/sLmyrNI9tFfksB4qcWiN4P+BRtGr0iacmBfBOvAFSozfUYxjMpx+BYPOpD1pf4fMFoKxxKeJYY31XqZoQLp75RgmWhWYm8URHq4Cjs=\u0026lt;/CipherValue\u0026gt;\ \u0026lt;/CipherData\u0026gt;\ \u0026lt;/EncryptedData\u0026gt;\ \u0026lt;/connectionStrings\u0026gt;
\\
上面的配置适用于Windows IIS。其中,configProtectionProvider
键值指定了应用所使用的解密类和证书。如果配置未起作用,那么重新运行上面介绍的Import-PfxCertificate
命令。
\\
加密自定义配置部分
\\
用户不仅可以加密连接串,而且可以加密使用IConfigurationSectionHandler
构建的自定义配置部分。要实现该功能,类似于对WebConfigEncrypter.dll
的操作,用户必须将定义用户配置类的软件库拷贝到aspnet_regiis
所在的目录。
\\
首先,要确定在configSections
列表中对自定义配置使用了完全限定类名和程序集名。例如:
\\
\ \u0026lt;configSections\u0026gt;\ \u0026lt;section name=\"protectedSettings\" type=\"MyConfigSectionHandler.MyHandler, WebApplication1\" /\u0026gt;\ \u0026lt;/configSections\u0026gt;
\\
这是aspnet_regiis
的要求的,无论用户是否只能提供类名。
\\
然后,用户需要再次运行加密命令,并将其中的-pef
参数替换为自定义部分名称。
\\
\aspnet_regiis -pef \"protectedSettings\" \".\" -prov \"Pkcs12Provider\"
\\
Azure App Services中的一些特殊考虑
\\
由于Azure App Service使用当前用户而非机器存储并提供证书,因此需要对storeLocation
属性做如下更改:
\\
\\u0026lt;add name=“Pkcs12Provider” thumbprint=“1234123412341234123412341234123412341234\" type=“WebConfigEncrypter.Pkcs12ProtectedConfigurationProvider, WebConfigEncrypter” storeLocation=“CurrentUser”/\u0026gt;
\\
作者简介
\\
Jonathan Allen 在90年代后期开始为一家健康诊所开发MIS项目,将逐步从Access和Excel迁移成为一个企业解决方案。在为金融行业开发自动交易系统五年后,他成为各种项目的顾问,其中包括机器人仓库的用户界面、癌症研究软件的中间层以及大型房地产保险公司的大数据解决方案。在空闲时间,他喜欢学习有关16世纪武术的东西。
\\
查看英文原文: Securing web.config with Encryption Certificates on Windows and Azure
在Windows和Azure中使用加密证书提高web.config的安全性相关推荐
- (译)利用ASP.NET加密和解密Web.config中连接字符串
介绍 这篇文章我将介绍如何利用ASP.NET来加密和解密Web.config中连接字符串 背景描述 在以前的博客中,我写了许多关于介绍 Asp.net, Gridview, SQL Server, A ...
- vs azure web_在Azure中迁移和自动化Chrome Web爬网程序的指南。
vs azure web Webscraping as a required skill for many data-science related jobs is becoming increasi ...
- PetShop 4.0知识点:加密和解密Web.config文件的配置节
PetShop 4.0 中Web.config文件中的连接字符串是加密的,需要进行解密才能看到. 这个问题PetShop 4.0的ReadMe文件中有说明: Encrypting and Decryp ...
- Parallels中使用加密狗读取文件出现错误
2019独角兽企业重金招聘Python工程师标准>>> 当我们通过parallels desktop虚拟机软件在mac上安装windows操作系统后,windows虚拟机操作系统可以 ...
- Asp.net中的web.config配置
Asp.net中的web.config配置 Asp.net中的web.config配置... 1 一. 配置文件保存位置... 2 二. 配置文件加载顺序... 2 三. 配置文件节点介绍... 3 ...
- 在web.config中添加配置信息
1 在web.config中添加配置信息<configuration><connectionStrings><add name="conStr" co ...
- web.config连接mysql_web.config中配置数据库连接的方式
在网站开发中,数据库操作是经常要用到的操作,ASP.NET中一般做法是在web.config中配置数据库连接代码,然后在程序中调用数据库连接代码,这样做的好处就是当数据库连接代码需要改变的时候,我们只 ...
- web.config中配置数据库连接的两种方式
在网站开发中,数据库操作是经常要用到的操作,ASP.NET中一般做法是在web.config中配置数据库连接代码,然后在程序中调用数据库连接代码,这样做的好处就是当数据库连接代码需要改变的时候,我们只 ...
- appsettings 连接oracle数据库,web.config中配置数据库连接的两种方式(appSettings 与 connectionStrings)...
[预览] [转载博客]cnblogs.com/sunzhiyue/archive/2011/06/07/2074696.html 在网站开发中,数据库操作是经常要用到的操作,ASP.NET中一般做法是 ...
最新文章
- Matlab学习笔记——find()函数
- 基于SpringMVC下的Rest服务框架搭建【1、集成Swagger】
- EventLoopGroup 与Reactor
- vs2013+EF6+Mysql
- 一点等于多少厘米_马桶知识介绍,你了解马桶多少
- react生命周期(自己的方式理解)
- Windows Terminal Preview 1910 发布
- 用spss做哑变量--给不敲代码同学福音
- Android之——AsyncTask和Handler对照
- android 的mvp架构,老生常谈Android的MVP架构
- 【托业】【新托业TOEIC新题型真题】学习笔记7-题库二-P1~4
- python 折线图 百分比_Python数据可视化 - 使用Matplotlib库绘制点图、折线图、条状图与饼图...
- leetcode6.Z 字形转换
- 08.15恒指/德指做单思路导图及晚盘前瞻
- 语音识别工具Sphinx4
- 树莓派chromium浏览器 kiosk 全屏提示错误
- mysql从5.7平滑升级到8.0.27
- 微信8.0状态背景视频合集
- 简易的GUI图书管理系统(数据库Mysql)
- K2 BPM_北汽新能源业务流程管理信息系统建设思考_全球领先的工作流引擎
热门文章
- 客户关系管理系统-帮管客CRM客户管理系统 v3.0.1
- java13性能,Spring Boot 2.2.0,性能提升+支持Java13
- 如何腾出计算机内存,教你如何正确腾出手机内存,尤其是生活在易门的你,必学!...
- 超级抖音腾讯视频V3.6.0小程序源码 前端+后端 支持视频采集和上传
- 超好看的B站首页顶部景深动态特效源码
- 云之道律师小程序源码V1.2.8完整全开源 安装包+小程序前端
- readonly和const比较
- 如何优雅的使用 phpStorm
- Magento 添加 google font Adding a google fonts into Magento
- JavaScript 文件拖拽上传插件 dropzone.js 介绍