Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取本地计算机上安装的所有证书_C#_Ssl Certificate_X509certificate - Fatal编程技术网

C# 获取本地计算机上安装的所有证书

C# 获取本地计算机上安装的所有证书,c#,ssl-certificate,x509certificate,C#,Ssl Certificate,X509certificate,我有以下代码来获取证书: X509Store store = new X509Store("??","??"); List<X509Certificate2> lst = new List<X509Certificate2>(); store.Open(OpenFlags.ReadOnly); foreach (X509Certificate2 mCert in store.Certificates

我有以下代码来获取证书:

X509Store store = new X509Store("??","??");
            List<X509Certificate2> lst = new List<X509Certificate2>();
            store.Open(OpenFlags.ReadOnly);

            foreach (X509Certificate2 mCert in store.Certificates)
            {

                lst.Add(mCert);
                //TODO's
            }
X509Store store=新的X509Store(“?”,“?”);
List lst=新列表();
打开(OpenFlags.ReadOnly);
foreach(X509Certificate2存储中的mCert.Certificates)
{
第一次添加(mCert);
//托多的
}
现在,我想在中获取本地计算机上安装的所有证书 带有证书名称、位置和公钥的列表 或私钥(仅限是或否)以及 包含这些证书(请参阅下面的快照):


在用证书详细信息填充列表后,我想以网格格式显示这些数据。如何修改此代码以获得上述详细信息?

这是一个简短的示例,也许对您有所帮助:

using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography;
...
X509Store store = null;
store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly)
...

//RSA CryptoServiceProvider
RSACryptoServiceProvider rsaCSP = null;

string keyPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + @"\Microsoft\Crypto\RSA\MachineKeys\";

string friendlyName = "";

foreach (X509Certificate2 mCert in store.Certificates) {

  rsaCSP = mCert.PrivateKey as RSACryptoServiceProvider;

  if (rsaCSP != null) {
    friendlyName = mCert.FriendlyName;                    
    keyPath += rsaCSP.CspKeyContainerInfo.UniqueKeyContainerName;
  }                        
}

这是一个简短的例子,也许对你的灵感有所帮助:

using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography;
...
X509Store store = null;
store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly)
...

//RSA CryptoServiceProvider
RSACryptoServiceProvider rsaCSP = null;

string keyPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + @"\Microsoft\Crypto\RSA\MachineKeys\";

string friendlyName = "";

foreach (X509Certificate2 mCert in store.Certificates) {

  rsaCSP = mCert.PrivateKey as RSACryptoServiceProvider;

  if (rsaCSP != null) {
    friendlyName = mCert.FriendlyName;                    
    keyPath += rsaCSP.CspKeyContainerInfo.UniqueKeyContainerName;
  }                        
}

计算机上的证书存储在不同的存储区中,因此需要打开所有证书。请看 文章

代码示例:

public class CertDetails
{
    public string Name { get; set; }
    public string HasPrivateKey { get; set; }
    public string Location { get; set; }
    public string Issuer { get; set; }
}

// stores and they friendly names
var stores = new Dictionary<StoreName, string>()
{
    {StoreName.My, "Personal"},
    {StoreName.Root, "Trusted roots"},
    {StoreName.TrustedPublisher, "Trusted publishers"}
    // and so on
    }.Select(s => new {store = new X509Store(s.Key, StoreLocation.LocalMachine), location = s.Value}).ToArray();

foreach (var store in stores)
    store.store.Open(OpenFlags.ReadOnly); // open each store

var list = stores.SelectMany(s => s.store.Certificates.Cast<X509Certificate2>()
    .Select(mCert => new CertDetails
    {
        HasPrivateKey = mCert.HasPrivateKey ? "Yes" : "No",
        Name = mCert.FriendlyName,
        Location = s.location,
        Issuer = mCert.Issuer
    })).ToList();
公共类证书详细信息
{
公共字符串名称{get;set;}
公共字符串HasPrivateKey{get;set;}
公共字符串位置{get;set;}
公共字符串颁发者{get;set;}
}
//商店和他们友好的名字
var stores=newdictionary()
{
{StoreName.My,“Personal”},
{StoreName.Root,“受信任的根”},
{StoreName.TrustedPublisher,“TrustedPublisher”}
//等等
}.Select(s=>new{store=newx509store(s.Key,StoreLocation.LocalMachine),location=s.Value}).ToArray();
foreach(存储在存储中的var存储)
store.store.Open(OpenFlags.ReadOnly);//开店
var list=stores.SelectMany(s=>s.store.Certificates.Cast()
.选择(mCert=>new CertDetails
{
HasPrivateKey=mCert.HasPrivateKey?“是”:“否”,
Name=mCert.FriendlyName,
位置=s.位置,
发卡机构=mCert.Issuer
})).ToList();

计算机上的证书存储在不同的存储区中,因此您需要打开所有证书。请看 文章

代码示例:

public class CertDetails
{
    public string Name { get; set; }
    public string HasPrivateKey { get; set; }
    public string Location { get; set; }
    public string Issuer { get; set; }
}

// stores and they friendly names
var stores = new Dictionary<StoreName, string>()
{
    {StoreName.My, "Personal"},
    {StoreName.Root, "Trusted roots"},
    {StoreName.TrustedPublisher, "Trusted publishers"}
    // and so on
    }.Select(s => new {store = new X509Store(s.Key, StoreLocation.LocalMachine), location = s.Value}).ToArray();

foreach (var store in stores)
    store.store.Open(OpenFlags.ReadOnly); // open each store

var list = stores.SelectMany(s => s.store.Certificates.Cast<X509Certificate2>()
    .Select(mCert => new CertDetails
    {
        HasPrivateKey = mCert.HasPrivateKey ? "Yes" : "No",
        Name = mCert.FriendlyName,
        Location = s.location,
        Issuer = mCert.Issuer
    })).ToList();
公共类证书详细信息
{
公共字符串名称{get;set;}
公共字符串HasPrivateKey{get;set;}
公共字符串位置{get;set;}
公共字符串颁发者{get;set;}
}
//商店和他们友好的名字
var stores=newdictionary()
{
{StoreName.My,“Personal”},
{StoreName.Root,“受信任的根”},
{StoreName.TrustedPublisher,“TrustedPublisher”}
//等等
}.Select(s=>new{store=newx509store(s.Key,StoreLocation.LocalMachine),location=s.Value}).ToArray();
foreach(存储在存储中的var存储)
store.store.Open(OpenFlags.ReadOnly);//开店
var list=stores.SelectMany(s=>s.store.Certificates.Cast()
.选择(mCert=>new CertDetails
{
HasPrivateKey=mCert.HasPrivateKey?“是”:“否”,
Name=mCert.FriendlyName,
位置=s.位置,
发卡机构=mCert.Issuer
})).ToList();


在PowerShell中获取这样一个列表需要递归枚举
证书:
驱动器。所以这是可能的。@Richard您能告诉我如何通过powershell实现这一点吗?
获取childitem证书:-recurse
是一个开始,@Richard,它在遍历TrustedPublisher、MCafee Trust和Root storeName之后,在UserDS storeName上抛出异常。请提供完整的工作powershell脚本。谢谢,您需要说明什么异常(它在我的机器上工作…)在PowerShell中获取这样一个列表需要递归枚举
证书:
“驱动器”。所以这是可能的。@Richard您能告诉我如何通过powershell实现这一点吗?
获取childitem证书:-recurse
是一个开始,@Richard,它在遍历TrustedPublisher、MCafee Trust和Root storeName之后,在UserDS storeName上抛出异常。请提供完整的工作powershell脚本。谢谢,您需要说明什么异常(它在我的机器上工作…)当我使用-X509Store store=new X509Store()创建对象时,它不返回任何内容;当我的本地机器上安装了这么多证书时,它只获取了2个证书。但是它做到了。我认为您必须更改存储(将StoreName.My查找为其他值)或证书类型;当我的本地机器上安装了这么多证书时,它只获取了2个证书。但是它做到了。我认为您必须更改存储(查找StoreName.My为其他值)或证书类型。它工作正常,但我也需要本地计算机证书,但它似乎只提供当前用户证书,请您修改代码以解决我的问题。thanksit工作正常,但我也需要本地机器证书,但似乎它只提供当前用户证书,请您修改代码以解决我的问题。谢谢