Pour une application que je développe, j'ai besoin de créer un fichier de signature avant de pouvoir télécharger des fichiers. La documentation explique comment faire avec OpenSSL:Signature OpenSSL S/MIME avec .NET
D'abord, vous devez préparer votre clé:
$ openssl pkcs12 -in certificate.pfx -passin pass:xxxxxxxxxx -out pem -clcerts -nokeys
$ openssl pkcs12 -in certificate.pfx -passin pass:xxxxxxxxxx -passout pass:xxxxxx -out key
Après quoi vous pouvez signer un fichier en utilisant la syntaxe suivante:
$ openssl smime -sign -in inputfile -signer pem -inkey key -passin pass:xxxxxx -outform PEM -out signaturefile
Cela fonctionne, mais je préfère éviter d'avoir à exécuter un programme externe juste pour créer des fichiers de signature s'il est possible de le faire avec du code .NET natif.
J'ai essayé de le coder en vb.net et a obtenu les éléments suivants:
Public Shared Sub SignFile(ByVal theFilename As String, ByVal theCertFile As String, ByVal thePassword As String, ByVal theDestination As String)
Dim aCertificate = New X509Certificates.X509Certificate2(theCertFile, thePassword)
Dim aByteArray = IO.File.ReadAllBytes(theFilename)
Dim anOid = New System.Security.Cryptography.Oid("1.2.840.113549.1.7.2")
Dim aContentInfo = New Pkcs.ContentInfo(anOid, aByteArray)
Dim aSignedCms = New Pkcs.SignedCms(aContentInfo, True)
Dim aCmsSigner = New Pkcs.CmsSigner(Pkcs.SubjectIdentifierType.IssuerAndSerialNumber, aCertificate)
aSignedCms.ComputeSignature(aCmsSigner)
Dim aSignature = Convert.ToBase64String(aSignedCms.Encode())
IO.File.WriteAllText(theDestination, Convert.ToBase64String(anOutput.ToArray()))
End Sub
Le fichier qu'il fait est pas exactement ce que OpenSSL attend: Je dois encore insérer le -----BEGIN PKCS7-----
et -----END PKCS7-----
et ajouter dans les sauts de ligne de sorte que les lignes ne dépassent pas 65 caractères. Mais, même après avoir fait cela, la signature de cette façon que je fait est pas valable, quand je vérifie avec OpenSSL je reçois l'erreur suivante:
5768:error:21071065:PKCS7 routines:PKCS7_signatureVerify:digest failure:.\crypto\pkcs7\pk7_doit.c:1051:
5768:error:21075069:PKCS7 routines:PKCS7_verify:signature failure:.\crypto\pkcs7\pk7_smime.c:410:
Je pense que j'oublie quelque part un petit détail, mais je Je ne peux pas comprendre quoi.
Quelqu'un peut-il m'aider à faire fonctionner ce code? Et si non, pointez vers une bibliothèque .NET qui a une telle fonctionnalité avec éventuellement un exemple de la façon de le faire?
J'ai trouvé le problème que j'avais maintenant: était quelque chose de similaire à ceci. Je n'ai pas spécifié l'encodage quand j'ai lu le fichier. Si j'utilise l'encodage ASCII, cela fonctionne. – Mew
J'espère que vous voyez cela. Bien que ce soit un vieux fil j'ai exactement le même problème. J'ai essayé d'ouvrir le fichier d'entrée dans un flux ASCII, en encodant la sortie avec ASCII. Je ne reçois jamais la même sortie que openssl (avec ou sans ----- BEGIN PKCS7 ----) Si vous pouviez mettre à jour votre question avec la version de travail, je serais reconnaissant – ufosnowcat
Malheureusement, j'ai déjà oublié comment j'ai résolu ce problème: (Je te souhaite bonne chance! – Donz