【问题标题】:What is the point of the X509Store Constructor (String)?X509Store 构造函数(字符串)有什么意义?
【发布时间】:2015-05-20 19:50:48
【问题描述】:

您似乎可以根据任何字符串设置有效的X509Store 对象。 例如。

$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("abcdef")

我原来是用的

 $store = New-Object System.Security.Cryptography.X509Certificates.X509Store("Cert:\CurrentUser\My")

认为我有一个有效的 My 存储对象,但是在调用时我一直收到异常:

$store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::MaxAllowed) #Exception calling "Open" with "1" argument(s): "The parameter is incorrect.

该字符串是否应采用某种格式?

编辑: 似乎字符串可以是任何东西,只要没有斜线。所以我需要使用$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("My")

【问题讨论】:

  • 看看MSDN - X509Store Class。特别是构造函数参数“名称”和“位置”。似乎有效的位置包括:“CurrentUser”和“LocalMachine”。您原来的“Cert:\CurrentUser\My”是 PowerShell 格式。我会省略 "Cert:\" PS 驱动器。
  • 根据最后一条评论 $store = New-Object System.Security.Cryptography.X509Certificates.X509Store("My", "CurrentUser") 应该可以工作。
  • 但该构造函数有两个参数。我在问一个字符串参数构造函数。
  • 我明白了,该评论更符合您的其他问题。
  • $store = New-Object System.Security.Cryptography.X509Certificates.X509Store("My")

标签: powershell certificate x509


【解决方案1】:

咨询MSDN X509Store Class documentation后,这是我对它的理解的要点。

X509Store 类有许多构造函数。定义类的实例后,可以使用 Open 方法打开它。

如果实例指向有效 StoreLocation 中的有效 StoreName,则 Open 方法将打开证书存储。如果 StoreLocation 正确,Open 方法还可以根据使用的标志 [System.Security.Cryptography.X509Certificates.OpenFlags] 创建新的商店。

如果store实例没有正确定义,open方法会产生System.ArgumentException。

有效的 StoreLocation 值为

  • 当前用户
  • 本地机器

有效的 StoreName 值为

  • 通讯录
  • AuthRoot
  • 证书颁发机构
  • 不允许
  • 我的
  • 值得信赖的人
  • 受信任的出版商。

这就是 MSDN 关于 (String) 构造函数的说法。

“使用此构造函数为当前用户使用特定 X.509 商店名称创建 X509Store 对象。要创建新商店,请指定不存在的名称。新商店将以该名称创建。”

所以这段代码应该在“CurrentUser”中创建一个名为“abcdef”的新证书存储。

$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("abcdef")
$openFlags = [System.Security.Cryptography.X509Certificates.OpenFlags]::MaxAllowed
$store.Open($openFlags)

可以使用MMC进行验证。

因此,总而言之,存储构造函数参数“StoreName”和“String”是可以互换的。语义上,“StoreName”用于引用预定义的值,“String”可以引用任何值。

【讨论】:

  • 那么您是说 $store = New-Object System.Security.Cryptography.X509Certificates.X509Store("abcdef") 将创建名为 abcdef 的新商店吗?如果我想开这家店,我会怎么做? Open() 方法不起作用。
  • 是的,这就是我要说的。我已经用我测试过的代码更新了答案。如果这对您不起作用,您会得到什么错误?
  • 好的,但最初的问题是“字符串是否需要采用某种格式?”。从一些测试来看,似乎唯一的条件是字符串不包含任何斜杠。这是真的吗?
  • 是的,我相信是的。可能有更多字符会导致问题。由于字符串等同于证书存储名称,因此限制将符合 x509 证书存储名称限制。不幸的是,我仍然没有找到这方面的参考。
  • 查看 [RFC 2459 - Internet X.509 公钥基础设施](ietf.org/rfc/rfc2459.txt)。没时间 ATM 把它全部看完了,不过来自附录 C:“字符串类型 PrintableString 支持一个非常基本的拉丁字符集:小写字母 'a' 到 'z',大写字母 ' A' 到 'Z',数字 '0' 到 '9',十一个特殊字符 '" ( ) + , - 。 / : ?和空格”我认为证书存储名称中不允许使用特殊字符,这会导致问题。
猜你喜欢
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
相关资源
最近更新 更多