X509Certificate2 отличается в вдовах и Linux в .NET Core Application - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть консольное приложение, написанное на .NET Core 2.1, и имеющее две функциональные возможности - одну: загружать цепочку сертификатов (сертификат, промежуточный сертификат и корневой сертификат), а также закрытый ключ, которые находятся в одном .p12файл, созданный из файла .p7b и файла .key.Это загружается в один X509Certificate2 класс, используя ctor(string filename, string password)

У меня есть установка, которая отлично работает в Windows, но когда я развертываю приложение в среде Linux (Debian 9) и когда я пытаюсьподписав сообщение, я получаю сообщение об ошибке: A certificate chain could not be built to a trusted root authority. вот код для загрузки сертификата:

public CertificateManager(IOptions<CertificateSettings> options)
{
   var settings = options.Value;
   _filePath = settings.Path;
   _password = settings.Password;
   Certificate = new X509Certificate2(_filePath, _password);
}

Код для подписи XML:

public string SignMessage(XmlNode message)
    {

        var signed = new SignedXml((XmlElement)message)
        {
            SigningKey = _certificateManager.Certificate.PrivateKey,
        };
        var referenceID = message.Attributes[PAResDescr.PAResID].Value;

        signed.SignedInfo.SignatureMethod = SignedXml.XmlDsigRSASHA1Url;

        var reference = new Reference { Uri = $"#{referenceID}" };
        reference.DigestMethod = SignedXml.XmlDsigSHA1Url;
        // Add the reference to the SignedXml object.
        signed.AddReference(reference);


        var keyInfo = new KeyInfo();
        var keyInfoData = new KeyInfoX509Data(_certificateManager.Certificate, X509IncludeOption.WholeChain);
        keyInfo.AddClause(keyInfoData);


        signed.KeyInfo = keyInfo;

        signed.ComputeSignature();

        return signed.GetXml().OuterXml;
    }

Как яКак уже упоминалось, этот код работает нормально, когда я запускаю его на компьютере с Windows, но когда я запускаю его на Linux (Debian 9), я получаю упомянутую ошибку, вот вся трассировка стека:

at System.Security.Cryptography.Xml.KeyInfoX509Data..ctor(X509Certificate cert, X509IncludeOption includeOption)
at Payment.Service.Cryptography.LocalCertificateSigner.SignMessage(XmlNode message) in /home/juls/Projects/ACS/Payment.Service/Cryptography/LocalCertificateSigner.cs:line 44

Интересная частьв том, что когда я запускаю это без параметра конструктора X509IncludeOption.WholeChain, ошибка исчезает, но в подпись включается только сертификат подписи, а не вся цепочка.Я думаю, что когда сертификат загружен, в Windows он загружает всю цепочку, но в Linux он загружает только сертификат подписи.Я не мог найти ничего связанного здесь или в остальной части Интернета, поэтому я спрашиваю, есть ли у кого-нибудь какие-либо подсказки, в чем моя проблема здесь?

С уважением, Джулиан

1 Ответ

0 голосов
/ 20 декабря 2018

Проблема заключалась в том, что промежуточный и корневой сертификаты не были доверены машине Linux.Как @ Crypt32 предложил в первом комментарии ниже, вопрос, добавив их в доверенное хранилище, решил проблему.Спасибо!

...