String 将ASN.1解码为字符串并传递以获取日期时间
使用PowerShell,我正在尝试使用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
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表中不存在的字符的占位符。