Проверка подписи XML в Powershell с сертификатом PEM

Я пытаюсь создать сценарий powershell, который будет использовать данные в XML-документе. Однако перед выполнением какой-либо работы мне нужно убедиться, что XML не был подделан, проверив подпись.

У меня есть копия открытого ключа для сертификата, используемого для подписи XML в формате PEM, но я не могу понять, как заставить powershell использовать этот сертификат.

Закрытие, которое я пришел к тому, чтобы заставить это работать, - это следующий код...

$Path = "data.xml"
$Xmldata = new-object Xml.XmlDocument
$Xmldata.PreserveWhitespace = $true
$Xmldata.Load($Path)

add-type -AssemblyName system.security
$SignedXml = New-Object System.Security.Cryptography.Xml.SignedXml -ArgumentList $Xmldata

$XmlNodeList = $Xmldata.EntitiesDescriptor.Signature

$XmlNodeList

$SignedXml.LoadXml($XmlNodeList)

$CertPath = "cert.pem"
$Check = $SignedXml.CheckSignature($CertPath, $true)

Однако, когда это запускается, я получаю следующее исключение...

Исключение, вызывающее «CheckSignature» с «2» аргументами: «SignatureDescription не может быть создан для предоставленного алгоритма подписи». В строке: 34 символа: 1 + $Check = $SignedXml.CheckSignature($CertPath, $true) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : CryptographicException

Любая помощь будет оценена по достоинству. Спасибо!


person pkeenan    schedule 10.06.2015    source источник
comment
Для дополнительной информации XML подписан с использованием RSA-SHA256. ‹Алгоритм ds:SignatureMethod=w3.org/2001/04/xmldsig -more#rsa-sha256  -  person pkeenan    schedule 10.06.2015


Ответы (1)


После некоторых интенсивных дополнительных поисков я обнаружил, что SignedXML не поддерживает http://www.w3.org/2001/04/xmldsig-more#rsa-sha256, который нужно было добавлять вручную. Мне пришлось добавить следующий код перед созданием объекта signedXML...

Add-Type @'
        public class RSAPKCS1SHA256SignatureDescription : System.Security.Cryptography.SignatureDescription
            {
                public RSAPKCS1SHA256SignatureDescription()
                {
                    base.KeyAlgorithm = "System.Security.Cryptography.RSACryptoServiceProvider";
                    base.DigestAlgorithm = "System.Security.Cryptography.SHA256Managed";
                    base.FormatterAlgorithm = "System.Security.Cryptography.RSAPKCS1SignatureFormatter";
                    base.DeformatterAlgorithm = "System.Security.Cryptography.RSAPKCS1SignatureDeformatter";
                }

                public override System.Security.Cryptography.AsymmetricSignatureDeformatter CreateDeformatter(System.Security.Cryptography.AsymmetricAlgorithm key)
                {
                    System.Security.Cryptography.AsymmetricSignatureDeformatter asymmetricSignatureDeformatter = (System.Security.Cryptography.AsymmetricSignatureDeformatter)
                        System.Security.Cryptography.CryptoConfig.CreateFromName(base.DeformatterAlgorithm);
                    asymmetricSignatureDeformatter.SetKey(key);
                    asymmetricSignatureDeformatter.SetHashAlgorithm("SHA256");
                    return asymmetricSignatureDeformatter;
                }
            }
'@
    $RSAPKCS1SHA256SignatureDescription = New-Object RSAPKCS1SHA256SignatureDescription
    [System.Security.Cryptography.CryptoConfig]::AddAlgorithm($RSAPKCS1SHA256SignatureDescription.GetType(), "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256")

Это решение было адаптировано из примера C# той же проблемы, найденной по адресу http://geekswithblogs.net/mkoerner/archive/2013/07/12/saml2-federationmetadata-validation.aspx.

person pkeenan    schedule 10.06.2015