CryptoPro / libcore

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SignatureDescription could not be created for the signature algorithm supplied

Poisent opened this issue · comments

Добрый день. При подписи XML ловим вот такую ошибку:

SignatureDescription could not be created for the signature algorithm supplied

Версия библиотек:
2024.2.29

Информация о сертификате:
Signature Algorithm : ГОСТ Р 34.11-2012/34.10-2012 256 бит
PublicKey Algorithm : ГОСТ Р 34.10-2012 256 бит (512 bits)

Окружение:
SDK Version: 6.0.105
redos 7.3 сертифицированная
CSP (Type:80) v5.0.10008 KC1 Release Ver:5.0.12000 OS:Linux CPU:AMD64 FastCode:READY:AVX. DISABLED:RSA;

Код: (основа кода взята из документации)

public XmlElement SignXml(string xml, string uri, CpX509Certificate2 cert)
{
    var data = new XmlDocument();
    data.LoadXml(xml);

    var signedXml = new CpSignedXml(data) { SigningKey = cert.PrivateKey };

    var reference = new CpReference
    {
        Uri = "#" + uri,
        DigestMethod = CpSignedXml.XmlDsigGost3411_2012_256Url
    };

    reference.AddTransform(new CpXmlDsigEnvelopedSignatureTransform());
    reference.AddTransform(new XmlDsigSmevTransform());
    reference.AddTransform(new CpXmlDsigExcC14NTransform());


    signedXml.SafeCanonicalizationMethods.Add("urn://smev-gov-ru/xmldsig/transform");
    signedXml.AddReference(reference);


    var keyInfo = new CpKeyInfo();
    keyInfo.AddClause(new CpKeyInfoX509Data(cert));
    signedXml.KeyInfo = keyInfo;

    signedXml.ComputeSignature();

    return signedXml.GetXml();
}

Добрый день.

Ваш код (с указанием Uri = "") на сертификате 2012_256 успешно заработал.

Для начала убедитесь, что подписываете именно сертификатом с алгоритмом 3410-2012_256.

Также крайне рекомендуется обновить csp до актуального релиза. В старых версиях может отсутствовать нужная функциональность для ряда сценариев.

Также приложите пожалуйста пример файла, который пытаетесь подписать и сертификат (если возможно).

Добрый день!
XML:
<SerializationContainer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.2"><SenderProvidedRequestData Id="SIGNED_BY_CONSUMER"><MessageID>235a3810-dc58-11ee-b3e3-14539de46a6e</MessageID><MessagePrimaryContent xmlns="urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.2"><tns:OTSVEGRULRequest xmlns:tns="urn://x-artefacts-fns-otsvegrul/root/312-79/4.0.0" ИдЗапрос="1dea7535-082d-4d4a-9a29-91e49047af20"><tns:ЗапросЮЛ><tns:ОГРН>1027809237796</tns:ОГРН></tns:ЗапросЮЛ></tns:OTSVEGRULRequest></MessagePrimaryContent></SenderProvidedRequestData></SerializationContainer>
Открытую часть сертификата добавил в качестве файла

smev_new.zip

Этот сертификат мы используем для подписи данных через КриптоПро .net под windows и там всё отрабатывает ок.

Проверили на Red Os 7.3.2 Муром, ubuntu 22.04.4 LTS, следующий код успешно отрабатывает. В чём ошибка пока не ясно...

Проверяли на данном самоподписанном серте - https://file.cryptopro.ru/f/9BhrnMU2UA2iZd6BfIhK8gtRl0RKSPy1/cert.pfx, пин - 1.

Зависимости в проекте

CryptoPro.Security.Cryptography
CryptoPro.Security.Cryptography.Xml
static void Main(string[] args)
{
    using (var store = new CpX509Store(StoreName.My, StoreLocation.CurrentUser))
    {
        store.Open(OpenFlags.ReadOnly);
        var cert = store.Certificates.Find(X509FindType.FindBySubjectName, "G2012256", false)[0];

        var rawXml2012_256 = "<SerializationContainer xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns=\"urn://x-artefacts-smev-gov-ru/services/message-exchange/types/1.2\"><SenderProvidedRequestData Id=\"SIGNED_BY_CONSUMER\"><MessageID>235a3810-dc58-11ee-b3e3-14539de46a6e</MessageID><MessagePrimaryContent xmlns=\"urn://x-artefacts-smev-gov-ru/services/message-exchange/types/basic/1.2\"><tns:OTSVEGRULRequest xmlns:tns=\"urn://x-artefacts-fns-otsvegrul/root/312-79/4.0.0\" ИдЗапрос=\"1dea7535-082d-4d4a-9a29-91e49047af20\"><tns:ЗапросЮЛ><tns:ОГРН>1027809237796</tns:ОГРН></tns:ЗапросЮЛ></tns:OTSVEGRULRequest></MessagePrimaryContent></SenderProvidedRequestData></SerializationContainer>";

        Program.SignXml(rawXml2012_256, "SIGNED_BY_CONSUMER", cert);
    }
}

public static XmlElement SignXml(string xml, string uri, CpX509Certificate2 cert)
{
    var data = new XmlDocument();
    data.LoadXml(xml);

    var signedXml = new CpSignedXml(data) { SigningKey = cert.PrivateKey };

    var reference = new CpReference
    {
        DigestMethod = CpSignedXml.XmlDsigGost3411_2012_256Url,
        Uri = "#" + uri
    };

    reference.AddTransform(new CpXmlDsigEnvelopedSignatureTransform());
    reference.AddTransform(new XmlDsigSmevTransform());
    reference.AddTransform(new CpXmlDsigExcC14NTransform());


    signedXml.SafeCanonicalizationMethods.Add("urn://smev-gov-ru/xmldsig/transform");
    signedXml.AddReference(reference);


    var keyInfo = new CpKeyInfo();
    keyInfo.AddClause(new CpKeyInfoX509Data(cert));
    signedXml.KeyInfo = keyInfo;

    signedXml.ComputeSignature();

    return signedXml.GetXml();
}

@Poisent сможете проверить на вашей машине на приложенном сертификате? csp обновили до актуальной версии?

CSP обновили до версии R3.
Проверим на вашем сертификате

Проверили. Ошибка сохраняется. Попробуем всё полностью переустановить.

Под .net 8 и Redos работает нормально, .net 6 отказывался

В обоих случаях используется версия 2024.2.29?

В обоих случаях используется версия 2024.2.29?

Да. Почему-то у нас только с 8 версией всё стало работать нормально

У себя, к сожалению, не получается на 6.0 воспроизвести.

Сможете собрать небольшой комплектный проект (csproj + cert + исходники), на котором у вас воспроизводится на 6.0? Сертификат можно использовать тот, который я прикреплял выше.

Сборку уже не получится сделать, но причину нашли
System.Security.Cryptography.Xml сборка была версии 6.0.1
После обновления до актуальной версии подпись начала работать