CryptoPro / libcore

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Ошибка при отправке подписанного запроса

Jenevra opened this issue · comments

Добрый день.

Используем данную библиотеку для подписания SOAP запросов.

У нас нет пока своего сертификата, поэтому генерируем сертификат по примеру из документации:

var certificateRequest = new CpCertificateRequest(
   "CN=MyName, OU=MyOrgUnit, C=US",
   new Gost3410CryptoServiceProvider(),
   CpHashAlgorithmName.GOST3411);

certificateRequest.CertificateExtensions.Add(
   new CpX509KeyUsageExtension(
       X509KeyUsageFlags.KeyCertSign 
       | X509KeyUsageFlags.DigitalSignature 
       | X509KeyUsageFlags.NonRepudiation 
       | X509KeyUsageFlags.KeyEncipherment,
       false));

var oidCollection = new OidCollection();
oidCollection.Add(new Oid("1.2.643.2.2.19"));

certificateRequest.CertificateExtensions.Add(
   new CpX509EnhancedKeyUsageExtension(
       oidCollection,
       true));

certificateRequest.CertificateExtensions.Add(
   new CpX509SubjectKeyIdentifierExtension(certificateRequest.PublicKey, false));

var cert = certificateRequest.CreateSelfSigned(
   DateTimeOffset.Now.AddDays(-45),
   (DateTimeOffset.Now.AddDays(45)));

byte[] file = cert.Export(X509ContentType.Pfx, new SecureString());

File.WriteAllBytes("34112001.pfx", file);

var certificate = new CpX509Certificate2(file);

Затем этот сертификат используем для подписи тела SOAP запроса. Все аналогично документации, но с некоторыми изменениями конкретно под наши нужды:

static XmlDocument SignXmlFile(
    XmlDocument xmlDocument,
    CpX509Certificate2 certificate,
    string digestMethod = CpSignedXml.XmlDsigGost3411UrlObsolete)
{
    var keyInfo = new CpKeyInfo();

    keyInfo.AddClause(new CpKeyInfoX509Data(certificate));

    var signedXml = new SignedSoapRequest(xmlDocument)
    {
        SigningKey = certificate.PrivateKey,
        KeyInfo = keyInfo,
        SignedInfo =
        {
            SignatureMethod = CpSignedXml.XmlDsigGost3410UrlObsolete,
            CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl
        }
    };

    
    // Добавляем ссылку на подписываемые данные
    ...

    // Вычисляем подпись.
    signedXml.ComputeSignature();

    // Добавляем подпись в XML
    ...

    return xmlDocument;
}

В итоге, когда запрос уходит в сторонний сервис, получаем ошибку:

java.security.InvalidKeyException: can't recognise key type in DSA based signer

Скажите, что делаем не так?

Заранее спасибо за помощь.

Добрый день.

По ошибке немного настораживает наличие "DSA" в ответе. Возможно стоит дополнительно посмотреть на сформированный вами запрос, и убедиться, что в него попали необходимые вам идентификаторы алгоритмов.

Если сформированный запрос выглядит корректно - данный вопрос лучше переадресовать оператору информационной системы, к который вы пытаетесь обратиться по soap (приложив сформированный вами подписанный запрос и ответ на него).

@Fasjeit спасибо за ваш ответ.
Разобрались, ошибка была на нашей стороне, на стороне библиотеки проблем нет.