String 将ASN.1解码为字符串并传递以获取日期时间

String 将ASN.1解码为字符串并传递以获取日期时间,string,powershell,date,String,Powershell,Date,使用PowerShell,我正在尝试使用System.Security.Cryptography.asnencodedata将ASN.1从证书吊销列表的下一个发布扩展名转换为日期时间对象,以将日期/时间提取为字符串;然后我计划将其传递给Get DateTime。对象有一个Format方法,该方法将解码后的值作为字符串返回(根据) 在下面的代码段中,Base-64 ASN.1值取自真实的CRL 上述申报表: 31 May 2019 07:04:50 ‎31 ‎May ‎2019 07:04:50

使用PowerShell,我正在尝试使用
System.Security.Cryptography.asnencodedata
将ASN.1从证书吊销列表的下一个发布扩展名转换为日期时间对象,以将日期/时间提取为字符串;然后我计划将其传递给
Get DateTime
。对象有一个
Format
方法,该方法将解码后的值作为字符串返回(根据)

在下面的代码段中,Base-64 ASN.1值取自真实的CRL

上述申报表:

31 May 2019 07:04:50
‎31 ‎May ‎2019 07:04:50

31 May 2019 07:04:50
Cannot bind parameter 'Date'. Cannot convert value "‎31 ‎May ‎2019 07:04:50" to type "System.DateTime". Error: "String was not recognized as a va
lid DateTime."
At line:14 char:10
+ Get-Date $nextUpdateString
+          ~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-Date], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.GetDateCommand
如您所见,这两个变量在屏幕上看起来完全相同。但是,当简单字符串变量使用
Get DateTime
转换为
DateTime
时,从ASN.1解码的值(显然是字符串)失败。使用
.GetType()
方法显示它们都是字符串

如果将两者的内容都视为ASCII,则会得到奇怪的结果:

$enc = [system.Text.Encoding]::ASCII

$enc.GetBytes($textDateTime) -join ","
($enc.GetBytes($textDateTime) | foreach {[char]$_}) -join ""

$enc.GetBytes($nextUpdateString) -join ","
($enc.GetBytes($nextUpdateString) | foreach {[char]$_}) -join ""
我得到:

51,49,32,77,97,121,32,50,48,49,57,32,48,55,58,48,52,58,53,48
31 May 2019 07:04:50
63,51,49,32,63,77,97,121,32,63,50,48,49,57,32,48,55,58,48,52,58,53,48
?31 ?May ?2019 07:04:50
如您所见,在解码ASN.1返回的版本中有额外的问号(ASCII字符63);这可以解释为什么
Get DateTime
失败


这是怎么回事?更重要的是,如何将从ASN.1解码的字符串作为
get DateTime
的有效输入?

AsnEncodedData.Format()
返回的字符串包含一组从左到右的格式字符。您可以用一个简单的正则表达式替换它:

$nextUpdateString = $extAsnDecoded.Format($false) -replace '\p{Cf}'

Cf
是“Other,Format”unicode类别的regex缩写,它将匹配(并删除)格式化字符,之后您应该能够将字符串传递给
Get Date

AsnEncodedData返回的字符串。Format()
包含一组从左到右的格式化字符。您可以用一个简单的正则表达式替换它:

$nextUpdateString = $extAsnDecoded.Format($false) -replace '\p{Cf}'

Cf
是“Other,Format”unicode类别的regex缩写,它将匹配(并删除)格式化字符,之后您应该能够将字符串传递给
Get Date

使用类似于
-replace'[^a-z0-9:],''
的方法来删除扩展字符。我怀疑你有一些类似于不间断空格或其他类似字符的东西。如果您想更好地了解它,请尝试使用
Format Hex
cmdlet,然后查找额外的非打印字符的十六进制值。@Lee_Dailey-谢谢。我确实考虑了这方面的问题,但老实说,我认为这很难理解。这么说,如果这是唯一的办法,那就这样吧。是的,这很烦人。[露齿而笑]但是,除非你能找出解码会塞进这些额外字符的原因。。。你被困于症状修复。我找不到任何关于你使用的加密工具的信息&非标准字符。[叹气…]使用类似于
-replace'[^a-z0-9:][',''
的方法来去除扩展字符。我怀疑你有一些类似于不间断空格或其他类似字符的东西。如果您想更好地了解它,请尝试使用
Format Hex
cmdlet,然后查找额外的非打印字符的十六进制值。@Lee_Dailey-谢谢。我确实考虑了这方面的问题,但老实说,我认为这很难理解。这么说,如果这是唯一的办法,那就这样吧。是的,这很烦人。[露齿而笑]但是,除非你能找出解码会塞进这些额外字符的原因。。。你被困于症状修复。我找不到任何关于你使用的加密工具的信息&非标准字符。[叹气…]谢谢你。在编码为UTF8并应用@Lee_Dailey的建议,通过
格式Hex
而不是我的混合物进行管道输送后,输出显示如您所说的
E2808E
(从左到右)。大概,问号只是ASCII表中没有的字符的占位符。谢谢。在编码为UTF8并应用@Lee_Dailey的建议,通过
格式Hex
而不是我的混合物进行管道输送后,输出显示如您所说的
E2808E
(从左到右)。据推测,问号只是ASCII表中不存在的字符的占位符。