Подписание пропусков в сберкнижке Apple

Я пытаюсь подписать файл manifest.json на С# для пропусков Apple Passbook. Я следил за Руководство Apple по подписанию пропусков и просмотрела сообщения здесь и здесь . Когда я выполняю код, в строке signedCms.ComputeSignature(cmsSigner); возникает CryptographicException, говорящее, что

Ключ не существует

Это код, который у меня сейчас есть:

    private void button2_Click(object sender, EventArgs e)
    {

        String manifest = System.IO.File.ReadAllText(@"C:\Users\Administrator\Downloads\Testpass\Testpass\manifest.json");
        byte[] msgBytes = Encoding.Unicode.GetBytes(manifest);
        byte[] sign = SignMsg(msgBytes, findCertificate(true));

        //byte[] sign = signit(manifest);
        File.WriteAllBytes(@"C:\Users\Administrator\Downloads\Testpass\Testpass", sign);


    }

    private byte[] SignMsg(Byte[] msg, X509Certificate2 signerCert)
    {
        ContentInfo contentInfo = new ContentInfo(msg);
        SignedCms signedCms = new SignedCms(contentInfo, true);

        X509Certificate2 developerCertificate = new X509Certificate2(@"C:\Users\Administrator\Downloads\pass.cer");
        X509Certificate2 appleWWDRCA = new X509Certificate2(@"C:\Users\Administrator\Downloads\AppleWWDRCA.cer");
        CmsSigner cmsSigner = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, developerCertificate);
        cmsSigner.IncludeOption = X509IncludeOption.EndCertOnly;
        cmsSigner.Certificates.Add(appleWWDRCA);
        cmsSigner.SignedAttributes.Add(new Pkcs9SigningTime(DateTime.Now));

        //  Sign the CMS/PKCS #7 message.
        signedCms.ComputeSignature(cmsSigner);

        //  Encode the CMS/PKCS #7 message.
        return signedCms.Encode();
    }

Необходимо ли получать сертификаты из хранилища сертификатов Windows или их можно получить из файловой системы? Любая помощь в решении проблемы приветствуется!

PS: я также просмотрел DotNet-Passbook, но прежде всего это создал мне некоторые проблемы, а во-вторых, мне действительно нужно только подписать файл манифеста, не все остальное, что предоставляет библиотека.


person Jorn    schedule 21.03.2014    source источник


Ответы (1)


Я создатель dotnet-passbook.

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

Когда вы откроете сертификат в Windows, он укажет, включен ли закрытый ключ.

person Tomas McGuinness    schedule 21.03.2014
comment
Спасибо. Я проверил сертификат, в нем не говорится, что у вас есть закрытый ключ ... как говорится в некоторых других моих сертификатах. Как это исправить? - person Jorn; 22.03.2014
comment
При экспорте сертификата из Windows необходимо убедиться, что вы решили включить закрытый ключ. Если вы делаете это из OS X, вы должны расширить сертификат и выбрать как сертификат, так и ключ при выполнении экспорта. - person Tomas McGuinness; 23.03.2014
comment
@tomasmcguinness Думали ли вы о преобразовании сберегательной книжки dotnet для использования ядра .net? Является ли это возможным? - person Lyubomir Velchev; 24.05.2018
comment
Пока не рассматривал, так как никто не просил. Я посмотрю. Я предполагаю, что решение состоит в том, чтобы сделать пакет Nuget совместимым с .Net Standard 2.0. - person Tomas McGuinness; 25.05.2018
comment
@LyubomirVelchev Я создал новую ветку dotnet-passbook, которая содержит мой первый проход в поддержку .Net Standard. Я подумал, что вам может быть интересно. - person Tomas McGuinness; 18.10.2018