Может кто-то пожалуйста, помогите мне со следующим вопросомПроверка подписи (запрос X.509 подписи сертификата) в CSR
Я хочу, чтобы проверить подпись (запрос X509 подписи сертификата) в области КСО является действительными I верю, что я знаю, как это сделать (следующим образом), но не уверен, что мое понимание правильное и было бы очень признательно, если бы кто-то мог проверить/исправить/подтвердить мой метод.
Я использую PowerShell (но понять основные понятия C '# тоже) У меня есть текстовый файл на жестком диске, который является в основном base64 закодирован CSR называется csr.txt
Так в PowerShell я следующее
$ CSR = Get-Content C: \ Temp \ csr.txt -raw $ RequestComObj = New-Object -ComObject X509enrollment.CX509CertificateRequestPkcs10 $ RequestComObj.InitializeDecode ($ КСО, 6)
сейчас У меня есть CSR есть метод CheckSignature на нем, которая требует Pkcs10AllowedSignatureTypes в конструкторе, когда я смотрю в это я вижу два значения шестигранные, представляющие возможные варианты
AllowedKeySignature = 0x1 AllowedNullSignature = 0x2
Из того, что я прочитал/пытавшихся это далеко Я могу передать конструктору одно из этих двух значений либо 0x1 для SHA1, либо 0x2 для SHA2 (например, SHA256) Поэтому мой вопрос: если у меня есть CSR, подписанный с использованием SHA1, и я хочу проверить эту подпись SHA1, если она действительна, последняя часть мой сценарий должен выглядеть так?
$ RequestComObj.CheckSignature (0x1)
или, возможно, просто
$ RequestComObj.CheckSignature (1)
Если CSR подписан SHA2 Я хотел бы использовать
$ RequestComObj.CheckSignature (0x2)
или, возможно, только
$ RequestComObj.CheckSignature (2)
Когда я пытаюсь, приведенная выше PowerShell ничего не возвращает на консоль (при условии, что CSR подписан соответственно), что является нормальным для PowerShell, т. Е. Если никакая ошибка не возвращает ничего.
Правильно ли это? напримердействительно для проверки подписей, как я думаю, что это
Спасибо Всего
__AUser
я редактирую мой вопрос, чтобы ответить на ответы ниже (как слишком большой, чтобы получить возможность отправлять как комментарий)
Здравствуйте vcsjones и Crypt32
большое спасибо вам обоим за время, потраченное на ответ на мой вопрос (COM> CRL-обертка и маскировка ошибок были очень полезны для моего более широкого понимания).
Итак, если я правильно вас понимаю (простите меня, я не программист/разработчик), если я использую 0x1, как указано выше, он проверяет, является ли дайджест (например, Hash) SHA1 и ОК и НЕ проверяет, является ли подпись правильный для этого дайджест? другими словами, может быть возможно иметь действительную подпись, но для другого дайджеста, и она все равно будет проходить, если использовать 0x1
Я понимаю, что правильно?
Если это так, то использование 0x2 выше было бы старой проверкой, является ли дайджест SHA2, а не то, что подпись действительно принадлежит этому дайджесту?
Также вы упоминали выше, чем с использованием CheckSignature() следует использовать KeySignature
Когда я смотрю на членов объекта $ RequestComObj PowerShell выше, я не вижу член называется KeySignature (если оно зарыто дальше вниз), а я вижу следующий сбор членов COM
Type : 1
EnrollmentContext : 1
Silent : False
ParentWindow :
UIContextMessage :
SuppressDefaults : False
ClientId : 9
CspInformations :
HashAlgorithm : System.__ComObject
AlternateSignatureAlgorithm : False
TemplateObjectId :
PublicKey : System.__ComObject
PrivateKey :
NullSigned : False
ReuseKey : False
Subject : System.__ComObject
CspStatuses :
SmimeCapabilities : False
SignatureInformation : System.__ComObject
KeyContainerNamePrefix :
CryptAttributes : System.__ComObject
X509Extensions : System.__ComObject
CriticalExtensions : System.__ComObject
SuppressOids : System.__ComObject
PolicyServer :
Template :
AttestPrivateKey : False
EncryptionAlgorithm :
EncryptionStrength :
ChallengePassword :
NameValuePairs : System.__ComObject
ClaimType :
AttestPrivateKeyPreferred : False
из вышесказанного я разработал я могу получить кодировкой Base64 версию Подпись и Public Key с помощью следующих методов
$RequestComObj.Signature()
ysZ//Y3EvJnCy3UoBwhZlIoIh7w733+kocDJ9i3+jMdpFu/2YEF6jQQ3UZ8vbrdC
eq6ORbL9yZX2LlBM/H5w30in/ipM9KR3Ynv1ssc0eLyCNL5HILxdgREAFqpTDM6F
3XFpRtzffHs0C5czrIgDmncncKLsUeRVtd4Z9QfP7NnFoiUaquKLFou0ANn7X5cK
LLe9nzYsi9/fuAj6gQAgBTKWWY17ke8nFlPtQsQlxP3nIPLEpDVDZCcvTRcgaamA
xwKsf4isW1zjHkv6pvMEtjuxkrX0/Y91VuPx2WnbciFmpYIH9cE1oKG3L3J34w6d
mcHwPy0EmPZ8bJjL9hiBMA==
$RequestComObj.PublicKey.EncodedKey()
MIIBCgKCAQEAlQdqVHQgzd1uJ9MFb935Vfyg1Y1mZXn4OMwJudOhEzx7m1+4C8lD
OXn5hglHG0FFad+KkLok/GcAzdc2iwBOholJ2MYPXCnfkJLYXHLRj+CKRvhCHWJO
XkQQQ0apdXh1MhiDBD/BIKqmMm54XLFhZqjQiNeIVHFb9GS06Ps/xuOWzqY54xSM
/047nzYNU50FrTHuBCiqtJtHpKtdrCWyhWi7was0noCx/XGm6g8nVnzPTQCSeAPp
6mSt4kSMtdoVZYg1n5pmMW+QYAero/UWrbNp1WlkpUH4s96H6pUrbF7RIkXpCwWo
cxBHAXVcMst2HYvwstAETxvqeKTOvVEEAQIDAQAB
Так что теперь я имею в виду, я в КСО, у меня есть подпись и у меня есть открытый ключ из этих трех частей информации я должен быть в состоянии проверить, действительна ли подпись на CSR?
мне просто нужно немного помочь с кодом, если вы будете так добры, пожалуйста, C#, это найти, как я могу использовать это в соответствии с PowerShell и т.д.
Большое спасибо еще раз высоко ценится
__AUser
Последний абзац совершенно неверен в отношении .NET и PowerShell. – Crypt32
Просто для объяснения: CertEnroll - это набор интерфейсов COM. CLR (PS, .NET) не может напрямую взаимодействовать с COM-миром, и мир COM не может напрямую взаимодействовать с CLR. Они используют прокси: COM Callable Wrapper (CCW) для связи: COM -> CLR и Runtime Callable Wrapper (RCW) для связи CLR -> COM. RCW подавляет коды S_OK, меняя тип возврата на «void» и ненулевое значение HRESULT переводит на управляемое исключение. Таким образом, объяснение OP полностью верно. – Crypt32
Исправление: RCW подавляет коды 'HRESULT', меняя тип возврата на' void' в управляемых классах. Следовательно, 'S_OK' не возвращает никакого возвращаемого значения, любое ненулевое значение HRESULT будет преобразовано в управляемое исключение. – Crypt32