Как я могу выяснить неизвестную ошибку в цепи X509? - PullRequest
1 голос
/ 22 декабря 2009

У меня есть программа, которая вызывает веб-сервисы на сайтах клиентов, и поскольку веб-сервис предоставляется третьей стороной, для него требуется SSL, и я ничего не могу с этим поделать.

В большинстве случаев, когда возникает ошибка, это связано с наличием самозаверяющего сертификата, поэтому я проверяю X509Chain.ChainElements.ChainElementStatus на наличие ошибки UntrustedRoot и просто игнорирую ее.

Все нормально, однако я получаю сообщение об ошибке от нового клиента, и элемент ChainElementStatus просто выглядит как пустой массив. Есть мысли о том, что может вызвать это? Если я смотрю на ошибку сертификата в IE, он просто говорит, что сертификат не был выдан доверенным центром сертификации.

РЕДАКТИРОВАТЬ: добавив трассу, как предложил Маркус, я вижу следующую ошибку:

DateTime=2009-12-21T21:58:29.8719648Z

Информация о System.Net: 0: [0772] SecureChannel # 57280435 - Удаленный сертификат имеет ошибки: ProcessId = 4964 DateTime = 2009-12-21T21: 59: 15.3239262Z Информация System.Net: 0: [0772] SecureChannel # 57280435 - Внутренний ошибка цепочки сертификатов произошло.

ProcessId=4964
DateTime=2009-12-21T21:59:15.3239262Z

Информация о System.Net: 0: [0772] SecureChannel # 57280435 - Удаленный сертификат был признан недействительным Пользователь. ProcessId = 4964

1 Ответ

2 голосов
/ 22 декабря 2009

Вы пробовали добавить еще логи? Это избавило меня от пары связанных с этим ошибок в прошлом (однажды я потратил больше времени, чем помню, чтобы отладить проблему, связанную с сертификатом, только чтобы понять, что кто-то перенес время на время, когда мой сертификат больше не действителен) .

Мне удалось обнаружить проблему после прочтения Джеффа Сандерса отличного поста в блоге о процессе отладки ошибок, связанных с сертификатами. Он написан для клиентов asp.net, но одинаково хорошо работает и для обычных клиентов .net.

Суть его - добавление пары слушателей трассировки в ваш файл (App | Web) .Config. Вероятно, больше всего вас заинтересует трассировщик для System.Net и, возможно, System.Net.Sockets.

<configuration>
<system.diagnostics>
    <trace autoflush="true" />
    <sources>
        <source name="System.Net">
            <listeners><add name="System.Net"/></listeners>
        </source>
        <source name="System.Net.Sockets">
            <listeners><add name="System.Net"/></listeners>
        </source>
    </sources>
    <sharedListeners>
        <add
             name="System.Net"
             type="System.Diagnostics.TextWriterTraceListener"
             initializeData="System.Net.trace.log"
             traceOutputOptions = "ProcessId, DateTime"
         />
    </sharedListeners>
    <switches>
        <add name="System.Net" value="Verbose" />
        <add name="System.Net.Sockets" value="Verbose" />
    </switches>
</system.diagnostics>
</configuration>

Попробуйте, и если это не решит вашу проблему, у вас должно быть по крайней мере достаточно данных, чтобы обновить ваш вопрос, добавив больше информации.

...