尝试在VS Code中使用X509Certificate2UI
时出现以下错误:
命名空间"System.Security.Cryptography.X509Certificates"中不存在类型或命名空间名称"X509Certificate2UI"(是否缺少程序集引用?) [netcoreapp1.1]
我发现一些站点表明解决方案是添加system.security.dll
程序集,但这些响应似乎不适合 VS Code。我已经将 X509Certificates 依赖项添加到 project.json 文件中,这似乎对我没有多大好处:
"dependencies": {},
"frameworks": {
"netcoreapp1.1": {
"dependencies": {
"Microsoft.NETCore.App": {"type": "platform", "version": "1.1.0"},
"System.Security.Cryptography.X509Certificates": "4.3.0" //"4.3.0-*"
},
"imports": "dnxcore50"
}
为什么我会得到这个?出了什么问题,如何解决问题?
> X509Certificate2UI 不是 .NET Core 的一部分。 这是一个仅限Windows的类,也是一个UI类,它没有被继承。
您必须迁移到无 UI 的解决方案,或者交叉编译以面向 .NET Framework。
就我而言,出现上述错误是因为我想尝试 X509Certificate2UI 类页面中的控制台示例。
我在vs代码终端中做了以下操作
dotnet new console --use-program-main
dotnet add package System.Windows.Extensions --version 7.0.0
dotnet add package System.Security.Cryptography.X509Certificates --version 4.3.2
这成功了。
X509证书2UI 类的控制台示例
这是页面 X509Certificate2UI 类的缩短代码,它返回公钥警告
警告SYSLIB0027:"PublicKey.Key"已过时:"PublicKey.Key 是过时。使用适当的方法获取公钥,例如GetRSAPublicKey。
通过在类上方添加属性[SupportedOSPlatform("windows")]
可以避免warning CA1416: This call site is reachable on all platforms.
(请参阅此处)。
// may require using System.Runtime.Versioning;
[SupportedOSPlatform("windows")]
static void Main()
{
X509Store store = new X509Store("MY",StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
var collection = (X509Certificate2Collection)store.Certificates;
var fcollection = (X509Certificate2Collection)collection.Find(
X509FindType.FindByTimeValid,
DateTime.Now,false);
var scollection = X509Certificate2UI.SelectFromCollection(
fcollection, "Test Certificate Select",
"Select a cert from list to get information",
X509SelectionFlag.MultiSelection);
Console.WriteLine("Number of certificates: {0}{1}",
scollection.Count, Environment.NewLine);
foreach (X509Certificate2 x509 in scollection)
{
try {
byte[] rawdata = x509.RawData;
Console.WriteLine("Content Type: {0}{1}",
X509Certificate2.GetCertContentType(rawdata),Environment.NewLine);
// ....
} catch (CryptographicException) {
Console.WriteLine("Information could not be written out for this certificate.");
}
}
store.Close();
}
}