2017-01-22 2 views
0

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

Répondre

0

Je ne veux pas commenter toutes choses vous faites dans le code, parce que c'est faux et pas du tout nécessaire. IX509CertificateRequestPkcs10 interface contient CheckSignature que vous devez utiliser. Donc, votre code est tout quatre-liner:

#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 tiendra le statut de validité de la signature.

+0

Bonjour Crypt32 et merci beaucoup de prendre le temps de répondre – AUser

+0

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

+0

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