Как отправить сертификат x509 с клиента на сервер WebSocketSharp C # - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь отправить и проверить SSL-сертификат между клиентом и сервером с помощью WebSocketSharp

Серверная сторона

wss = new WebSocketServer(IPAddress.Parse("127.0.0.1"), 6070, true);
string _certificatePath = Path.GetDirectoryName(typeof(WSS_Server).Assembly.Location) + "\\cert\\public_privatekey.pfx";
wss.SslConfiguration.ServerCertificate = new X509Certificate2(_certificatePath, "mypass");
wss.SslConfiguration.ClientCertificateRequired = false; // true;
wss.SslConfiguration.CheckCertificateRevocation = false; // true;
wss.SslConfiguration.ClientCertificateValidationCallback = RemoteCertificateValidationCallback;

wss.AddWebSocketService<MyRemoteService>(
"/myservice",
() => new MyRemoteService()
{
    OriginValidator = val =>
    {
        // Check the value of the Origin header, and return true if valid.
        return true;
    },
    CookiesValidator = (req, res) =>
    {
        return true; // If valid.
    }

});

Клиентская сторона

var ws = new WebSocket("wss://127.0.0.1:6070/myservice/");
string _certificatePath = "\\cert\\public_privatekey.pfx";
X509Certificate2 x509 = new X509Certificate2(_certificatePath, "mypass");
X509CertificateCollection xcol = new X509CertificateCollection();
xcol.Add(x509);

ws.SslConfiguration = new WebSocketSharp.Net.ClientSslConfiguration("127.0.0.1", xcol, System.Security.Authentication.SslProtocols.Default, false);
//ws.SslConfiguration.ClientCertificates = new X509CertificateCollection();
//ws.SslConfiguration.ClientCertificates.Add(x509);

ws.OnOpen += Ws_OnOpen;
ws.OnMessage += Ws_OnMessage;
ws.OnError += Ws_OnError;
ws.OnClose += Ws_OnClose;
ws.Connect();

На стороне сервера RemoteCertificateValidationCallback сертификат и цепочка всегда ноль

Как будто клиент никогда не отправляет сертификат.

Есть идеи как решить?

Ответы [ 3 ]

0 голосов
/ 29 апреля 2019

У меня была такая же проблема, я решил ее с помощью

X509Certificate2 cert = new X509Certificate2(fileName, "", X509KeyStorageFlags.MachineKeySet);
ws.SslConfiguration.ClientCertificates = new X509CertificateCollection() { };
ws.SslConfiguration.ClientCertificates.Add(cert);
0 голосов
/ 11 июня 2019

Ни один из ответов здесь не работал для меня. Чтобы это работало, мне нужно установить SslConfiguration.ClientCertificateSelectionCallback с соответствующим значением, например так:

X509Certificate2 cert = new X509Certificate2(fileName, "", X509KeyStorageFlags.MachineKeySet);
ws.SslConfiguration.ClientCertificateSelectionCallback =
            (sender,targethost,localCertificates, remoteCertificate,acceptableIssuers) =>
            {
                return cert;
            };

Фактически документация SslConfiguration.ClientCertificateSelectionCallback в исходном коде WebsocketSharp четко гласит:

Получает или задает обратный вызов, используемый для выбора сертификата для предоставления сервер. Сертификат не предоставляется, если обратный вызов возвращается нуль . [...] значение по умолчанию - это делегат, который вызывает a. метод, который возвращает только нуль .

Таким образом, если вы явно не предоставите сертификат клиента в этом обратном вызове, сертификат не будет отправлен.

0 голосов
/ 29 октября 2018

Вы всегда можете установить или получить коллекцию, которая содержит клиентские сертификаты в WebSocketSharp.

Для этого вы можете добавить свой X509Certificate2 объект в ClientCertificates.

Вот, пожалуйста,

var ws = new WebSocket("wss://127.0.0.1:6070/myservice/");
string _certificatePath = "\\cert\\public_privatekey.pfx";
X509Certificate2 x509 = new X509Certificate2(_certificatePath, "mypass");    
ws.SslConfiguration.ClientCertificates.Add(x509);
ws.Connect();

Затем вы можете проверить этот сертификат на стороне сервера. Надеюсь, что это ответ на ваш вопрос.

...