Создание XAdES из USB-токена в c#

Я пытаюсь подписать файлы XML через USB-токен в формате XAdES-T (или, по крайней мере, XAdES-BES). Мне удалось подписать его с помощью CAdES-BES с библиотекой BouncyCastle.Crypto.

Это XML-вывод XAdES, который мне нужен.

      <?xml version='1.0' encoding='utf-8'?>

<MyRootTag xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <MainElement>
        <!--xml_payload_goes_here-->
    </MainElement>
    
    <ds:Signature xmlns:xadesv1410="http://uri.etsi.org/01903/v1.4.1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Id="signature-5743-9455-8953-3682">
    
        <ds:SignedInfo>
            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
            <ds:Reference URI="">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/2002/06/xmldsig-filter2">
                        <dsig-xpath:XPath xmlns:dsig-xpath="http://www.w3.org/2002/06/xmldsig-filter2" Filter="subtract">/descendant::ds:Signature</dsig-xpath:XPath>
                    </ds:Transform>
                    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                <ds:DigestValue><!--Base64--></ds:DigestValue>
            </ds:Reference>
            <ds:Reference URI="#signed-properties-0967-6800-5986-4853" Type="http://uri.etsi.org/01903#SignedProperties">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                <ds:DigestValue><!--Base64--></ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        
        <ds:SignatureValue Id="signature-value-3400-3038-9836-4335"><!--Base64--></ds:SignatureValue>
        
        <ds:KeyInfo Id="key-info-3540-2157-4472-8413">
            <ds:X509Data>
                <ds:X509Certificate><!--Base64--></ds:X509Certificate>
            </ds:X509Data>
            <ds:KeyValue>
                <ds:RSAKeyValue>
                    <ds:Modulus><!--Base64--></ds:Modulus>
                    <ds:Exponent>AQAB</ds:Exponent>
                </ds:RSAKeyValue>
            </ds:KeyValue>
        </ds:KeyInfo>
        
        <ds:Object Id="signature-object-0000-0000-0000-0000">
            <xades:QualifyingProperties Target="#signature-0000-0000-0000-0000">
                <xades:SignedProperties Id="signed-properties-0000-0000-0000-0000">
                    <xades:SignedSignatureProperties>
                        <xades:SigningTime>2021-11-03T08:25:08Z</xades:SigningTime>
                        <xades:SigningCertificate>
                            <xades:Cert>
                                <xades:CertDigest>
                                    <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                                    <ds:DigestValue><!--Base64--></ds:DigestValue>
                                </xades:CertDigest>
                                <xades:IssuerSerial>
                                    <ds:X509IssuerName>Issuer_Name</ds:X509IssuerName>
                                    <ds:X509SerialNumber>000000000000000000000000000000000000000</ds:X509SerialNumber>
                                </xades:IssuerSerial>
                            </xades:Cert>
                        </xades:SigningCertificate>
                    </xades:SignedSignatureProperties>
                </xades:SignedProperties>
            </xades:QualifyingProperties>
        </ds:Object>
        
    </ds:Signature>
    
</MyRootTag>

Будет ли BouncyCastle.Crypto или System.Security.Cryptography иметь встроенную функцию для обертывания информации подписи в формате XML, указанном выше? Или мне нужно получить подпись, дайджест, информацию о сертификате и самому управлять форматированием XML?

В любом случае, где я могу найти примеры кода C # для подписи XAdES + форматирования?

1 ответ

Для этого лучше использовать пакет NuGet. здесь есть хорошее FirmaXadesNetCore . если вы попытаетесь реализовать это самостоятельно, у вас будет очень трудный путь, потому что в XAdES много деталей. кстати, единственная проблема, с которой вы столкнетесь с FirmaXadesNetCore, заключается в том, что он просто реализует подпись с хранилищем сертификатов Windows, и вам нужно клонировать его и реализовать класс Signer с PKCS # 11. это легко, потому что для этого также есть хороший пакет NuGet. вы можете найти его здесь Pkcs11Interop.

Другие вопросы по тегам