簡體   English   中英

X509Certificate2 在 .NET Core 應用程序中的 widows 和 linux 不同

[英]X509Certificate2 different in widows and linux in .NET Core Application

我有一個用 .NET Core 2.1 編寫的控制台應用程序,它有兩個功能 - 一個:加載證書鏈(證書、中間證書和根證書),以及一個私鑰,它們位於從創建的 one.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 中它只加載簽名證書。 我在這里或互聯網的其他地方找不到任何相關的東西,所以我問是否有人有任何線索,我的問題是什么?

問候, 朱利安

問題是 Linux 機器不信任中間證書和根證書。 正如 @Crypt32 在問題下方的第一條評論中所建議的那樣,將它們添加到受信任的商店,解決了問題。 謝謝 !

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM