Используя PowerShell, я пытаюсь преобразовать ASN.1 из расширения следующей публикации списка отзыва сертификатов в объект Date-Time, используя System.Security.Cryptography.AsnEncodedData
для извлечения даты / времени в виде строки;который я тогда планировал передать Get-DateTime
.У объекта есть метод Format
, который возвращает декодированное значение в виде строки (согласно документации ).
В приведенном ниже фрагменте значение Base-64 ASN.1 берется изa real CRL.
$textDateTime = "31 May 2019 07:04:50"
$asnBase64 = "Fw0xOTA1MzEwNjA0NTBa"
# 1.3.6.1.4.1.311.21.4 is the OID for Next Update extension
$extAsnDecoded = New-Object System.Security.Cryptography.AsnEncodedData(
'1.3.6.1.4.1.311.21.4',
[System.Convert]::FromBase64String($asnBase64))
$nextUpdateString = $extAsnDecoded.format($false) # false for single line result
$textDateTime
$nextUpdateString
Get-Date $textDateTime
Get-Date $nextUpdateString
Вышеуказанное возвращает:
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
Как видите, две переменные выглядят идентичными на экране,Однако, хотя простая строковая переменная преобразуется в DateTime
с Get-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
Как видите, в версии есть дополнительные вопросительные знаки (символ 63 ASCII), возвращаемые путем декодирования ASN.1;что может объяснить, почему Get-DateTime
терпит неудачу.
Что здесь происходит?Что еще более важно, как я могу получить строку, декодированную из ASN.1, чтобы быть допустимым входным значением для Get-DateTime
?