2017-01-20 17 views
0

Может кто-то пожалуйста, помогите мне со следующим вопросомПроверка подписи (запрос 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

ответ

1

из того, что я читал и пытался до сих пор, я могу передать конструктор одного из этих двух значений: либо 0x1 для SHA1 или 0x2 для УВХ2 (SHA256, например).

Это не совсем правильно. CheckSignature принимает параметр, указывающий, какие подписи разрешены, и при необходимости может быть побитовым.

Если используется NullSignature, то вы не проверяете подпись вообще, все, что проверяется, является дайджестом CSR. Если используется KeySignature, то подпись CSR проверяется на открытый ключ, который используется для проверки CSR.

Вы должны всегда передавать 0x01 в CheckSignature, если у вас нет четкой необходимости не проверять асимметричную подпись.

+0

Последний абзац совершенно неверен в отношении .NET и PowerShell. – Crypt32

+0

Просто для объяснения: 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

+0

Исправление: RCW подавляет коды 'HRESULT', меняя тип возврата на' void' в управляемых классах. Следовательно, 'S_OK' не возвращает никакого возвращаемого значения, любое ненулевое значение HRESULT будет преобразовано в управляемое исключение. – Crypt32

 Смежные вопросы

  • Нет связанных вопросов^_^