Ошибка при отправке подписанного запроса
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 (приложив сформированный вами подписанный запрос и ответ на него).