На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> сервис не находит сертификат , тренишен
    хеллоу олл.
    пытаюсь организовать безопасность на транспортном уровне эксплуатируя сертификаты.
    пока организовываю сервис.

    действую по следующему алгоритму:
    1. Создал сертификат ServiceCertificate c помощью makecert
    2. Импортировал его в хранилище "Доверенные корневые центры сертификации"
    3. Файл конфигурации службы (поведение и привязка):

    ExpandedWrap disabled
      <behaviors>
        <serviceBehaviors>
          <behavior name="MyBehavior">
            <serviceMetadata httpGetEnabled="true"/>
            <serviceCredentials>
              <serviceCertificate findValue="ServiceCertificate"
                                  x509FindType="FindBySubjectName"/>
              <clientCertificate>
                <authentication certificateValidationMode="PeerTrust"/>
              </clientCertificate>
            </serviceCredentials>
          </behavior>
        </serviceBehaviors>
      </behaviors>
      <bindings>
        <netTcpBinding>
          <binding name ="MyBinding">
            <security mode="Transport">
              <transport clientCredentialType="Certificate"/>
              <message clientCredentialType="None"/>
            </security>
          </binding>
        </netTcpBinding>
      </bindings>


    Однако по факту получаю мессагу:

    Не удается найти сертификат X.509 с помощью следующих условий поиск.

    Полагаю что я напортачил с сертификатом, а конкретнее - с его размещением. Однако в чем затык - догнать не могу. Опыта с этим делом не имел. Ориентировался на msdn и на труд "Основы WCF NET 3.5". Подсобите кто чем может.
    Сообщение отредактировано: mrbrooks -
      Сам точно не знаю, тоже только что узна про WCF :)

      Но вот тут написано, что "Клиентский сертификат, о котором говорилось выше, должен быть проинсталлирован в хранилище сертификатов локальной машины".

      Может поможет...

      Добавлено
      Еще может вот это поможет: How to call a Web service by using a client certificate for authentication in an ASP.NET Web application
        Цитата Felan @
        Сам точно не знаю, тоже только что узна про WCF

        ы.

        Цитата Felan @
        Клиентский сертификат, о котором говорилось выше, должен быть проинсталлирован в хранилище сертификатов локальной машины

        так и было сделано 8-)

        вообще все это дело попахивает полтергеем и черной магией. селезенкой чую - где то - что то - не досмотрел.
          Цитата mrbrooks @
          <serviceCertificate findValue="ServiceCertificate" x509FindType="FindBySubjectName"/>

          WCF по-умолчанию ищет в Personal Certificates локальной машины - где сертификат и должен быть. Можешь указать также storeLocation="LocalMachine" и storeName="My"
          Если же твой сертификат действительно корневой, по-хорошему ты должен создать от него дочерний и положить в Personal Certificates. Если ты просто хотел, чтобы оно не ругалось на самоподписанный серт, можно или добавить твой в два хранилища или переключить storeLocation и storeName или отключить проверку центра сертификации.
            Цитата mrbrooks @
            ы.

            Это я не к тому, что от тебя первый раз услышал, а к тому, что тоже разбираюсь сейчас с подобными вещами...
              spicard я делал и так:
              ExpandedWrap disabled
                <behaviors>
                 <serviceBehaviors>
                  <behavior name="MyBehavior">
                    <serviceMetadata httpGetEnabled="true"/>
                    <serviceCredentials>
                     <serviceCertificate findValue="ServiceCertificate"
                                    storeLocation="LocalMachine"
                                    storeName="My"
                                    x509FindType="FindBySubjectName"/>
                     <clientCertificate>
                       <authentication certificateValidationMode="PeerTrust"/>
                     </clientCertificate>
                    </serviceCredentials>
                  </behavior>
                 </serviceBehaviors>
                </behaviors>
                <bindings>
                 <netTcpBinding>
                  <binding name ="MyBinding">
                    <security mode="Transport">
                     <transport clientCredentialType="Certificate"/>
                     <message clientCredentialType="None"/>
                    </security>
                  </binding>
                 </netTcpBinding>
                </bindings>


              все одно не находит.


              Цитата spicard @
              Если же твой сертификат действительно корневой, по-хорошему ты должен создать от него дочерний и положить в Personal Certificates.

              это про самозаверяющий сертификат корневого центра и сертификат, подписанный сертификатом корневого центра? (терминология ms) если да - то комплитед.


              Цитата spicard @
              Если же твой сертификат действительно корневой, по-хорошему ты должен создать от него дочерний и положить в Personal Certificates

              Вот отсюда поподробнее. Я импортировал сертификаты через тузлу Сертификаты. По поводу Personal Certificates ничего похожего не нашел. Имеется ввиду Сертификаты текущего пользователя?


              Цитата Felan @
              Это я не к тому, что от тебя первый раз услышал, а к тому, что тоже разбираюсь сейчас с подобными вещами...

              дык я так и понял, что вместе грызем гранит wcf :victory:
                выполни win+r certmgr.msc

                Там увидишь дерево хранилища. Видимо имеется ввиду папочка Personal... при установке сертификата надо выбрать "выбор места в ручную" и т.д...
                  Цитата mrbrooks @
                  это про самозаверяющий сертификат корневого центра и сертификат, подписанный сертификатом корневого центра? (терминология ms) если да - то комплитед.

                  похоже на то, ок

                  Цитата mrbrooks @
                  Вот отсюда поподробнее. Я импортировал сертификаты через тузлу Сертификаты. По поводу Personal Certificates ничего похожего не нашел. Имеется ввиду Сертификаты текущего пользователя?

                  Юзай Microsoft Management Console (Пуск -> Выполнить -> mmc) и найди там Certificates(Local Computer)\Personal\Certificates. "Сертификаты текущего пользователя" не то, но рядом.
                  Кроме того, если у тебя в операционке включены ACL, то тебе необходимо будет раздать права на чтение сертификата. Если сервис хостится IIS`ом и настройки пула стоят по-умолчанию, то до IIS 7.5 система лезет туда как NETWORK SERVICE.
                    Цитата spicard @
                    Юзай Microsoft Management Console (Пуск -> Выполнить -> mmc) и найди там Certificates(Local Computer)\Personal\Certificates. "Сертификаты текущего пользователя" не то, но рядом.

                    а все понял. да так и делал. маздай то русский. папка Личные (а я пихал в "Доверенные корневые центры сертификации"). Туда сертификат и добавил. Лол. Лед тронулся. Теперь правда ругается так:
                    Цитата

                    Сертификат "CN=ServiceCertificate" должен иметь закрытый ключ, поддерживающий обмен ключами. Процесс должен иметь права доступа к этому закрытому ключу

                    Но главное процесс пошел!!!

                    Цитата spicard @
                    Если сервис хостится IIS`ом и настройки пула стоят по-умолчанию, то до IIS 7.5 система лезет туда как NETWORK SERVICE.

                    не. служба у меня по верх tcp
                    Цитата Felan @
                    выполни win+r certmgr.msc

                    через mmc то же самое.
                      Цитата mrbrooks @
                      Сертификат "CN=ServiceCertificate" должен иметь закрытый ключ, поддерживающий обмен ключами. Процесс должен иметь права доступа к этому закрытому ключу

                      Ок, открой свой сертификат и скажи видишь ли ты внизу на первой вкладке надпись "You have a private key that corresponds to this certificate" (на русском не процитирую)? Если она есть, то или сервис требует, чтобы при импорте сертификата закрытый ключ был помечен как экспортируемый (никак не могу вспомнить зачем) или у процесса нет прав на его чтение.
                      Цитата mrbrooks @

                      Цитата spicard @
                      Если сервис хостится IIS`ом и настройки пула стоят по-умолчанию, то до IIS 7.5 система лезет туда как NETWORK SERVICE.

                      не. служба у меня по верх tcp

                      Одно другому не мешает... А кто тогда хостит сервис? Windows Service или десктопное приложение? На какой операционке?
                      Сообщение отредактировано: spicard -
                        Цитата spicard @
                        Ок, открой свой сертификат и скажи видишь ли ты внизу на первой вкладке надпись "You have a private key that corresponds to this certificate" (на русском не процитирую)?

                        есть такое


                        Цитата spicard @
                        Если она есть, то или сервис требует, чтобы при импорте сертификата закрытый ключ был помечен как экспортируемый (никак не могу вспомнить зачем) или у процесса нет прав на его чтение.

                        я правильно понимаю что это борется через winhttpcertcfg?


                        Цитата spicard @
                        А кто тогда хостит сервис? Windows Service или десктопное приложение? На какой операционке?

                        авторазмещение. winxp. я пока тренируюсь. в перспективе WinServer 2003.
                          Цитата mrbrooks @
                          я правильно понимаю что это борется через winhttpcertcfg?

                          Да, но я делал руками в mmc. В случае с галочкой экспорта - проще удалить сертификат из хранилища и импортировать заново.
                          Цитата mrbrooks @
                          авторазмещение. winxp. я пока тренируюсь. в перспективе WinServer 2003.

                          В WinXP если ACL выключен настройка прав доступа не требуется.
                            Цитата spicard @
                            Да, но я делал руками в mmc. В случае с галочкой экспорта - проще удалить сертификат из хранилища и импортировать заново.

                            сделал. как говорится воз и нынче там :scratch: на самом деле не понимаю почему ошибка - сертификат сконфигурирован с ключем -pe. по мануалом все должно быть чики-пуки

                            Цитата spicard @
                            В WinXP если ACL выключен настройка прав доступа не требуется.

                            если ACL включена то в свойствах файла появляется вкладка Безопасность?
                              Цитата mrbrooks @
                              если ACL включена то в свойствах файла появляется вкладка Безопасность?

                              Да.
                              Цитата mrbrooks @
                              сделал. как говорится воз и нынче там на самом деле не понимаю почему ошибка - сертификат сконфигурирован с ключем -pe. по мануалом все должно быть чики-пуки

                              Еще одна версия - сертификат должен быть импортирован в хранилище без пароля.
                                Цитата spicard @
                                Еще одна версия - сертификат должен быть импортирован в хранилище без пароля.

                                так точно. ситуация не переменилась.

                                причем я пытался пофиксить тему с ключем при помощи:
                                1. FindPrivateKey + cacls.key - не помогло
                                2. WinHttpCertCfg - не помогло

                                :wall:
                                  В таком случае ошибка была допущена или при создании сертификата или в процессе настройки. Я могу вечером собрать на XP`шке пример и описать свои шаги.
                                    Цитата spicard @
                                    В таком случае ошибка была допущена или при создании сертификата

                                    наверно так и есть.
                                    делал так:
                                    самозаверяющий сертификат корневого центра:
                                    Цитата
                                    makecert.exe -n "CN=BaseCert" -r -sv BaseCert.pvk BaseCert.cer

                                    сертификат, подписанный сертификатом корневого центра:
                                    Цитата
                                    makecert.exe -sk ChildCert -iv BaseCert.pvk -pe -n "CN=ChildCert" -ic BaseCert.cer ChildCert.cer -sr localmachine -ss my



                                    Цитата spicard @
                                    Я могу вечером собрать на XP`шке пример и описать свои шаги.

                                    был бы очень признателен.
                                      В сертификате прописывается адрес для которого он выдан... У тебя правильный адрес там прописан?
                                        Цитата Felan @
                                        В сертификате прописывается адрес для которого он выдан... У тебя правильный адрес там прописан?

                                        эм. не могли бы вы уточнить о каком адресе идет речь? об transport://ip:port/nameservice?
                                          Ну вот поклясться не могу, но по идее об адресе, который находится в Issued To.

                                          Цитата mrbrooks @
                                          transport://ip:port/nameservice?

                                          У меня там просто домен. Ну точнее доменное имя.

                                          По крайней мере у меня там прописан адрес, на который идет соединение, и сертификат нашелся при таком конфиге:

                                          ExpandedWrap disabled
                                                        <endpointBehaviors>
                                                            <behavior name="clientEndpointCredential">
                                                                <clientCredentials>
                                                                    <clientCertificate storeName="My" storeLocation="CurrentUser" x509FindType="FindBySubjectName" findValue="blah-blah..." />
                                            <!--                        <serviceCertificate>-->
                                            <!--                            <authentication certificateValidationMode="ChainTrust" revocationMode="NoCheck"/>-->
                                            <!--                        </serviceCertificate>-->
                                                                </clientCredentials>
                                                            </behavior>
                                                        </endpointBehaviors>


                                          У меня хуже :)

                                          Сервис который мне нужен по хттпс требует авторизацию согласно OASIS... никак не могу скормить ему правильную конфигурацию... :(
                                          Сообщение отредактировано: Felan -
                                            Felan я так понимаю вы показали конфигурационный файл клиента?
                                              Да.
                                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                              0 пользователей:


                                              Рейтинг@Mail.ru
                                              [ Script execution time: 0,0505 ]   [ 16 queries used ]   [ Generated: 2.05.24, 19:43 GMT ]