Проверка подлинности SSL-клиента Nginx - PullRequest
0 голосов
/ 17 октября 2018

Я очень новичок в Nginx, и мне нужна ваша помощь / предложения для решения проблемы ниже.

Я настроил Nginx в качестве обратного прокси-сервера на Windows Server 2012 r2 и пытаюсь перенаправлять вызовы на мой внутренний сервер 'SERVERA 'всякий раз, когда делается запрос к Nginx.

Мое требование таково: мне нужно передать клиентский сертификат на сервер Nginx и, если сертификат действителен, направить вызовы на внутренний сервер' SERVERA ', иначе он должен отклонитьпозвоните в Nginx.

Я внес изменения в файл конфигурации на сервере Nginx, как показано ниже, для настройки проверки сертификации клиента.

server {
        listen       443 ssl; 
        server_name  localhost;

        ssl_certificate      "C:/NewCert/server.crt";
        ssl_certificate_key  "C:/NewCert/server.key";
        ssl_client_certificate "C:/NewCert/ca.crt";

        ssl_verify_client on;

        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass https://SERVERA/MyWebService;
        }

        location /MyWebService {
            root   html;
            index  index.html index.htm;
            proxy_pass https://SERVERA/MyWebService;
        }
   } 

Я создал сертификаты клиента и сервера, как указано вниже опубликовано и используется то же самое для конфигурации сервера Nginx "http://nategood.com/client-side-certificate-authentication-in-ngi"

После того, как вышеупомянутая конфигурация изменяется на сервере Nginx, каждый раз, когда я пытаюсь просмотреть сервис, я получаю" 400 Bad request "" https://localhost/MyWebService"

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

"{System.Net.WebException: Ошибка: SecureChannelFailure (сбой вызова SSPI, см. Внутреннее исключение.) ---> System.Security.Authentication.AuthenticationException: сбой вызова SSPI, см. Внутреннее исключение.---> Mono.Btls.MonoBtlsException: системный вызов в Mono.Btls.MonoBtlsContext.ProcessHandshake () [0x00038] в: 0 в Mono.Net.Security.MobileAuthenticatedStream.ProcessHandshake (статус Mono.Net.Security.AseOynSync).в: 0 at (обертка удаленного взаимодействия с проверкой) Mono.Net.Security.MobileAuthenticatedStream.ProcessHandshake (Mono.Net.Security.AsyncOperationStatus) в Mono.Net.Security.AsyncHandshakeRequest.Run (Mono.Net.Security.Security.Security.status) [0x00006] in: 0 at Mono.Net.Security.AsyncProtocolRequest + d__24.MoveNext () "

Ниже приведен код моего клиента

namespace Test 
{
class SomeTest
{
    public void SomeMethod()
    {
        try
          {
            string urlString = @"https://SERVERA/MyWebService";
            MyWebClient obj = new MyWebClient();
            obj.UploadData(urlString, new byte[2]);
          }
        catch (Exception ex)
          {
            string st = ex.Message;
          }
    }
}
class MyWebClient : WebClient
{
    protected override WebRequest GetWebRequest(Uri address)
    {
        HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);

        System.Security.Cryptography.X509Certificates.X509Certificate x509Certificate = new System.Security.Cryptography.X509Certificates.X509Certificate(@"/storage/emulated/0/nginx.crt");
        request.ClientCertificates.Add(x509Certificate);
        request.Method = "POST";
        return request;
    }
}
}

Любая помощь / предложенияс благодарностью.

Спасибо, Винод

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