最近接到一个任务,加密DotNet项目的配置文件。配置文件里需要加密的地方一共有两块,一个是数据库连接字符串,一个是自定义的所有AppSettings。

一开始接到这个任务我是拒绝的,因为压根不知道怎么加密,印象中的加密方式还停留在MD5。对于啥是对称加密,啥是非对称加密完全不认识。

加密方式

因为用的是DotNet所以打开微软Doc,希望能找到一点关于DotNet加密的说明文档。

其中.Net安全性介绍了一些关于加密的方法。

最常用的加密方式

  • 对称加密

对称加密,使用单个密钥加密和解密数据(通常被用来加密大数据量的东西)。

  • 非对称加密

非对称加密,分为公钥和私钥,利用公钥加密数据,由私钥解密。通常情况下用来保护对称加密的密钥。(在开发过程中发现,用公钥加密一个数据库连接字符串都会由于内容过长而报错)。对于待加密内容比较长的,可以使用分段加密的方式。

数字证书

一开始考虑使用对称方式加密配置文件,但是密钥的存放就是是一个很大的问题,想当然的就打算把密钥放在配置文件里。可是加密的意义何在呢?

所以后来考虑使用非对称方式加密配置文件,利用公钥加密文件,然后利用私钥解密。

存放公钥和私钥的最好工具是数字证书。

通常情况下,数字证书分为两种,一种只有公钥,一种则是有公钥也有私钥。

生成证书

证书其实需要由第三方CA机构来生成的,当然也可以自己生成。

Windows平台下微软提供了两种生成方式:

数字证书的存储

看了网上的很多博客,大部分是直接加载本地实体文件,比较高级的是把证书导入到计算机的存储区。

证书存储有两种类型:

  • 本地用户

    • MY
    • Root
    • Trust
    • CA
    • UserDS
  • 当前用户
    • MY
    • Root
    • Trust
    • CA
    • UserDS

本地用户除了MY以外应该都可以被当前用户继承

导入证书

        //导入文件方法
private static bool ImportPfxFile(string filePath, string password = null)
{
//证书安装到本地存储,根节点
X509Store store = new X509Store(StoreName.TrustedPeople, StoreLocation.LocalMachine); try
{
X509Certificate2 certificate = new X509Certificate2(filePath, password == null ? "" : password, X509KeyStorageFlags.MachineKeySet); store.Open(OpenFlags.ReadWrite); store.Remove(certificate); //可省略 store.Add(certificate); //File.Delete(filePath);
return true;
}
catch (System.Exception e)
{
MessageBox.Show(e.Message);
return false;
}
finally
{
store.Close();
} }

注意

  • 导入证书的时候注意证书存储标志X509KeyStorageFlags,一般情况下不推荐设置为可导出Exportable,所以利用私钥解密的时候,注意私钥的使用方式。

  • 对于证书密码,如果没有直接给null就可以了。

关于给IIS授权的问题

运行环境是IIS,经测试发现直接运行网站是没有权限获取证书的,需要给IIS用户授权才可以。

这个IIS用户给我折腾死了。本来以为给 ASP.NET 授权就可以了,没想到不是的。经过一顿搜索终于明白了,需要授权的是对应程序池的名称。

名称 状态 .NET CLR 版本 托管管道模式 标识 应用程序
.NET v2.0 已启动 v2.0 集成 ApplicationPoolIdentity 0
DefaultAppPool 已启动 v4.0 集成 ApplicationPoolIdentity 4

比如网站的程序池是DefaultAppPool,就需要给DefaultAppPool用户授权。

授权方式一

第一种方式比较简单,利用MMC。

  • 命令行打开MMC
  • 添加证书节点
  • 将其他区的证书托动到个人
  • 右键证书》所有任务》管理私钥==》添加对应用户即可
  • 将证书托回到原来分区

授权方式二

第二种方式需要用到两个工具appcmd.exe和winhttpcertcfg.exe。

appcmd.exe是一个IIS命令行工具,详细文档

appcmd.exe一般会存放在C:\Windows\System32\inetsrv\appcmd.exe

这里的使用方式很简单即通过命令获得IIS所有程序池信息,执行以下命令


C:\Windows\System32\inetsrv\appcmd.exe list apppool //得到如下结果
APPPOOL "DefaultAppPool" (MgdVersion:v4.0,MgdMode:Integrated,state:Started)
APPPOOL "Classic .NET AppPool" (MgdVersion:v2.0,MgdMode:Classic,state:Started)
APPPOOL ".NET v2.0 Classic" (MgdVersion:v2.0,MgdMode:Classic,state:Started)
APPPOOL ".NET v2.0" (MgdVersion:v2.0,MgdMode:Integrated,state:Started)
APPPOOL ".NET v4.5 Classic" (MgdVersion:v4.0,MgdMode:Classic,state:Started)
APPPOOL ".NET v4.5" (MgdVersion:v4.0,MgdMode:Integrated,state:Started)

.Net 执行此命令


private Dictionary<string, object> MyCommand(string fileName, string argument)
{
try
{
ProcessStartInfo startInfo = new ProcessStartInfo(fileName)
{
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardOutput = true,
Arguments = argument
}; //创建一个进程
Process pc = new Process();
pc.StartInfo = startInfo; //启动进程
pc.Start(); //准备读出输出流和错误流
List<string> listOutPut = new List<string>();
List<string> listError = new List<string>();
pc.BeginOutputReadLine();
pc.BeginErrorReadLine(); pc.OutputDataReceived += (ss, ee) =>
{
listOutPut.Add(ee.Data);
}; pc.ErrorDataReceived += (ss, ee) =>
{
listError.Add(ee.Data);
};
//等待退出
pc.WaitForExit(); //关闭进程
pc.Close();
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("outPut", listOutPut);
dic.Add("error", listError);
return dic;
}
catch (Exception e)
{
throw e;
}
}

通过解析listOutPut可以得到程序池名称。

接下来需要用到证书配置工具winhttpcertcfg.exe 详细文档

利用如下命令即可完成授权


winhttpcertcfg -g -c LOCAL_MACHINE\My -s MyCertificate -a TESTUSER //LOCAL_MACHINE\My:用户\存储区
//MyCertificate:证书名
//TESTUSER:授权用户名,即listOutPut得到的程序池名称

注意

如果利用appcmd得到程序池名称后执行授权命令,报如下错


Error: No account information was found.

这说明程序池并非活跃状态,访问一下对应网站即可。

.NET 证书加密 存储保存 IIS授权的更多相关文章

  1. XP机器上WCF采用X509证书加密时IIS读取证书的授权

    XP机器上WCF采用X509证书加密时IIS读取证书的授权 XP下的授权命令为:winhttpcertcfg -g -c LOCAL_MACHINE\My -s 证书名称 -a "ASPNE ...

  2. tomcat安全配置之证书密码加密存储

    最近项目组要完成一个新Web Servicer接口的开发,其中有项要求是支持外部客户程序以https方式访问这些SOAP接口.项目组当前基于tomcat6.0.29开发,axis版本为1.4.拿到这个 ...

  3. 使用openssl创建自签名证书及部署到IIS教程

    概要 本文讲解三个部分:1. 创建自签名证书2. 创建自己的证书颁发机构3. 以及如何配置IIS 创建自签名证书 首先,创建一个私钥文件: openssl genrsa -out myselfsign ...

  4. 有了SSL证书,如何在IIS环境下部署https?【转载】

    昨天各位小伙伴都很开心的领取了自己的SSL证书,但是大部分小伙伴却不知道如何部署,也许是因为第一次接触SSL这种高端的东西吧,不过个人觉得就是懒懒懒...本来小编也挺懒的,但是答应了各位小伙伴的,那么 ...

  5. PEM证书加密方法(python)

    1. 常见网络登录现在都使用了rsa加密,一般而言客户会提供模(mo)和指数(e). 2. 通过模和指数获取到证书PEM(方法见:https://www.cnblogs.com/luo30zhao/p ...

  6. SpUtil多样加密存储,兼容android9.0

    代码地址如下:http://www.demodashi.com/demo/15058.html 前言 在android系统不断升级的过程中,Sharepreferences存储出现多中问题,其中有些是 ...

  7. Java使用数字证书加密通信(加解密/加签验签)

    本文中使用的Base64Utils.java可参考:http://www.cnblogs.com/shindo/p/6346618.html 证书制作方法可参考:http://www.cnblogs. ...

  8. windows server 证书的颁发与IIS证书的使用 Dapper入门使用,代替你的DbSQLhelper Asp.Net MVC中Action跳转(转载)

    windows server 证书的颁发与IIS证书的使用   最近工作业务要是用服务器证书验证,在这里记录下一. 1.添加服务器角色 [证书服务] 2.一路下一步直到证书服务安装完成; 3.选择圈选 ...

  9. python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题

    python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题 一丶爬虫概述       通过编写程序'模拟浏览器'上网,然后通 ...

随机推荐

  1. redis集群中的主从复制架构(3主3从)

    架构图如下 首先开启6个实例,这里为了演示方便,只是在一个linux上开启了6个redis实例 6380 (主)   6480 (从) 6381(主)   6481(从) 6382(主)   6482 ...

  2. msgs no .h file

    1.单独编译包,catkin_make --pkg 包名,failed,则 2.进入build下对应的msgs包中,使用make,以及make install,failed,则 3.使用catkin_ ...

  3. apache反向代理设置

    为了方便在内网测试微信接口API <VirtualHost *:80> ServerName wx.abc.com ProxyPreserveHost on ProxyPass / htt ...

  4. 使用 CXF 做 webservice 简单例子(转载)

    使用 CXF 做 webservice 简单例子     Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构.它允许创建高性能和可扩展的服务,您可以将这 ...

  5. 2018.12.31 bzoj3771: Triple(生成函数+fft+容斥原理)

    传送门 生成函数经典题. 题意简述:给出nnn个数,可以从中选1/2/31/2/31/2/3个,问所有可能的和对应的方案数. 思路: 令A(x),B(x),C(x)A(x),B(x),C(x)A(x) ...

  6. css扩大超链接的点击范围

    给a标签设置display:block后,它会根据盒模型计算a标签的实际大小.这时候,你可以使用hover伪类使a的整个盒模型生效..link a{display:block;padding:2px ...

  7. jQuery警告/确认/提示弹出对话框效果(替换传统JavaScript下的提示框)

    http://www.51xuediannao.com/js/jquery/jquery_tsk/ http://www.jq22.com/demo/jqueryConfirm20160413/

  8. UVa 11542 Square (高斯消元)

    题意:给定 n 个数,从中选出一个,或者是多个,使得选出的整数的乘积是完全平方数,求一共有多少种选法,整数的素因子不大于 500. 析:从题目素因子不超过 500,就知道要把每个数进行分解.因为结果要 ...

  9. c++中指针的指针和指针的引用的使用

    当指针作为函数的参数进行传递时,实际上本质上是安置传递,即将指针进行了一份拷贝,在函数的内部对这个指针的修改实际上就是对一个在函数内部的那个局部变量的修改.这点事和引用不同的,引用实际上是在参数传递时 ...

  10. vue+大文件分片上传

    最近公司在使用vue做工程项目,实现大文件分片上传. 网上找了一天,发现网上很多代码都存在很多问题,最后终于找到了一个符合要求的项目. 工程如下: 对项目的大文件上传功能做出分析,怎么实现大文件分片上 ...