Взаимная аутентификация клиента и сервера SSL - PullRequest
3 голосов
/ 30 июня 2011

Здравствуйте. Я пытаюсь установить в C # связь ssl клиент / сервер с взаимной аутентификацией с использованием сертификата сервера и клиента.A удалось сделать ssl-связь только с использованием сертификата сервера, где на стороне клиента я использую вот что:

TcpClient client = new TcpClient(machineName, port);
//Create an SSL stream that will close the client's stream.
   SslStream sslStream = new SslStream(
   client.GetStream(),
   false,
   new RemoteCertificateValidationCallback(ValidateServerCertificate),
   null
   );
try
{
    // The server name must match the name on the server certificate.
    sslStream.AuthenticateAsClient(serverName);
}
catch (AuthenticationException e)
{
    Console.WriteLine("Exception: {0}", e.Message);
    if (e.InnerException != null)
    {
        Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
    }
    Console.WriteLine("Authentication failed - closing the connection.");
    client.Close();
    return;
} 

Я предполагаю, что мне нужно было бы использовать метод

AuthenticateAsClient(string targetHost, X509CertificateCollection clientCertificates, SslProtocols enabledSslProtocols, bool checkCertificateRevocation)

я Corrent?Может ли кто-нибудь показать мне, как использовать его со всеми вещами? Даже на стороне сервера, или указать на простой пример?

Большое спасибо.

Ответы [ 2 ]

6 голосов
/ 19 ноября 2011
static void HTTPSClient()
{
    try
    {
        string message = "GET / HTTP/1.0\r\nHost: host.com\r\n\r\n";

        byte[] data = System.Text.Encoding.ASCII.GetBytes(message);

        string server = "host.com";
        int nPort = 443;
        TcpClient client = new TcpClient(server, nPort);

        X509Certificate2Collection cCollection = new X509Certificate2Collection();
        cCollection.Add(new X509Certificate2("cert.pfx", "password"));


        using (SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null))
        {
            // Add a client certificate to the ssl connection
            sslStream.AuthenticateAsClient(server, cCollection, System.Security.Authentication.SslProtocols.Default, true);

            sslStream.Write(data, 0, data.Length);

            data = new Byte[8192];
            int bytes = 0;
            string responseData = "";

            do
            {
                bytes = sslStream.Read(data, 0, data.Length);
                if (bytes > 0)
                {
                    responseData += System.Text.Encoding.ASCII.GetString(data, 0, bytes);
                }
            }
            while (bytes > 0);

            Console.WriteLine("Response: " + responseData);
        }

        // Disconnect and close the client
        client.Close();
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error: " + ex.ToString());
    }
}

public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
        return true;

    Console.WriteLine("Certificate error: {0}", sslPolicyErrors);

    // Do not allow this client to communicate with unauthenticated servers.
    return false;
}
2 голосов
/ 01 июля 2011
  1. Вам необходим собственный сертификат x509, чтобы его легко создать, загрузите само свидетельство pluralsight
  2. Создайте сертификат как в image
  3. Создайте новый веб-сайт, там выберите службу wcf.
  4. Добавьте в решение новое консольное приложение, чтобы протестировать наш сервис.
  5. В web.config службы введите конфигурацию:

    <?xml version="1.0"?>
    <configuration>
     <system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior name="ServiceCredentialsBehavior">
                <serviceCredentials>
                    <serviceCertificate findValue="cn=cool" storeName="TrustedPeople" storeLocation="CurrentUser" />
                </serviceCredentials>
                <serviceMetadata httpGetEnabled="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
        <service behaviorConfiguration="ServiceCredentialsBehavior" name="Service">
            <endpoint address="" binding="wsHttpBinding" bindingConfiguration="MessageAndUserName" name="SecuredByTransportEndpoint" contract="IService"/>
        </service>
    </services>
    <bindings>
        <wsHttpBinding>
            <binding name="MessageAndUserName">
                <security mode="Message">
                    <message clientCredentialType="UserName"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client/>
    

  6. В классе Service удалите существующие методы и добавьте:

    открытая строка TestAccess () {return OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name;}

  7. в IService удалить контракт данных, удалить контракты операций и добавить новый контракт операций:

    [OperationContract]открытая строка TestAccess ();

  8. Запустить службу и добавить ссылку на службу в клиентском приложении в нашу службу

  9. Конфигурация клиента:

    <?xml version="1.0" encoding="utf-8"?>
     <configuration>
       <system.serviceModel>
      <behaviors>
        <endpointBehaviors>
            <behavior name="LocalCertValidation">
                <clientCredentials>
                    <serviceCertificate>
                        <authentication certificateValidationMode="PeerTrust" trustedStoreLocation="CurrentUser" />
                    </serviceCertificate>
                </clientCredentials>
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <bindings>
        <wsHttpBinding>
            <binding name="WSHttpBinding_IService" >
                <security mode="Message">
                    <message clientCredentialType="UserName" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="your service addresss"
                  binding="wsHttpBinding"
                  bindingConfiguration="WSHttpBinding_IService"
                  contract="ServiceReference1.IService"
                  name="WSHttpBinding_IService" behaviorConfiguration="LocalCertValidation">
            <identity>
                <dns value ="cool" />
            </identity>
        </endpoint>
    </client>
    

  10. Код клиента:

    Клиент ServiceClient = новый ServiceClient ();client.ClientCredentials.UserName.UserName = "Ваш пользователь Windows";client.ClientCredentials.UserName.Password = "Ваш пароль пользователя Windows";ЕЫпе (client.TestAccess ());Console.ReadLine ();

  11. Если вы не хотите использовать логин / пароль Windows, вам нужно создать пользовательский валидатор user / passwd -> msdn : С уважением, Сергей.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...