Когда хочу создать запрос Power Query — выдает следующую ошибку: |
|
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
|
Ranker Dark Пользователь Сообщений: 99 |
#3 25.09.2020 23:09:07
? И к чему это? |
||
vikttur Пользователь Сообщений: 47199 |
К тому, что правила форумов нужно читать и самостоятельно показывать ссылки |
Юрий М Модератор Сообщений: 60383 Контакты см. в профиле |
#5 25.09.2020 23:11:31
Это к тому, что Вы сами должны информировать прямыми ссылками, где ещё разместили свой вопрос. |
||
JeyCi Пользователь Сообщений: 3351 |
#6 12.06.2021 14:59:15
Power Query — Could not create SSL/TLS secure channel — не знаю, поможет ли… на сайты с протоколом TLS1.2 пропускает… Изменено: JeyCi — 13.06.2021 20:35:31 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||
JeyCi Пользователь Сообщений: 3351 |
How to enable TLS 1.3 support in Firefox and Chrome
— прошлась по линкам — проверила на всякий случай MyClient — клиент от chrome то нормальный (поддерживает и TLS1.2 и TLS1.3), но Office 2016 не берёт данные с сайта шифрующегося по протоколу TLS1.3 P.S, по скрину с msdn у меня в regedit должен быть TLS 1.0 client , а у меня там только SSL 2.0 Client … хотя, как уже отметила выше — сайт грузится в chrome и даже ie, но в PQ не берётся… Изменено: vikttur — 13.06.2021 22:45:36 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
JeyCi Пользователь Сообщений: 3351 |
#8 13.06.2021 22:26:13
т.е здесь должен быть
???
manual создание их не даёт результата Изменено: vikttur — 13.06.2021 22:44:32 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||||||
JeyCi Пользователь Сообщений: 3351 |
#9 14.06.2021 07:29:52
важно, чтобы user-agent пропускал на сайт с протоколом TLS 1.3 … — нормальный агент нормально берёт TLS 1.3 (посмотрела в Fiddler и по линку из #7) Изменено: JeyCi — 14.06.2021 07:38:19 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||||
JeyCi Пользователь Сообщений: 3351 |
#10 14.06.2021 21:08:19
ууууупс — всё самое значимое всегда пишут мелким шрифтом…
— json в Power Apps (Dataflows) Изменено: JeyCi — 14.06.2021 21:11:44 чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок — обратитесь к собеседнику на ВЫ — ответ на ваш вопрос получите — а остальное вас не касается (п.п.п. на форумах) |
||||
Поизучали возможность обновления этих пакетов
Но, похоже, тут только возможность упорядочивания их, но новый пакет в ОС добавить вручную нельзя.
вроде бы неудача.
но, в форумах часто проскальзывает что «хром работает, а .NET Framework приложения — нет». Причина в том, что баузер хром использует свои пакеты шифрования а не полагается ОС.
Мы зацепились за эту идею.
В одном из проектов мы использовали компонент — внедренный браузер на Chromium
пакет в Nuget: CefSharp.Winforms, CefSharp.Common.
Попробовали загрузить страницу через этот механизм — работает!
Решения
то есть у вас есть 2 варианта решения
1. переход на свежий Windows Server 2016
2. использование пакета CefSharp но предупреждаю, он увеличивает размер приложения (в нашем случае на 100+ МБ)
Если нужны будут детальные инструкции по CefSharp -напишите в комментах: сделаю отдельную статью.
Источник
Запрос был прерван: не удалось создать безопасный канал SSL/TLS
Мы не можем подключиться к серверу HTTPS с помощью WebRequest из-за этого сообщения об ошибке:
The request was aborted: Could not create SSL/TLS secure channel.
Мы знаем, что сервер не имеет действительного сертификата HTTPS с указанным путем, но чтобы обойти эту проблему, мы используем следующий код, который мы взяли из другого сообщения StackOverflow:
Проблема в том, что сервер никогда не проверяет сертификат и не выполняет вышеуказанную ошибку. Кто-нибудь знает, что мне делать?
Я должен упомянуть, что несколько лет назад мы с коллегой проводили тесты, и он отлично работал с чем-то похожим на то, что я написал выше. Единственное “основное отличие”, которое мы обнаружили, это то, что я использую Windows 7, и он использовал Windows XP. Это что-то меняет?
Я, наконец, нашел ответ (я не заметил свой источник, но это был поиск);
Хотя код работает в Windows XP, в Windows 7, вы должны добавить это в начале:
И теперь он работает отлично.
ДОПОЛНЕНИЕ
Как упоминал Робин Франс; если вы получаете эту проблему при настройке PayPal, обратите внимание, что они не будут поддерживать SSL3, начиная с 3 декабря 2018 года. Вам нужно будет использовать TLS. Здесь страница Paypal об этом.
Решение этого в.NET 4.5 является
Если у вас нет.NET 4.5, используйте
Убедитесь, что настройки ServicePointManager заданы до создания HttpWebRequest, иначе он не будет работать.
Проблема, с которой вы сталкиваетесь, заключается в том, что пользователь aspNet не имеет доступа к сертификату. Вы должны предоставить доступ, используя winhttpcertcfg.exe
На шаге 2 в дополнительной информации
EDIT: в более поздних версиях IIS эта функция встроена в инструмент диспетчера сертификатов – и к ней можно получить доступ, щелкнув правой кнопкой мыши по сертификату и используя опцию для управления секретными ключами. Подробнее здесь: https://serverfault.com/questions/131046/how-to-grant-iis-7-5-access-to-a-certificate-in-certificate-store/132791#132791
Ошибка является общей и существует много причин, по которым переговоры SSL/TLS могут завершиться неудачей. Наиболее распространенным является недействительный или устаревший сертификат сервера, и вы позаботились об этом, предоставив свой собственный сертификат проверки подлинности сертификата сервера, но это не обязательно единственная причина. Сервер может требовать взаимной аутентификации, он может быть настроен с наборами шифров, не поддерживаемых вашим клиентом, у него может быть слишком большой дрейф времени, чтобы рукопожатие преуспело и еще много причин.
Лучшим решением является использование набора инструментов устранения неполадок SChannel. SChannel – поставщик SSPI, ответственный за SSL и TLS, и ваш клиент будет использовать его для рукопожатия. Посмотрите TLS/SSL-инструменты и настройки.
У меня была эта проблема с попыткой нажать https://ct.mob0.com/Styles/Fun.png, который представляет собой изображение, распространяемое CloudFlare на нем CDN, которое поддерживает сумасшедшие вещи, такие как SPDY и странные перенаправления сертификатов SSL.
Вместо того, чтобы указывать Ssl3, как в ответе Саймонса, я смог исправить его, перейдя к Tls12 следующим образом:
После долгих часов с этой же проблемой я обнаружил, что учетная запись ASP.NET, на которой работает клиентская служба, не имела доступа к сертификату. Я исправил его, перейдя в пул приложений IIS, с которым работает веб-приложение, перейдя в “Дополнительные настройки” и изменив идентификатор на LocalSystem с NetworkService .
Лучшим решением является получение сертификата, работающего с учетной записью по умолчанию NetworkService , но это работает для быстрого функционального тестирования.
Что-то, чего не было в первоначальном ответе. Я добавил еще один код, чтобы сделать его пуленепробиваемым.
Другая возможность – это неправильный импорт сертификата в поле. Обязательно установите флажок в окружении. Первоначально я этого не делал, поэтому код либо выходил из строя, либо выдавал такое же исключение, что и закрытый ключ.
“Запрос был прерван: не удалось создать безопасный канал SSL/TLS”. Исключение может возникнуть, если сервер возвращает ответ HTTP Неавторизованный запрос HTTP.
Вы можете определить, происходит ли это, включив ведение журнала System.Net на уровне трассировки для вашего клиентского приложения, как описано в этом ответе.
Как только эта конфигурация регистрации будет на месте, запустите приложение и воспроизведите ошибку, а затем посмотрите в выводе журнала для такой строки:
В моей ситуации я не смог установить конкретный файл cookie, ожидаемый сервером, что привело к тому, что сервер ответил на запрос с ошибкой 401, что в свою очередь привело к созданию “Не удалось создать безопасный канал SSL/TLS”, исключение.
Корень этого исключения в моем случае состоял в том, что в какой-то момент кода вызывалось следующее:
Это действительно плохо. Он не только инструктирует .NET использовать небезопасный протокол, но это влияет на каждый новый запрос WebClient (и аналогичный), сделанный впоследствии в вашем приложении. (Обратите внимание, что входящие веб-запросы не затрагиваются в вашем приложении ASP.NET, но новые запросы WebClient, например, для общения с внешней веб-службой).
В моем случае это было фактически не нужно, поэтому я мог просто удалить инструкцию, и все мои другие веб-запросы снова начали работать отлично. Основываясь на моем чтении в другом месте, я узнал несколько вещей:
- Это глобальная настройка в вашем приложении, и если у вас есть одновременная деятельность, вы не можете надежно установить ее на одно значение, выполнить свое действие и затем установить его обратно. Другое действие может иметь место во время этого маленького окна и быть затронутым.
- Правильная настройка – оставить ее по умолчанию. Это позволяет .NET продолжать использовать все, что является самым безопасным значением по умолчанию, с течением времени и обновлять фреймворки. Установка его в TLS12 (который является самым безопасным на момент написания этой статьи) будет работать сейчас, но через 5 лет может возникнуть таинственные проблемы.
- Если вам действительно нужно установить значение, вы должны подумать об этом в отдельном специализированном приложении или приложении домена и найти способ поговорить между ним и вашим основным пулом. Поскольку это единственное глобальное значение, попытка управлять им в пределах загруженного пула приложений приведет только к неприятностям. Этот ответ: qaru.site/questions/45920/… предоставляет возможное решение с помощью специального прокси. (Примечание. Я лично не реализовал его.)
Как вы можете сказать, есть много причин, которые могут произойти. Думаю, я бы добавил причину, с которой я столкнулся…
Если вы установите значение WebRequest.Timeout на 0 , это будет исключение. Ниже приведен код, который у меня был… (За исключением жестко закодированного 0 для значения таймаута у меня был параметр, который был непреднамеренно установлен на 0 ).
Этот работает для меня в веб-клиенте MVC
Другая возможная причина The request was aborted: Could not create SSL/TLS secure channel ошибку The request was aborted: Could not create SSL/TLS secure channel – это несоответствие между вашими значениями cipher_suites вашего клиентского ПК и значениями, которые сервер настроил как желающий и способный принять. В этом случае, когда ваш клиент отправляет список значений cipher_suites, которые он может принять в своем первоначальном сообщении об установлении связи/согласовании SSL “Клиент Hello”, сервер видит, что ни одно из предоставленных значений не является приемлемым и может возвращать “Предупреждение” “вместо того, чтобы перейти к шагу” Приветствие Сервера “SSL-квитирования.
Чтобы изучить эту возможность, вы можете загрузить Microsoft Message Analyzer и использовать его для запуска трассировки в согласовании SSL, возникающего при попытке установить HTTPS-соединение с сервером (в вашем приложении С#).
Если вы можете сделать успешное соединение HTTPS из другой среды (например, упомянутой вами машины Windows XP, или, возможно, нажав URL-адрес HTTPS в браузере, отличном от Microsoft, который не использует настройки набора шифров ОС, например Chrome или Firefox), запустите еще одну трассировку анализатора сообщений в этой среде, чтобы зафиксировать, что происходит, когда переговоры по SSL успешно завершены.
Надеемся, вы увидите некоторую разницу между двумя сообщениями Hello Hello, которые позволят вам точно определить, что из-за неудачного согласования SSL приводит к сбою. Затем вы сможете внести изменения в конфигурацию Windows, что позволит ей добиться успеха. IISCrypto – отличный инструмент для этого (даже для клиентских компьютеров, несмотря на имя “IIS”).
Следующие два ключа реестра Windows управляют значениями cipher_suites, которые ваш компьютер будет использовать:
Здесь полная запись того, как я исследовал и решил экземпляр этого многообразия. Could not create SSL/TLS secure channel проблему Could not create SSL/TLS secure channel : http://blog.jonschneider.com/2016/08/fix-ssl-handshaking-error-in -windows.html
У меня была эта проблема, потому что у моего web.config было:
Я боролся с этой проблемой весь день.
Когда я создал новый проект с .NET 4.5, я, наконец, получил его для работы.
Но если я понизил до 4.0, я снова получил ту же проблему, и это было необратимо для этого проекта (даже когда я снова попытался обновить до 4.5).
Странное другое сообщение об ошибке, но “Запрос был прерван: не удалось создать безопасный канал SSL/TLS”. придумал эту ошибку
В случае, если клиент является машиной Windows, возможной причиной может быть то, что протокол tls или ssl, требуемый службой, не активирован.
Это можно установить в:
Панель управления → Сеть и Интернет → Свойства обозревателя → Дополнительно
Прокрутите настройки до “Безопасность” и выберите между
- Использовать SSL 2.0
- Использовать SSL 3.0
- Использовать TLS 1.0
- Использовать TLS 1.1
- Использовать TLS 1.2
В моем случае учетная запись службы, запускающая приложение, не имела права доступа к закрытому ключу. Как только я дал это разрешение, ошибка исчезла.
- ММС
- сертификаты
- Развернуть до личного
- выберите cert
- щелкните правой кнопкой мыши
- Все задачи
- Управление секретными ключами
- Добавить
Если вы запускаете свой код из Visual Studio, попробуйте запустить Visual Studio в качестве администратора. Исправлена ошибка.
У меня была такая же проблема, и я нашел, что этот ответ работал правильно для меня. Ключ – 3072. Эта ссылка содержит сведения об исправлении 3072.
В моем случае два канала потребовали исправления:
System.Net.WebException: запрос был прерван: не удалось создать безопасный канал SSL/TLS.
В нашем случае мы используем поставщика программного обеспечения, поэтому у нас не было доступа для изменения кода.NET. По-видимому,.NET 4 не будет использовать TLS v 1.2, если не будет изменений.
Исправление для нас заключалось в добавлении ключа SchUseStrongCrypto в реестр. Вы можете скопировать/вставить приведенный ниже код в текстовый файл с расширением.reg и выполнить его. Это послужило нашим “патчем” к проблеме.
Ответа с наибольшим количеством голосов, вероятно, будет достаточно для большинства людей. Однако в некоторых случаях вы можете продолжить получать сообщение об ошибке “Не удалось создать безопасный канал SSL/TLS” даже после принудительного использования TLS 1.2. Если это так, вы можете обратиться к этой полезной статье за дополнительными шагами по устранению неполадок. Подводя итог: независимо от проблемы версии TLS/SSL, клиент и сервер должны договориться о “наборе шифров”. На этапе “рукопожатия” SSL-соединения клиент перечислит свои поддерживаемые комплекты шифров, которые сервер будет проверять по собственному списку. Но на некоторых компьютерах с Windows некоторые общие наборы шифров могут быть отключены (по-видимому, из-за благих намерений попыток ограничить поверхность атаки), уменьшая вероятность клиента & согласие сервера на набор шифров. Если они не могут согласиться, вы можете увидеть “код фатального оповещения 40” в средстве просмотра событий и “Не удалось создать безопасный канал SSL/TLS” в вашей .NET-программе.
В вышеупомянутой статье объясняется, как составить список всех потенциально поддерживаемых наборов шифров на компьютере и включить дополнительные наборы шифров через реестр Windows. Чтобы проверить, какие наборы шифров включены на клиенте, попробуйте посетить эту страницу диагностики в MSIE. (Использование трассировки System.Net может дать более точные результаты.) Чтобы проверить, какие наборы шифров поддерживаются сервером, попробуйте этот онлайн-инструмент (при условии, что сервер доступен через Интернет). Само собой разумеется, что изменения в реестре должны выполняться с осторожностью, особенно когда речь идет о работе в сети. (Является ли ваша машина виртуальной машиной с удаленным размещением? Если бы вы прервали работу сети, была бы она вообще доступна?)
В случае моей компании мы включили несколько дополнительных наборов “ECDHE_ECDSA” через редактирование реестра, чтобы исправить непосредственную проблему и защититься от будущих проблем. Но если вы не можете (или не хотите) редактировать реестр, то на ум приходят многочисленные обходные пути (не обязательно красивые). Например: ваша .NET-программа может делегировать свой SSL-трафик отдельной программе Python (которая может сама работать, по той же причине, по которой запросы Chrome могут выполняться успешно, когда запросы MSIE не выполняются на зараженной машине).
Проблема для меня заключалась в том, что я пытался развернуть IIS в качестве веб-службы, я установил сертификат на сервере, но у пользователя, который запускает IIS, не было правильных разрешений на сертификат.
В моем случае у меня была эта проблема, когда служба Windows пыталась подключиться к веб-службе. В результате в Windows я обнаружил код ошибки.
Идентификатор события 36888 (Schannel) поднят:
Наконец, это связано с исправлением Windows. В моем случае: KB3172605 и KB3177186
Предлагаемое решение в форуме vmware – это добавить запись в Windows. После добавления следующего реестра все работает нормально.
“ClientMinKeyBitLength” = DWORD: 00000200
По-видимому, это связано с отсутствующим значением в рукопожатии https на стороне клиента.
Список Windows HotFix:
Надеюсь, что это поможет.
На этот вопрос может быть много ответов, поскольку он касается общего сообщения об ошибке. Мы столкнулись с этой проблемой на некоторых наших серверах, но не на наших машинах для разработки. После удаления большинства наших волос мы обнаружили, что это ошибка Microsoft.
По сути, MS предполагает, что вам нужно более слабое шифрование, но ОС исправлена только для разрешения TLS 1.2, поэтому вы получаете страшное сообщение “Запрос был прерван: не удалось создать безопасный канал SSL/TLS”.
Есть три исправления.
2) Добавьте настройку в файл app.config/web.config.
3) Добавьте параметр реестра, который уже упоминался в другом ответе.
Все они упомянуты в статье базы знаний, которую я разместил.
Ни один из ответов не сработал для меня.
Вот что сработало:
Вместо инициализации моего X509Certifiacte2 вот так:
Я сделал это так:
Обратите внимание на X509KeyStorageFlags.Exportable !!
Я не изменил остальную часть кода (сам WebRequest ):
На самом деле я даже не уверен, что первые две строки необходимы…
Вы можете попробовать установить демонстрационный сертификат (некоторые провайдеры ssl предлагают их бесплатно в течение месяца), чтобы убедиться, что проблема связана с действительностью сертификата или нет.
Пока это относительно “живая” ссылка, я думал, что добавлю новый вариант. Эта возможность заключается в том, что служба больше не поддерживает SSL 3.0 из-за проблемы с атакой пуделя. Ознакомьтесь с инструкцией Google по этому вопросу. Я столкнулся с этой проблемой сразу с несколькими веб-службами и понял, что что-то должно было произойти. Я переключился на TLS 1.2, и все снова работает.
Это происходило для меня только на одном сайте, и оказалось, что он имел только доступный шифр RC4. При попытке упростить работу с сервером я отключил шифр RC4, как только я снова включил эту проблему, проблема была решена.
Источник
Adblock
detector
- Remove From My Forums
-
Question
-
am using power query in Excel to connect to a site over HTTPS and bring down the data. They recently made this announcement and change;»Effective January 4th 2016 we will only support TLS 1.2. «. This change appears to have broken my excel
power query. The error I see in excel now is : «DataSource.Error: The request was aborted: Could not create SSL/TLS secure channel.»
I found a site to check TLS version (Hows my ssl dot com) executing this test thru power query indeed reports that Excel is using TLS Version 1.0Is there a way to upgrade excel to TLS Version to 1.2?
TIA
Mark
Answers
-
-
Proposed as answer by
Saturday, January 16, 2016 12:19 PM
-
Marked as answer by
Ed Price — MSFTMicrosoft employee
Monday, January 18, 2016 6:34 AM
-
Proposed as answer by
-
This change has been made in the source code and is already shipping with Power BI Desktop, and I believe it should be in the next release of Power Query. Until then, you can enable TLS 1.2 in the Windows Registry.
To enable TLS 1.2, it is possible to set the SchUseStrongCrypto DWORD value in the following two registry keys to 1, creating them if they don’t exist: «HKEY_LOCAL_MACHINESOFTWAREMicrosoft.NETFrameworkv4.0.30319» and «HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoft.NETFrameworkv4.0.30319».
Those registry keys, however, will enable TLS 1.2 in all installed .NET 4.0 applications on that system.-
Proposed as answer by
Curt Hagenlocher
Wednesday, January 6, 2016 5:08 PM -
Marked as answer by
Ed Price — MSFTMicrosoft employee
Monday, January 18, 2016 6:34 AM
-
Proposed as answer by
I found the type of certificate also comes into play.
I had a cert that was:
(the below output was in mmc , certificate properties )
Digital Signature, Key Encipherment (a0)
(the below output was from my C# code below)
X509Extension.X509KeyUsageExtension.KeyUsages=’KeyEncipherment, DigitalSignature’
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.CrlSign=’False’
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DataEncipherment=’False’
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DecipherOnly=’False’
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DigitalSignature=’True‘
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.EncipherOnly=’False’
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyAgreement=’False’
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyCertSign=’False’
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyEncipherment=’True‘
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.None=’False’
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.NonRepudiation=’False’
the above did not work.
===============================
Then another certificate with :
(the below output was in mmc , certificate properties )
Certificate Signing, Off-line CRL Signing, CRL Signing (06)
(the below output was from my C# code below)
X509Extension.X509KeyUsageExtension.KeyUsages=’CrlSign, KeyCertSign’
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.CrlSign=’True‘
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DataEncipherment=’False’
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DecipherOnly=’False’
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DigitalSignature=’False’
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.EncipherOnly=’False’
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyAgreement=’False’
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyCertSign=’True‘
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyEncipherment=’False’
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.None=’False’
X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.NonRepudiation=’False’
and it did work
The below code will allow you to inspect your client certificate
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
namespace MyNamespace
{
public static class SecurityShower
{
public static void ShowHttpWebRequest(System.Net.HttpWebRequest hwr)
{
StringBuilder sb = new StringBuilder();
if (null != hwr)
{
sb.Append("-----------------------------------------------HttpWebRequest" + System.Environment.NewLine);
sb.Append(string.Format("HttpWebRequest.Address.AbsolutePath='{0}'", hwr.Address.AbsolutePath) + System.Environment.NewLine);
sb.Append(string.Format("HttpWebRequest.Address.AbsoluteUri='{0}'", hwr.Address.AbsoluteUri) + System.Environment.NewLine);
sb.Append(string.Format("HttpWebRequest.Address='{0}'", hwr.Address) + System.Environment.NewLine);
sb.Append(string.Format("HttpWebRequest.RequestUri.AbsolutePath='{0}'", hwr.RequestUri.AbsolutePath) + System.Environment.NewLine);
sb.Append(string.Format("HttpWebRequest.RequestUri.AbsoluteUri='{0}'", hwr.RequestUri.AbsoluteUri) + System.Environment.NewLine);
sb.Append(string.Format("HttpWebRequest.RequestUri='{0}'", hwr.RequestUri) + System.Environment.NewLine);
foreach (X509Certificate cert in hwr.ClientCertificates)
{
sb.Append("START*************************************************");
ShowX509Certificate(sb, cert);
sb.Append("END*************************************************");
}
}
string result = sb.ToString();
Console.WriteLine(result);
}
public static void ShowCertAndChain(X509Certificate2 cert)
{
X509Chain chain = new X509Chain();
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
chain.ChainPolicy.RevocationMode = X509RevocationMode.Offline;
chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags;
////chain.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreCtlSignerRevocationUnknown &&
////X509VerificationFlags.IgnoreRootRevocationUnknown &&
////X509VerificationFlags.IgnoreEndRevocationUnknown &&
////X509VerificationFlags.IgnoreCertificateAuthorityRevocationUnknown &&
////X509VerificationFlags.IgnoreCtlNotTimeValid;
chain.Build(cert);
ShowCertAndChain(cert, chain);
}
public static void ShowCertAndChain(X509Certificate cert, X509Chain chain)
{
StringBuilder sb = new StringBuilder();
if (null != cert)
{
ShowX509Certificate(sb, cert);
}
if (null != chain)
{
sb.Append("-X509Chain(Start)-" + System.Environment.NewLine);
////sb.Append(string.Format("Cert.ChainStatus='{0}'", string.Join(",", chain.ChainStatus.ToList())) + System.Environment.NewLine);
foreach (X509ChainStatus cstat in chain.ChainStatus)
{
sb.Append(string.Format("X509ChainStatus::'{0}'-'{1}'", cstat.Status.ToString(), cstat.StatusInformation) + System.Environment.NewLine);
}
X509ChainElementCollection ces = chain.ChainElements;
ShowX509ChainElementCollection(sb, ces);
sb.Append("-X509Chain(End)-" + System.Environment.NewLine);
}
string result = sb.ToString();
Console.WriteLine(result);
}
private static void ShowX509Extension(StringBuilder sb, int x509ExtensionCount, X509Extension ext)
{
sb.Append(string.Empty + System.Environment.NewLine);
sb.Append(string.Format("--------X509ExtensionNumber(Start):{0}", x509ExtensionCount) + System.Environment.NewLine);
sb.Append(string.Format("X509Extension.Critical='{0}'", ext.Critical) + System.Environment.NewLine);
AsnEncodedData asndata = new AsnEncodedData(ext.Oid, ext.RawData);
sb.Append(string.Format("Extension type: {0}", ext.Oid.FriendlyName) + System.Environment.NewLine);
sb.Append(string.Format("Oid value: {0}", asndata.Oid.Value) + System.Environment.NewLine);
sb.Append(string.Format("Raw data length: {0} {1}", asndata.RawData.Length, Environment.NewLine) + System.Environment.NewLine);
sb.Append(asndata.Format(true) + System.Environment.NewLine);
X509BasicConstraintsExtension basicEx = ext as X509BasicConstraintsExtension;
if (null != basicEx)
{
sb.Append("-X509BasicConstraintsExtension-" + System.Environment.NewLine);
sb.Append(string.Format("X509Extension.X509BasicConstraintsExtension.CertificateAuthority='{0}'", basicEx.CertificateAuthority) + System.Environment.NewLine);
}
X509EnhancedKeyUsageExtension keyEx = ext as X509EnhancedKeyUsageExtension;
if (null != keyEx)
{
sb.Append("-X509EnhancedKeyUsageExtension-" + System.Environment.NewLine);
sb.Append(string.Format("X509Extension.X509EnhancedKeyUsageExtension.EnhancedKeyUsages='{0}'", keyEx.EnhancedKeyUsages) + System.Environment.NewLine);
foreach (Oid oi in keyEx.EnhancedKeyUsages)
{
sb.Append(string.Format("------------EnhancedKeyUsages.Oid.FriendlyName='{0}'", oi.FriendlyName) + System.Environment.NewLine);
sb.Append(string.Format("------------EnhancedKeyUsages.Oid.Value='{0}'", oi.Value) + System.Environment.NewLine);
}
}
X509KeyUsageExtension usageEx = ext as X509KeyUsageExtension;
if (null != usageEx)
{
sb.Append("-X509KeyUsageExtension-" + System.Environment.NewLine);
sb.Append(string.Format("X509Extension.X509KeyUsageExtension.KeyUsages='{0}'", usageEx.KeyUsages) + System.Environment.NewLine);
sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.CrlSign='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.CrlSign) != 0) + System.Environment.NewLine);
sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DataEncipherment='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.DataEncipherment) != 0) + System.Environment.NewLine);
sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DecipherOnly='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.DecipherOnly) != 0) + System.Environment.NewLine);
sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.DigitalSignature='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.DigitalSignature) != 0) + System.Environment.NewLine);
sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.EncipherOnly='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.EncipherOnly) != 0) + System.Environment.NewLine);
sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyAgreement='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.KeyAgreement) != 0) + System.Environment.NewLine);
sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyCertSign='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.KeyCertSign) != 0) + System.Environment.NewLine);
sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.KeyEncipherment='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.KeyEncipherment) != 0) + System.Environment.NewLine);
sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.None='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.None) != 0) + System.Environment.NewLine);
sb.Append(string.Format("X509KeyUsageExtension.KeyUsages.X509KeyUsageFlags.NonRepudiation='{0}'", (usageEx.KeyUsages & X509KeyUsageFlags.NonRepudiation) != 0) + System.Environment.NewLine);
}
X509SubjectKeyIdentifierExtension skIdEx = ext as X509SubjectKeyIdentifierExtension;
if (null != skIdEx)
{
sb.Append("-X509SubjectKeyIdentifierExtension-" + System.Environment.NewLine);
sb.Append(string.Format("X509Extension.X509SubjectKeyIdentifierExtension.Oid='{0}'", skIdEx.Oid) + System.Environment.NewLine);
sb.Append(string.Format("X509Extension.X509SubjectKeyIdentifierExtension.SubjectKeyIdentifier='{0}'", skIdEx.SubjectKeyIdentifier) + System.Environment.NewLine);
}
sb.Append(string.Format("--------X509ExtensionNumber(End):{0}", x509ExtensionCount) + System.Environment.NewLine);
}
private static void ShowX509Extensions(StringBuilder sb, string cert2SubjectName, X509ExtensionCollection extColl)
{
int x509ExtensionCount = 0;
sb.Append(string.Format("--------ShowX509Extensions(Start):for:{0}", cert2SubjectName) + System.Environment.NewLine);
foreach (X509Extension ext in extColl)
{
ShowX509Extension(sb, ++x509ExtensionCount, ext);
}
sb.Append(string.Format("--------ShowX509Extensions(End):for:{0}", cert2SubjectName) + System.Environment.NewLine);
}
private static void ShowX509Certificate2(StringBuilder sb, X509Certificate2 cert2)
{
if (null != cert2)
{
sb.Append(string.Format("X509Certificate2.SubjectName.Name='{0}'", cert2.SubjectName.Name) + System.Environment.NewLine);
sb.Append(string.Format("X509Certificate2.Subject='{0}'", cert2.Subject) + System.Environment.NewLine);
sb.Append(string.Format("X509Certificate2.Thumbprint='{0}'", cert2.Thumbprint) + System.Environment.NewLine);
sb.Append(string.Format("X509Certificate2.HasPrivateKey='{0}'", cert2.HasPrivateKey) + System.Environment.NewLine);
sb.Append(string.Format("X509Certificate2.Version='{0}'", cert2.Version) + System.Environment.NewLine);
sb.Append(string.Format("X509Certificate2.NotBefore='{0}'", cert2.NotBefore) + System.Environment.NewLine);
sb.Append(string.Format("X509Certificate2.NotAfter='{0}'", cert2.NotAfter) + System.Environment.NewLine);
sb.Append(string.Format("X509Certificate2.PublicKey.Key.KeySize='{0}'", cert2.PublicKey.Key.KeySize) + System.Environment.NewLine);
////List<X509KeyUsageExtension> keyUsageExtensions = cert2.Extensions.OfType<X509KeyUsageExtension>().ToList();
////List<X509Extension> extensions = cert2.Extensions.OfType<X509Extension>().ToList();
ShowX509Extensions(sb, cert2.Subject, cert2.Extensions);
}
}
private static void ShowX509ChainElementCollection(StringBuilder sb, X509ChainElementCollection ces)
{
int x509ChainElementCount = 0;
foreach (X509ChainElement ce in ces)
{
sb.Append(string.Empty + System.Environment.NewLine);
sb.Append(string.Format("----X509ChainElementNumber:{0}", ++x509ChainElementCount) + System.Environment.NewLine);
sb.Append(string.Format("X509ChainElement.Cert.SubjectName.Name='{0}'", ce.Certificate.SubjectName.Name) + System.Environment.NewLine);
sb.Append(string.Format("X509ChainElement.Cert.Issuer='{0}'", ce.Certificate.Issuer) + System.Environment.NewLine);
sb.Append(string.Format("X509ChainElement.Cert.Thumbprint='{0}'", ce.Certificate.Thumbprint) + System.Environment.NewLine);
sb.Append(string.Format("X509ChainElement.Cert.HasPrivateKey='{0}'", ce.Certificate.HasPrivateKey) + System.Environment.NewLine);
X509Certificate2 cert2 = ce.Certificate as X509Certificate2;
ShowX509Certificate2(sb, cert2);
ShowX509Extensions(sb, cert2.Subject, ce.Certificate.Extensions);
}
}
private static void ShowX509Certificate(StringBuilder sb, X509Certificate cert)
{
sb.Append("-----------------------------------------------" + System.Environment.NewLine);
sb.Append(string.Format("Cert.Subject='{0}'", cert.Subject) + System.Environment.NewLine);
sb.Append(string.Format("Cert.Issuer='{0}'", cert.Issuer) + System.Environment.NewLine);
sb.Append(string.Format("Cert.GetPublicKey().Length='{0}'", cert.GetPublicKey().Length) + System.Environment.NewLine);
X509Certificate2 cert2 = cert as X509Certificate2;
ShowX509Certificate2(sb, cert2);
}
}
}