2010-10-14 20 views
2

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?

Répondre

1

Quelles coupures de lignes exactes ajoutez-vous? CRLF ou juste LF?

J'ai un problème similaire en vérifiant le message smime. Et je trouve la cause. OpenSSL modifie les sauts de ligne en CRLF (mon message n'utilise que LF) pour que le contenu devienne différent de l'original et que la vérification du résumé échoue. Peut être que c'est toi aussi? Malheureusement, je ne trouve pas de solution.

+0

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

+0

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

+0

Malheureusement, j'ai déjà oublié comment j'ai résolu ce problème: (Je te souhaite bonne chance! – Donz