Quelqu'un peut-il s'il vous plaît aidez-moi à ce qui suit :)vérification de la signature sur la RSE renvoie toujours faux (même si la signature est valide)
Ce poste se rapporte à un premier poste que j'ai créé à l'adresse suivante
Checking the signature of a CSR (X.509 certificate signing request)
Cependant, je voulais garder ce post séparé car j'essaie une méthode alternative. Le 'but' est de 'vérifier' si un CSR (demande de signature de certificat X509 au format PKCS # 10 base64 a une signature valide), ce qui signifie prendre la clé publique du CSR et vérifier que la signature est OK (par ex. digest correspond après la signature avec la clé publique déchiffrement tenue dans le certificat, et non seulement vérifier hachage est bien formé)
au départ, je pensais que je pouvais simplement utiliser la méthode ChecjSignature du X509enrollment.CX509CertificateRequestPkcs10 objet COM (voir mon premier afficher à l'adresse ci-dessus)
Cependant contributeurs à mon message initial, a souligné la méthode que j'utilise (en particulier pour la vérification de la signature SHA1) passerait même si CSR n'était pas signé ou contient une clé publique n'appartenant pas à la signature. En d'autres termes, il s'agissait simplement de confirmer le condensé (hash) et non la signature était valide. Je dois préciser que je ne suis pas un développeur, mais OK avec PowerShell et comprendre les concepts de C#, donc j'ai fait des recherches pour trouver un TYPE approprié qui avait une méthode que je pourrais utiliser pour vérifier la signature sur un CSR, (comme je ne pouvais pas trouver la méthode KeySignature évoquée par un contributeur dans mon message original)
par conséquent, après quelques recherches, j'ai écrit le code PowerShell suivant, mais est toujours retourne FALSE quand je sais que la RSE est valide et signé 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)
lire l'article MSDN sur la System.Security.Cryptography.RSACryptoServiceProvider TYPE il indique la méthode verifydata est utilisé pour vérifier les données qui a été signé en utilisant la méthode SignData donc, je pense la raison pour laquelle mon code renvoie toujours FAUX peut être parce que le CSR n'a pas été signé en utilisant cette méthode SignData dans la première instance, mais plutôt une autre méthode.
Par conséquent, quelqu'un peut m'aider avec bonté, et montrez-moi comment verfy la signature sur un CSR est valide, par exemple. utiliser la clé publique dans la RSE pour vérifier la signature est valide (par exemple, la signature avec la clé decrypt publique et comparer hash)
Merci à tous à l'avance __AUser
Bonjour Crypt32 et merci beaucoup de prendre le temps de répondre – AUser
Désolé je voulais ajouter, initialement j'utilisais la méthode CheckSignature mais j'ai été informé dans un post précédent j'ai fait ici: http://stackoverflow.com/questions/41765074/checking-the-signature-of-a-csr-x-509-certificate-signing-demande que cela ne vérifie pas nécessairement la signature car elle permet Null et donc juste un hachage plutôt qu'un hachage signé passerait aussi comme valide, donc je cherchais une alternative (j'ai peut-être mal compris) aux réponses à mon post précédent. Pouvez-vous clarifier cela pour moi? merci encore – AUser
En fait y penser (pas encore essayé) si vous aviez un CSR qui n'était pas signé et que vous essayiez de décoder avec $ RequestComObj.InitializeDecode ($ CSR, 6) je suppose qu'il échouerait à décoder car il n'était pas signé et Les CSR sont destinés à être signés, si c'est le cas, alors répondre sur CheckSignature (0x1) est OK. De toute façon je digresse merci encore pour votre aide :) – AUser