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工作正常,但我也需要本地机器证书,但似乎它只提供当前用户证书,请您修改代码以解决我的问题。谢谢