Декодирование ASN.1 в строку и передача в Get-DateTime - PullRequest
0 голосов
/ 26 мая 2019

Используя 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?

1 Ответ

2 голосов
/ 27 мая 2019

Строка, возвращаемая AsnEncodedData.Format(), включает в себя набор символов форматирования слева направо. Вы можете заменить это простым регулярным выражением:

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

Cf является сокращенным выражением regex для категории юникода «Другое, Формат», которое будет соответствовать (и удаляться) символам форматирования, после чего вы сможете передать строку в Get-Date

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...