WCF не может получить доступ к сертификатам хранилища сертификатов локального компьютера без повышения прав - PullRequest
0 голосов
/ 26 февраля 2020

У меня странная проблема. Мой сервисный сертификат хранится в localMachine / Personal.

И на него ссылаются как,

          <serviceCredentials>
            <serviceCertificate findValue="TestCertificate56" storeLocation="LocalMachine" storeName="My" x509FindType="FindByIssuerName" />
          </serviceCredentials>

Когда сертификат установлен, все работает нормально, без прав на повышение прав при запуске. После перезагрузки компьютера клиент неожиданно перестает подключаться, поскольку служба завершает сокет при подключении

System.ServiceModel.CommunicationException: The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '00:10:00'. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.ServiceModel.Channels.SocketConnection.ReadCore(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout, Boolean closing)
   --- End of inner exception stack trace ---

На стороне службы нет сообщения об ошибке. Если я запускаю сервис в повышенном режиме, это не проблема. Также, если я переустановлю сертификат, он будет работать до следующего перезапуска. Также, если используется хранилище CurrentUser, проблем нет.

Почему это проблема? Моя служба будет развернута и запущена как пользователь NetworkService, поэтому я считаю, что ей нужен ее сертификат в хранилище LocalMachine, а не в хранилище CurrentUser. У моей службы не будет прав администратора, поэтому проблема снова появится в рабочей среде

Редактировать: Я повторил проблему на двух разных компьютерах с VS 2017 и 2019

1 Ответ

0 голосов
/ 28 февраля 2020

Я также рекомендую использовать локальное хранилище компьютера вместо текущего пользовательского хранилища. Поскольку, когда пользователь, запускающий программу, изменяется, это может привести к тому, что сертификат не будет доступен для поиска. Кроме того, лучше настроить сертификаты через Thumbprint.

    <serviceCertificate storeLocation="LocalMachine" 
storeName="My" x509FindType="FindByThumbprint"
 findValue="974ad39ff0b86210f5e7d661e56945ad5c2d3770"/>

              </serviceCredentials>

В конце концов, я думаю, что источником проблемы может быть то, что доступ к publi c или закрытому ключу сертификата требует разрешений, и я предлагаю добавить учетную запись Everyone в группа закрытых ключей управления сертификатами.
enter image description here
Не стесняйтесь сообщить мне, если проблема все еще существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...