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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top