private XadesSignedXml GetXadesSignedXml(XadesInfo xadesInfo, XmlDocument originalDoc) { var certificate = CertificateHelper.GetCertificateByThumbprint(TestIntegrationClientServer.CERTIFICATE_THUMBPRINT); Assert.IsNotNull(certificate); var provider = SigningKeyProvider.GetProvider(certificate); provider.SetCointainerPassword(TestIntegrationClientServer.PRIVATE_KEY_PASSWORD); var signatureid = String.Format("xmldsig-{0}", Guid.NewGuid().ToString().ToLower()); var xadesSignedXml = GisSignatureHelper.GetXadesSignedXml(provider, originalDoc, signatureid); var keyInfo = GisSignatureHelper.GetKeyInfo(xadesInfo.RawPK); xadesSignedXml.KeyInfo = keyInfo; var xadesObject = GisSignatureHelper.GetXadesObject(provider, xadesInfo, signatureid); var signTimeStr = xadesObject.QualifyingProperties.SignedProperties.SignedSignatureProperties.SigningTime.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz"); Console.WriteLine(signTimeStr); Assert.IsTrue(signTimeStr.Contains("+09")); xadesSignedXml.AddXadesObject(xadesObject, provider.DigestMethod); return(xadesSignedXml); }
/// <summary> /// Подписывает XML-документ c помощью XAdES-BES /// </summary> /// <param name="certificate">Сертификат, с помощью которого производится подпись</param> /// <param name="privateKeyPassword">Пароль от контейнера закрытого ключа используемого сертификата</param> public void ComputeSignature(X509Certificate2 certificate, string privateKeyPassword) { var signatureId = string.Format("xmldsig-{0}", Guid.NewGuid().ToString().ToLower()); SigningKey = CryptoProvider.GetAsymmetricAlgorithm(certificate, privateKeyPassword); Signature.Id = signatureId; SignatureValueId = string.Format("{0}-sigvalue", signatureId); var reference = CryptoProvider.GetReference(SignedElementId, signatureId); AddReference(reference); SignedInfo.CanonicalizationMethod = XmlDsigCanonicalizationUrl; SignedInfo.SignatureMethod = CryptoProvider.SignatureMethod; var xadesInfo = new XadesInfo(certificate); KeyInfo = KeyInfoHelper.Create(certificate); var xadesObject = CryptoProvider.GetXadesObject(xadesInfo, signatureId); AddXadesObject(xadesObject); ComputeSignature(); HashAlgorithm hashAlgorithm; GetSignedInfoHash(out hashAlgorithm); var formatter = CryptoProvider.GetSignatureFormatter(certificate); var signedHash = formatter.CreateSignature(hashAlgorithm.Hash); Signature.SignatureValue = signedHash; }
public void Run() { /* * 1. Получаем сертификат от клиента * 2. Формируем объект xades из сертификата от клиента * 3. Подписываем исходное сообщение * 4. Вычисляем хеш от SignedInfo и отправляем его для подписи клиенту * 5. Изменяем подписанное сообщение - подменяем подпись */ var originalDoc = new XmlDocument() { PreserveWhitespace = true }; originalDoc.LoadXml(_xmlStr); // 1. Получаем сертификат от клиента XadesInfo xadesInfo = GetClientXadesInfo(); // 2. Формируем объект xades из сертификата от клиента XadesSignedXml xadesSignedXml = GetXadesSignedXml(xadesInfo, originalDoc); // 3. Подписываем исходное сообщение серверным сертификатом xadesSignedXml.ComputeSignature(); // 4. Вычисляем хеш от SignedInfo и отправляем его для подписи клиенту HashAlgorithm hash; xadesSignedXml.GetSignedInfoHash(out hash); var signature = _client.GetSignedHash(Convert.ToBase64String(hash.Hash)); // 5. Изменяем подписанное сообщение - подменяем подпись xadesSignedXml.Signature.SignatureValue = Convert.FromBase64String(signature); GisSignatureHelper.InjectSignatureToOriginalDoc(xadesSignedXml, originalDoc); Console.WriteLine("Получившееся сообщение:"); Console.WriteLine(originalDoc.OuterXml); Assert.IsFalse(originalDoc.OuterXml.Contains("unstructuredName")); }
public XadesObject GetXadesObject(XadesInfo xadesInfo, string signatureId) { var xadesObject = new XadesObject { QualifyingProperties = new QualifyingProperties { Target = $"#{signatureId}", SignedProperties = new SignedProperties { Id = $"{signatureId}-signedprops" } } }; var hashAlgorithm = GetHashAlgorithm(); var hashValue = hashAlgorithm.ComputeHash(xadesInfo.RawCertData); var x509CertificateParser = new X509CertificateParser(); var bouncyCert = x509CertificateParser.ReadCertificate(xadesInfo.RawCertData); var cert = new Cert { IssuerSerial = new IssuerSerial { X509IssuerName = bouncyCert.IssuerDN.ToX509IssuerName(), X509SerialNumber = bouncyCert.SerialNumber.ToString() }, CertDigest = { DigestValue = hashValue, DigestMethod = new DigestMethod { Algorithm = DigestMethod } } }; var signedSignatureProperties = xadesObject.QualifyingProperties.SignedProperties.SignedSignatureProperties; signedSignatureProperties.SigningCertificate.CertCollection.Add(cert); signedSignatureProperties.SigningTime = xadesInfo.SigningDateTimeUtc.ToDateTimeOffset(xadesInfo.TimeZoneOffsetMinutes); return(xadesObject); }