c# 在iis上对证书操作的问题
Oauth2验证实现需要的两个证书的制作命令
AuthServer.pfx :授权服务器的数字签名证书,用于验证信息是来自于正确的授权服务器。授权服务器用私钥加密 资源服务器用公钥解密
ResourceServer.pfx 资源服务器的密钥交换证书,授权服务器使用公钥进行加密,资源服务器使用私钥进行解密。
参考的相关信息:
http://developer.51cto.com/art/201006/206689.htm
http://wanjianfei.iteye.com/blog/439386
由于公钥所具有的两种不同用途,在实际应用中,需要分别配置用于数字签名/验证的
密钥对和用于数据加密/解密的密钥对,这里分别称为签名密钥对和加密密钥对?这两对密
钥由于用途不同,因此,对于密钥的管理也就有着不同的要求?
(1)签名密钥对的管理
签名密钥对由签名私钥和验证公钥组成?
签名私钥是发送方身份的证明,具有日常生活中公章?私章的效力?为保证其惟一性,
签名私钥绝对不能够做备份和存档,丢失后只需重新生成新的密钥对?验证公钥需要存档,
用于验证旧的数字签名? 用做数字签名的这一对密钥一般可以有较长的生命期?
(2)加密密钥对的管理
加密密钥对由加密公钥和解密私钥组成?
为防止密钥丢失时数据无法恢复,解密私钥应该进行备份,同时还可能需要进行存档,
以便能在任何时候解密历史密文数据?加密公钥则无需备份和存档,加密公钥丢失时,只需
重新生成密钥对即可?
这种密钥应该频繁更换,故加密密钥对的生命周期较短?
不难看出,这两对密钥的密钥管理要求存在互相冲突的地方,因此,必须针对不同的用
途使用不同的密钥对?尽管有的公钥体制算法如RSA,既可以用于加密,又可以用于签名,
但由于这两对密钥在管理上截然不同的要求,在使用中仍然必须为用户配置两对密钥:其一
用于数字签名,另一用于加密?而采用一对密钥,既用于加密,又用于签名,这种做法是不安
全的!
下边
是使用makecert工具制作证书的命令:
makecert -ss My -sr LocalMachine -n "CN=AuthServer" AuthServer.pfx -pe -r -sky 2
makecert -ss My -sr LocalMachine -n "CN=ResourceServer" ResourceServer.pfx -pe -r -sky 1
需要注意的参数
-sr :LocalMachine 本地计算机 如果选择 currentuser在windows2008上可能读不到证书文件
-sky:signature、exchange 或一个表示提供程序类型的整数。默认情况下,可传入 1 表示交换密钥,传入 2 表示签名密钥。
部署工具
使用FindPrivateKey工具找到证书文件的路径,然后给文件增加 iis_user 以及NetWorkService的读取权限 -t表示根据指纹查找
FindPrivateKey My LocalMachine -t "be b8 4b a5 2c ca fc 62 25 88 d7 18 09 05 22 29 38 a9 7b b6"
FindPrivateKey My LocalMachine -t "be b8 4b a5 2c ca fc 62 25 88 d7 18 09 05 22 29 38 a9 7b b6"
经过以上几步 证书部署完成。
读取证书存储区代码:
public static RSACryptoServiceProvider GetAuthorizationServerSigningPublicKey()
{
#region 从证书文件读取证书公钥信息
//X509Certificate2 cer = new X509Certificate2("c:\\AuthServer.pfx", "123");
////X509Certificate2 cer = new X509Certificate2(HttpContext.Current.Server.MapPath("\\证书\\authorServer.pfx"), "123");
//RSACryptoServiceProvider myRSA1 = (RSACryptoServiceProvider)cer.PublicKey.Key;
//return myRSA1;
#endregion
#region 从本地证书容器获得证书对象。
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite);
X509Certificate2Collection fcollection = (X509Certificate2Collection)store.Certificates;
//X509Certificate2Collection collection = X509Certificate2UI.SelectFromCollection(fcollection, "Select an X509 Certificate", "Choose a certificate to examine.", X509SelectionFlag.SingleSelection);
X509Certificate2Collection collection = fcollection.Find(X509FindType.FindBySerialNumber, _authServerCASerialNumber, false);//authorServer
if (collection.Count > 0)
{
X509Certificate2 cert = collection[0];
RSACryptoServiceProvider myRSA1 = (RSACryptoServiceProvider)cert.PublicKey.Key;
return myRSA1;
}
else
{
throw new ArgumentException("找不到资源服务器的公钥证书");
}
#endregion
}
浙公网安备 33010602011771号