MissingMethodException при подписании PDF с iText7 и Vb.Net - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь протестировать образцы документации iText, переведенные на Vb. Net, но при выполнении pdfSigner.SignDetached (...) я получаю следующее странное исключение

MissingMethodException: 'System. Collections.IEnumerator Org.BouncyCastle.Asn1.Asn1Sequence.GetObjects () '

Код успешно считывает как сертификат pfx, так и исходный файл и создает файл назначения, но завершает работу на последнем шаге, оставляя целевой файл поврежден:

Imports System.IO
Imports Org.BouncyCastle.Crypto
Imports Org.BouncyCastle.X509
Imports iText.Kernel.Geom
Imports iText.Kernel.Pdf
Imports iText.Signatures
Imports Org.BouncyCastle.Pkcs

Public Class SignHelloWorld
        Public Shared ReadOnly root As String = Environment.GetFolderPath(Environment.SpecialFolder.Personal) & "\tmp\itext7\"
        Public Shared ReadOnly DEST As String = root & "results\signatures\chapter01\"
        Public Shared ReadOnly KEYSTORE As String = root & "resources\encryption\myCert.pfx"
        Public Shared ReadOnly SRC As String = root & "resources\pdfs\hello.pdf"
        Public Shared ReadOnly PASSWORD As Char() = "1234".ToCharArray()
        Public Shared ReadOnly RESULT_FILES As String() = {"hello_signed1.pdf", "hello_signed2.pdf", "hello_signed3.pdf", "hello_signed4.pdf"}

        Public Sub Sign(ByVal src As String, ByVal dest As String, ByVal chain As X509Certificate(), ByVal pk As ICipherParameters, ByVal digestAlgorithm As String, ByVal subfilter As PdfSigner.CryptoStandard, ByVal reason As String, ByVal location As String)
            Dim reader As PdfReader = New PdfReader(src)
            Dim signer As PdfSigner = New PdfSigner(reader, New FileStream(dest, FileMode.Create), New StampingProperties())
            Dim rect As Rectangle = New Rectangle(36, 648, 200, 100)
            Dim appearance As PdfSignatureAppearance = signer.GetSignatureAppearance()
            appearance.SetReason(reason).SetLocation(location).SetReuseAppearance(False).SetPageRect(rect).SetPageNumber(1)
            signer.SetFieldName("sig")
            Dim pks As IExternalSignature = New PrivateKeySignature(pk, digestAlgorithm)
            signer.SignDetached(pks, chain, Nothing, Nothing, Nothing, 0, subfilter)
            reader.Close()
        End Sub

        Public Shared Sub Main(ByVal args As String())
            Dim directory As DirectoryInfo = New DirectoryInfo(DEST)
            directory.Create()

            Dim pk12 As Pkcs12Store = New Pkcs12Store(New FileStream(KEYSTORE, FileMode.Open, FileAccess.Read), PASSWORD)
            Dim [alias] As String = Nothing

            For Each a In pk12.Aliases
                [alias] = (CStr(a))
                If pk12.IsKeyEntry([alias]) Then Exit For
            Next

            Dim pk As ICipherParameters = pk12.GetKey([alias]).Key
            Dim ce As X509CertificateEntry() = pk12.GetCertificateChain([alias])
            Dim chain As X509Certificate() = New X509Certificate(ce.Length - 1) {}

            For k As Integer = 0 To ce.Length - 1
                chain(k) = ce(k).Certificate
            Next

            Dim app As SignHelloWorld = New SignHelloWorld()
            app.Sign(SRC, DEST & RESULT_FILES(0), chain, pk, DigestAlgorithms.SHA256, PdfSigner.CryptoStandard.CMS, "Test 1", "Ghent")
            app.Sign(SRC, DEST & RESULT_FILES(1), chain, pk, DigestAlgorithms.SHA512, PdfSigner.CryptoStandard.CMS, "Test 2", "Ghent")
            app.Sign(SRC, DEST & RESULT_FILES(2), chain, pk, DigestAlgorithms.SHA256, PdfSigner.CryptoStandard.CADES, "Test 3", "Ghent")
            app.Sign(SRC, DEST & RESULT_FILES(3), chain, pk, DigestAlgorithms.RIPEMD160, PdfSigner.CryptoStandard.CADES, "Test 4", "Ghent")
        End Sub
End Class

1 Ответ

1 голос
/ 18 марта 2020

Насколько я вижу, текущая версия разработки iText 7 (7.1.11-SNAPSHOT) скомпилирована для BouncyCastle 1.8.5, и действительно, в B C 1.8.5 вы найдете в Asn1Sequence.cs

    [Obsolete("Use GetEnumerator() instead")]
    public IEnumerator GetObjects()
    {
        return GetEnumerator();
    }

, но в B C 1.8.6 этот метод был удален из Asn1Sequence.cs.

Таким образом, в настоящее время, пожалуйста, все еще используйте BouncyCastle 1.8.5 при разработке с iText 7 v7.1.10 или ранее.


Кроме того, BouncyCastle известен тем, что вводит API-изменения в релизы только с изменениями микро-версий. Большинство других проектов удалили бы методы (даже если они помечены как устаревшие) только в выпуске, по крайней мере, с изменением вспомогательной версии, если не в основной версии.

При использовании B C, поэтому вы всегда должны быть очень внимательны, какую именно версию использовать.

...