Может кто-то пожалуйста, помогите мне следующую :)Подпись КСО всегда возвращает ложь (даже если подпись действительна)
Это сообщение относится к исходному сообщению, я создал по следующему адресу
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
Здравствуйте, Crypt32, спасибо большое за то, что нашли время ответить – AUser
Извините, что я хотел добавить, изначально я использовал метод CheckSignature, но я был проинформирован в предыдущем сообщении, которое я сделал здесь: http://stackoverflow.com/questions/41765074/check-the-signature-of-a-csr-x-509-certificate-sign-request, что это не обязательно проверяет подпись, поскольку позволяет Null и, следовательно, просто хеш, а не подписанный хеш, также будет передаваться как поэтому я искал альтернативу (я, возможно, неправильно понял), чтобы ответить на мой предыдущий пост. Вы можете прояснить это для меня? Еще раз спасибо – AUser
На самом деле думать об этом (еще не пробовал), если у вас была CSR, которая не была подписана, и вы пытались декодировать с помощью $ RequestComObj.InitializeDecode ($ CSR, 6). Я предполагаю, что это приведет к сбою декодирования, поскольку оно не было подписано и CSR должны быть подписаны, если это так, тогда ответ на CheckSignature (0x1) в порядке. В любом случае, я снова благодарю за вашу помощь :) – AUser