«Нераспознанный раздел конфигурации» после добавления подписи в файл конфигурации с помощью SignedXml.ComputeSignature - PullRequest
4 голосов
/ 01 октября 2011

У меня есть приложение Windows Forms, созданное с использованием .NET 3.5 Framework, которое самостоятельно размещает службу WCF.Служба и приложение работают нормально самостоятельно.

Заботясь о том, чтобы информация об адресе и привязке была доступна в файле app.config, я решил добавить цифровую подпись, используя System.Security.Cryptography.Xml.SignedXml.ComputeSignature.Затем я добавил подпись в app.config и сохранил ее.Это создает элемент Signature в app.config как последний дочерний элемент узла конфигурации файла app.config.

Я добавил функцию для проверки подписи перед запуском службы.Приложение правильно проверяет подпись, но затем при попытке запустить службу выдает следующие вложенные ошибки:

  1. Инициализатор типа для System.ServiceModel.DiagnosticUtility выдает исключение.

2. Системе конфигурации не удалось инициализировать

3. Неопознанный раздел конфигурации Signature.

Кажется, не имеет значения, где я размещаю элемент Signature в app.config.Подпись всегда проверяется должным образом, и служба всегда бомбит о нераспознанном разделе конфигурации.Закомментировав элемент Signature в app.config и проверку подписи в коде, сервис запустится снова без проблем.

Почему сервис выдает эти ошибки, и что я могу сделать, чтобыразрешить их?

Вот файл app.config с отредактированными именами и URL-адресами приложений:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="MyApp.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>     
        <binding name="MyAppServicePortBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://myappurl/MyService" binding="basicHttpBinding" bindingConfiguration="MyAppServicePortBinding" contract="MyAppService" name="MyAppServicePort" />
    </client>
    <services>
      <service name="MyApp.MyService" behaviorConfiguration="MyAppServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://mylocalservice:8080/LocalService" />
          </baseAddresses>
        </host>
        <!-- this endpoint is exposed at the base address provided by host -->
        <endpoint address="" binding="wsHttpBinding" contract="MyApp.IServiceInit" bindingNamespace="http://mylocalservice:8080/LocalService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyAppServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
    <applicationSettings>
    <MyApp.My.MySettings>
      <setting name="DefaultEntryType" serializeAs="String">
        <value>M</value>
      </setting>
      <setting name="CardTypes" serializeAs="String">
        <value>1111</value>
      </setting>
      <setting name="Freq" serializeAs="String">
        <value>120000</value>
      </setting>
    </MyApp.My.MySettings>
  </applicationSettings>
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        <SignedInfo>
            <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
            <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
            <Reference URI="">
                <Transforms>
                    <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                </Transforms>
                <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                <DigestValue>jJYnz3j6LgxqdcUgvNSGNmJVum4=</DigestValue>
            </Reference>
        </SignedInfo>
        <SignatureValue>czpn/uA31kMSoGFk2hi3SCYky6YM6/MjBT3lpMn7wluCjeFIFj0vJJZVI9ueQQn/RglFi8RIfAyov3rDwiS+pP/4b1Yh8KqNOftHMH9pC+CFsMHMQnIoPHyXVrFLpuU6rzjACdUky4zuB7I7Q5AHf1CF8F9PSEgIxiQ4gHgPhJCLujl6wvsMg3rXDHazRQ2Curj94iKUIsKo50X1dJxER1oWOB9g6QgzqsXTOmUkgGOygJrnrn1WQJ0UbWAvHHXIPZdD6jOL24vqhOYm55+b6hlkWdIvEvLBPVMtv2V8oQqxBpWRDh8ovMn4LQdgcFOpa/vG3ISXGp2oRzsCEpaxCQ==</SignatureValue>
    </Signature>
</configuration>

1 Ответ

5 голосов
/ 02 октября 2011

Вам не хватает важной информации, позволяющей встроить подписи в app.config.

С http://www.beefycode.com/post/Managing-AppConfig-Integrity-using-Xml-Digital-Signatures.aspx о добавлении подписей в файлы app.config:

Мы не можем просто добавить этот новый элемент в app.config и ожидать, что менеджер конфигурации .NET обработает его, не зная, что это такое; это приведет к сбою во время запуска приложения. Никаких особых хитростей здесь нет, нам просто нужно дать указание системе конфигурации игнорировать этот элемент, добавив следующую строку в начало файла конфигурации.

Начните с ввода следующего в app.config:

<configSections>
  ...
  <section name="Signature" type="System.Configuration.IgnoreSectionHandler" />  
</configSections>  

Просмотрите приведенную выше ссылку для полного app.config и примера использования. Это должно сделать работу.

...