Вот вопросы / проблемы, на которые я ответил, когда пытался решить эту проблему.
Q1.
Почему мой сертификат не попал на сторону клиента (код)?
A1.
VS выполняет начальное согласование SSL, которое происходит до того, как будет нажата кнопка OnAuthorization (HttpActionContext actionContext).В этот момент сервер ищет сертификат клиента в хранилище сертификатов, для которого установлен закрытый ключ.Если нет закрытого ключа, то он не работает.Я нашел проблему, включив многословный.Пожалуйста, см. Ниже.
Вот конфигурации, которые необходимо изменить, чтобы это работало.
1.Изменения в файле Web Config
• Согласование SSL
Ниже в конфигурации указано, что Visual Studio ожидает согласование ssl для URL «api / values».Это помогает нам ограничивать, когда и где ожидается согласование сертификата.Свойство пути к местоположению
<location path="api/values">
<system.webServer>
<security>
<access sslFlags="SslNegotiateCert" />
<authentication>
<iisClientCertificateMappingAuthentication enabled="true">
</iisClientCertificateMappingAuthentication>
</authentication>
</security>
</system.webServer>
</location>
• Подробный сертификат
Приведенная ниже диагностика помогает нам при устранении неполадок и выявляет любые проблемы, которые могут быть вызваны проверкой сертификатов.
<system.diagnostics>
<trace autoflush="true" />
<sources>
<source name="System.Net">
<listeners>
<add name="System.Net"/>
</listeners>
</source>
<source name="System.Net.HttpListener">
<listeners>
<add name="System.Net"/>
</listeners>
</source>
<source name="System.Net.Sockets">
<listeners>
<add name="System.Net"/>
</listeners>
</source>
<source name="System.Net.Cache">
<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" />
<add name="System.Net.Cache" value="Verbose" />
<add name="System.Net.HttpListener" value="Verbose" />
</switches>
</system.diagnostics>
•Настройки приложения
Измените значение rootThumbprint на отпечаток любого сертификата сервера, а clientThumprint будет тем же отпечатком сертификата клиента.ceritificateSerialNumber должен быть серийным номером исходящего сертификата.
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="rootThumbprint" value="change"/>
<add key="clientThumbprint" value="change"/>
<add key="certificateSerialNumber" value="change"/>
</appSettings>
2.Локальная Visual Studio и IIS express
1) Applicationhost.config
Путь Visual Studio ранее, чем в 2015 году, но после 2008 года Местоположение -> c: \ Users \ e # \ Documents \ IISExpress \ Config VisualStudio 2015 & 2017 {имя_проекта} .vs \ config \ config.host.config
Изменения Убедитесь, что для свойств ниже установлено значение «Разрешить»
2) Включить SSL
Включить SSLв окне свойств визуальной студии.это важно, потому что URL меняется с http на https.
3) WebApiConfig.cs
Создайте папку фильтров классов.Назовите это соответствующим образом.Проверка сертификата должна быть самой первой проверкой перед выполнением любого другого кода.Вот где WebApiConfig.cs пригодится.Например, я назвал свой класс RequireHttpsAttribute.Чтобы запустить проверку, просто поместите следующую строку в файл WebApiConfig.cs config.Filters.Add (new RequireHttpsAttribute ());
4) CertificateTestController.cs
Этот класс действует как клиент.Этот класс используется для прикрепления сертификата к запросу и его отправки.В этом классе есть одно изменение.Это было проверено только локально на компьютере.var result = client.GetAsync ("https://localhost:44300//api//values").GetAwaiter().GetResult(); Изменить URL-адрес. Мы прилагаем сертификат, основанный на серийном номере, указанном ниже. Сертификат также может быть прикреплен на основе Thumprint, Subject, Expiration /Отзыв, проверка цепочки и т. Д.
var certificateSerialNumber = WebConfigurationManager.AppSettings["certificateSerialNumber"].ToUpper().Replace(" ", string.Empty);
5) ValueController.cs
Этот класс действует как сервер. Именно здесь происходит проверка сертификата. В методе «CheckCertificate» есть два изменения/ function, которая ссылается на webApiConfig.cs. Если вы следили за изменениями параметров приложения, приведенными выше в WebApiConfig.cs, тогда все готово.
3. Файлы
1) CertificateTestController.cs
2) ValuesController.cs