2017-01-22 2 views
0

Может кто-то пожалуйста, помогите мне следующую :)Подпись КСО всегда возвращает ложь (даже если подпись действительна)

Это сообщение относится к исходному сообщению, я создал по следующему адресу

Checking the signature of a CSR (X.509 certificate signing request)

Однако я хотел сохранить этот пост отдельно, поскольку я пытаюсь использовать альтернативный метод.

«Цель» заключается в «проверке», если CSR (запрос на подпись сертификата X509 в формате base64 PKCS # 10 имеет действительную подпись), что означает использование открытого ключа из CSR и проверка подписи в порядке (например, проверка дайджест матчи после расшифровки подписи с помощью открытого ключа, состоявшегося в сертификате, а не просто проверить хэш хорошо сформирован)

Первоначально я думал, что я мог бы просто использовать метод ChecjSignature из X509enrollment.CX509CertificateRequestPkcs10 COM объекта (см моих начального сообщение по указанному выше адресу)

Однако авторы моего начальный пост, указал, что метод, который я использую (особенно для проверки подписи SHA1), прошел бы, даже если CSR не был подписан или содержит открытый ключ, не принадлежащий подписи. Другими словами, он просто подтверждал дайджест (хэш), а не подпись была действительной.

Я должен указать, что я не разработчик, но хорошо с PowerShell и понимаю понятия C#, поэтому я сделал некоторое копирование, пытаясь найти подходящий TYPE, который имел метод, который я мог бы использовать для проверки подписи на CSR, (так как я не мог найти KeySignature метода намекал на вкладчик в моей должности)

Поэтому после некоторого копания, я написал следующий код PowerShell, но всегда возвращает FALSE, когда я знаю, что КСО является действительным, и подписано SHA1

<# contents of CSR file 
-----BEGIN NEW CERTIFICATE REQUEST----- 
MIID9zCCAt8CAQAwHTEbMBkGA1UEAwwSd3d3MDEuZmFicmlrYW0uY29tMIIBIjAN 
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlQdqVHQgzd1uJ9MFb935Vfyg1Y1m 
ZXn4OMwJudOhEzx7m1+4C8lDOXn5hglHG0FFad+KkLok/GcAzdc2iwBOholJ2MYP 
XCnfkJLYXHLRj+CKRvhCHWJOXkQQQ0apdXh1MhiDBD/BIKqmMm54XLFhZqjQiNeI 
VHFb9GS06Ps/xuOWzqY54xSM/047nzYNU50FrTHuBCiqtJtHpKtdrCWyhWi7was0 
noCx/XGm6g8nVnzPTQCSeAPp6mSt4kSMtdoVZYg1n5pmMW+QYAero/UWrbNp1Wlk 
pUH4s96H6pUrbF7RIkXpCwWocxBHAXVcMst2HYvwstAETxvqeKTOvVEEAQIDAQAB 
oIIBkzAcBgorBgEEAYI3DQIDMQ4WDDEwLjAuMTQzOTMuMjBCBgkrBgEEAYI3FRQx 
NTAzAgEJDA9ERVNLVE9QLU41OEkzMzEMFERFU0tUT1AtTjU4STMzMVx1c2VyDAdj 
ZXJ0cmVxMHIGCisGAQQBgjcNAgIxZDBiAgEBHloATQBpAGMAcgBvAHMAbwBmAHQA 
IABSAFMAQQAgAFMAQwBoAGEAbgBuAGUAbAAgAEMAcgB5AHAAdABvAGcAcgBhAHAA 
aABpAGMAIABQAHIAbwB2AGkAZABlAHIDAQAwgboGCSqGSIb3DQEJDjGBrDCBqTAO 
BgNVHQ8BAf8EBAMCBaAweAYJKoZIhvcNAQkPBGswaTAOBggqhkiG9w0DAgICAIAw 
DgYIKoZIhvcNAwQCAgCAMAsGCWCGSAFlAwQBKjALBglghkgBZQMEAS0wCwYJYIZI 
AWUDBAECMAsGCWCGSAFlAwQBBTAHBgUrDgMCBzAKBggqhkiG9w0DBzAdBgNVHQ4E 
FgQUBMisP2saqKPzBdEj1TyUC4jQR78wDQYJKoZIhvcNAQEFBQADggEBADCBGPbL 
mGx89pgELT/wwZmdDuN3ci+3oaA1wfUHgqVmIXLbadnx41Z1j/30tZKxO7YE86b6 
Sx7jXFusiH+sAseAqWkgF00vJ2RDNaTE8iDn/cQlxELtUxYn75F7jVmWMgUgAIH6 
CLjf34ssNp+9tywKl1/72QC0ixaL4qoaJaLF2ezPB/UZ3rVV5FHsonAnd5oDiKwz 
lws0e3zf3EZpcd2FzgxTqhYAEYFdvCBHvjSCvHg0x7L1e2J3pPRMKv6nSN9wfvxM 
UC72lcn9skWOrnpCt24vn1E3BI16QWD27xZpx4z+LfbJwKGkf987vIcIipRZCAco 
dcvCmbzEjf1/xso= 
-----END NEW CERTIFICATE REQUEST----- 
#> 

#get contents of CSR file as a Base64 String (e.g. the -raw parameter returns string rather than array) 
$CSR = Get-Content c:\TEMP\csr.txt -raw 

#create an instance of the X509enrollment.CX509CertificateRequestPkcs10 class COM object 
$RequestComObj = New-Object -ComObject X509enrollment.CX509CertificateRequestPkcs10 

#decode the CSR (returns COM object) 
$RequestComObj.InitializeDecode($CSR,6) 

#get public key from CSR COM object (returns Base64 string) 
$PublicKey = $RequestComObj.PublicKey.EncodedKey() 

#get public key from CSR COM object (returns Base64 string) 
$Signature = $RequestComObj.Signature() 

#convert CSR Base64 string to Byte array 
$CSRBytes = [Byte[]][Char[]]$CSR 

#convert PublicKey Base64 string to Byte Array 
$PublicKeyBytes = [Byte[]][Char[]]$PublicKey 

#convert Singature Base64 string to Byte Array 
$SignatureBytes = [Byte[]][Char[]]$Signature 

#create an instance of the System.Security.Cryptography.RSACryptoServiceProvider class 
$RSACryptoServiceProvider = [System.Security.Cryptography.RSACryptoServiceProvider]::Create() 

$RSACryptoServiceProvider 
#get the OID for the SHA1 algirithm 
$SHA1_OID = [System.Security.Cryptography.CryptoConfig]::MapNameToOID('SHA1') 

#attempt to verify signature of CSR 
$RSACryptoServiceProvider.VerifyData($CSRBytes,$SHA1_OID,$SignatureBytes) 

чтение статьи MSDN на System.Security.Cryptography.RSACryptoServiceProvider ТИПА он утверждает метод VerifyData используется для проверки данных, который был подписан с использованием методаSignData, поэтому, я имею в виду причину мой код всегда возвращает FALSE, может быть потому, CSR не был подписан с использованием этого метода SignData в первом экземпляре, а скорее каким-либо другим методом.

Поэтому может кто-то любезно помочь мне и показать мне, как проверить подпись на CSR, действительно, например. использовать открытый ключ в CSR, чтобы проверить подпись действительна (например, расшифровка подписи с помощью открытого ключа, и сравнить хэши)

Спасибо всем заранее __AUser

ответ

0

Я не хочу комментировать все вещи вы делаете в коде, потому что это неправильно и вообще не нужно. IX509CertificateRequestPkcs10 Интерфейс содержит CheckSignature который вы должны использовать. Таким образом, весь ваш код четыре лайнера:

#get contents of CSR file as a Base64 String (e.g. the -raw parameter returns string rather than array) 
$CSR = Get-Content c:\TEMP\csr.txt -raw 

#create an instance of the X509enrollment.CX509CertificateRequestPkcs10 class COM object 
$RequestComObj = New-Object -ComObject X509enrollment.CX509CertificateRequestPkcs10 
#decode the CSR (returns COM object) 
$RequestComObj.InitializeDecode($CSR,6) 

#validate signature 
$signatureIsValid = $false 
try { 
    $RequestComObj.CheckSignature(0x1) 
    $signatureIsValid = $true 
} catch { } 

$signatureIsValid проведет статус действия подписи.

+0

Здравствуйте, Crypt32, спасибо большое за то, что нашли время ответить – AUser

+0

Извините, что я хотел добавить, изначально я использовал метод CheckSignature, но я был проинформирован в предыдущем сообщении, которое я сделал здесь: http://stackoverflow.com/questions/41765074/check-the-signature-of-a-csr-x-509-certificate-sign-request, что это не обязательно проверяет подпись, поскольку позволяет Null и, следовательно, просто хеш, а не подписанный хеш, также будет передаваться как поэтому я искал альтернативу (я, возможно, неправильно понял), чтобы ответить на мой предыдущий пост. Вы можете прояснить это для меня? Еще раз спасибо – AUser

+0

На самом деле думать об этом (еще не пробовал), если у вас была CSR, которая не была подписана, и вы пытались декодировать с помощью $ RequestComObj.InitializeDecode ($ CSR, 6). Я предполагаю, что это приведет к сбою декодирования, поскольку оно не было подписано и CSR должны быть подписаны, если это так, тогда ответ на CheckSignature (0x1) в порядке. В любом случае, я снова благодарю за вашу помощь :) – AUser

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