firma OpenSSL S / MIME con .NET
-
30-09-2019 - |
Domanda
Per un'applicazione sto sviluppando ho bisogno di creare un file di firma prima di poter caricare i file. La documentazione di esso spiega come fare questo con OpenSSL:
Per prima cosa è necessario preparare la vostra chiave:
$ 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
Dopo di che è possibile firmare qualsiasi tipo di file utilizzando la seguente sintassi:
$ openssl smime -sign -in inputfile -signer pem -inkey key -passin pass:xxxxxx -outform PEM -out signaturefile
Questo funziona, ma preferirei evitare di dover eseguire un programma esterno solo per creare file di firma, se è possibile farlo con il codice nativo NET.
Ho cercato di codice di questo in vb.net ed ho ottenuto il seguente:
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
Il file si fa non è esattamente quello openssl aspetta: ho ancora bisogno di inserire il -----BEGIN PKCS7-----
e -----END PKCS7-----
e aggiungere interruzioni di riga in modo che le linee non più lungo di 65 caratteri sono.
Ma, anche dopo averlo fatto, la firma ho fatto in questo modo non è valida, quando controllo con OpenSSL ottengo il seguente errore:
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:
Credo che sto dimenticando un piccolo dettaglio da qualche parte, ma non riesco proprio a capire cosa.
Qualcuno può darmi una mano fare quel lavoro codice? E se no, scegliere una libreria .NET che ha tale funzionalità con forse un esempio di come farlo?
Soluzione
Quello che rompe linea esatta si fa ad aggiungere? CRLF o semplicemente LF?
Non ho problema simile verifica smime messaggio. E trovo la causa. OpenSSL cambia interruzioni di linea a CRLF (il mio uso messaggio solo LF) in modo contenuto diventare diverso da quello originario e digerire controllo ha esito negativo. Può essere che è si troppo caso? Purtroppo non riesco a trovare una soluzione.