如何在.NET代码中使用X509证书

时间:2012-01-14 14:55:35

标签: asp.net asp.net-mvc security x509certificate private-key

我有一些代码需要使用X509证书信息。我已经下载了一个样本:

const string CertWithoutPrivateKey = "MII....";
const string CertWithPrivateKey = "MII...";

public static SecurityToken GetSigningToken(bool includePrivateKey)
{
    X509Certificate2 cert = null;
    if (includePrivateKey)
    {
        cert = new X509Certificate2(
            Convert.FromBase64String(CertWithPrivateKey), 
            "pw", X509KeyStorageFlags.PersistKeySet);
    }
    else
    {
        cert = new X509Certificate2(
            Convert.FromBase64String(CertWithoutPrivateKey));
    }
    return cert;
}

代码需要能够使用私钥获取证书。 Saml2AuthenticationModule(来自SAML 2.0协议的WIF扩展)依赖此私钥来解密从SAML身份提供程序发送的信息。

我对证书或加密知之甚少,但在我看来,将证书硬编码到类中是不安全的。

那么,我的代码应如何使用私钥检索证书? Afaik,此代码仅在应用启动时运行一次(因此也可能在应用池回收后运行)。

我可以:

  1. 将证书存储为配置文件中的appSetting。只要appSettings配置为加密,这是安全的吗?
  2. 将证书存储在数据库中。
  3. 将证书存储为bin / App_Data中的文件。 Afaik这意味着无法通过网络阅读,但对任何可以访问主机服务器的人都可以看到。 Imo如果有人可以进入我的服务器,让他们阅读这个证书可能是我最不担心的。
  4. 还有其他选择吗?在这种情况下最合适的是什么?

2 个答案:

答案 0 :(得分:2)

带或不带私钥的证书可以保存到用户或计算机的X509商店。这已经具有内置的Windows安全性,应该足够了。您可以将mmc与证书管理单元一起使用,以将证书添加到商店并对其进行管理。

对证书的引用(例如,其名称或缩略图)可以保存到配置文件中并用于检索证书。检索可能如下所示:

public static X509Certificate2 GetCertificate(string name)
{
    try
    {
        X509Store store = new X509Store (StoreLocation.LocalMachine);
        X509Certificate2Collection collection = store.Certificates;
        foreach (X509Certificate2 x509 in collection)
        {
            if (x509.FriendlyName.Equals(name)) 
            {
                return x509;
            }
        }
    }
    finally
    {
        store.Close();
    }
    return null;
}

在集合上使用Find是搜索证书的另一种(更简洁)方式。

答案 1 :(得分:1)

我不确定WIF是如何做到的(您可以使用Reflector查看它与证书存储区交互的内部结构),但听起来您在IIS中托管的应用程序中使用WIF。如果是这种情况, WIF应该为您处理所有证书互动。您只需确保设置以下内容:

  1. identity model configuration section设置时引用您用于加密或验证令牌数字签名的证书的指纹。
  2. certificate needs to be registered in IIS
  3. 应用程序池的托管身份需要获得“#读取”权限。用于提取私钥信息的证书(请参阅接受的答案here