У меня есть консольное приложение, написанное на .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 он загружает только сертификат подписи.Я не мог найти ничего связанного здесь или в остальной части Интернета, поэтому я спрашиваю, есть ли у кого-нибудь какие-либо подсказки, в чем моя проблема здесь?
С уважением, Джулиан