OpenSSL S / MIME подпись с .NET - PullRequest
       63

OpenSSL S / MIME подпись с .NET

2 голосов
/ 14 октября 2010

Для приложения, которое я разрабатываю, мне нужно создать файл подписи, прежде чем я смогу загружать файлы. В документации объясняется, как это сделать с openssl:

Сначала вам нужно подготовить ключ:

$ 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

После чего вы можете подписать любой файл, используя следующий синтаксис:

$ openssl smime -sign -in inputfile -signer pem -inkey key -passin pass:xxxxxx -outform PEM -out signaturefile

Это работает, но я бы предпочел не запускать внешнюю программу только для создания файлов сигнатур, если это возможно сделать с помощью собственного кода .NET.

Я пытался закодировать это в vb.net и получил следующее:

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

Файл, который он создает, не совсем то, что ожидает openssl: мне все еще нужно вставить -----BEGIN PKCS7----- и -----END PKCS7----- и добавить разрывы строк, чтобы строки были не длиннее 65 символов. Но даже после этого подпись, которую я сделал таким образом, недействительна, когда я проверяю с помощью openssl, я получаю следующую ошибку:

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:

Я думаю, что где-то забыл маленькую деталь, но я не могу просто понять, что.

Может кто-нибудь помочь мне заставить этот код работать? А если нет, укажите на библиотеку .NET, которая имеет такую ​​функциональность, и, возможно, пример того, как это сделать?

1 Ответ

1 голос
/ 19 октября 2010

Какие точные разрывы строк вы добавляете? CRLF или просто LF?

У меня похожая проблема при проверке смайм сообщения. И я нахожу причину. OpenSSL изменяет разрывы строк на CRLF (в моем сообщении используется только LF), поэтому содержимое становится отличным от исходного, а проверка дайджеста завершается неудачно. Может быть, это тоже ваш случай? К сожалению, я не могу найти решение.

...