2015-05-27 6 views
3

Я пытаюсь подключиться к тестовому серверу начал с OpenSSL (это ограниченное сочетание CipherSuite предназначено):Не удается подключиться к серверу SSL, которые используют только эфемерные ciphersuites (Орган Local Security не может связаться)

openssl s_server -accept 443 -www -tls1_2 -cipher ECDHE:DHE:EDH -cert selfsignedcert.pem -key sskey.pem 

код я использую похож на MSDN-х

public static bool ValidateServerCertificate(
     object sender, 
     X509Certificate certificate, 
     X509Chain chain, 
     SslPolicyErrors sslPolicyErrors) 
{ 
     return true; 
} 

... 

var client = new TcpClient(target, port); 
SslStream sslStream = new SslStream(client.GetStream(), false,ValidateServerCertificate,null); 
sslStream.AuthenticateAsClient(target, null, SslProtocols.Tls12, false); 

Но я получаю исключение в последней строке: A call to SSPI failed, see inner exception., где внутреннее исключение говорит: The Local Security Authority cannot be contacted. Посмотрев на wirehark, я могу сказать, что рукопожатие TLS заканчивается Server Hello, Certificate, Server Key Exchange, Server Hello Done, а выбранный ciphersuite - TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (0x009f).

Я могу подключить URL-адрес с помощью Firefox, но не с IE (он просто говорит «Эта страница не может быть отображена»), поэтому она выглядит как проблема с каналом.

Все работает нормально (IE и код), когда я запускаю сервер со всеми ciphersuites (-cipher ALL). Есть ли способ заставить его работать без изменения конфигурации сервера?

StackTrace только в случае

at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception) 
    at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) 
    at System.Net.Security.SslStream.AuthenticateAsClient(String targetHost, X509CertificateCollection clientCertificates, SslProtocols enabledSslProtocols, Boolean checkCertificateRevocation) 

Я использую Windows, 8.1 с последними обновлениями.

+1

Попробуйте дать свой собственный параметр DH с по меньшей мере 1024 бит. По умолчанию для s_server являются слабый 512 бит, который может быть неприемлем для IE. –

+0

@SteffenUllrich спасибо, используя специальные 1024bit params. Но мой вопрос заключается в том, как подключиться к этому серверу ** без ** изменения его конфигурации, т.е. как обойти эту защиту в schannel – savageBum

+0

Не думаю, что это хорошая идея обойти эту проверку, см. https://weakdh.org/. И ожидайте, что другие браузеры и библиотеки тоже получат этот предел. В OpenSSL forks BoringSSL и LibreSSL уже есть ограничение по 1024 бит уже слишком, без возможности обойти его. Но вы можете использовать более новую версию OpenSSL (после 1.02), где они больше не используют 512-битный DH-по умолчанию в s_server. –

ответ

5

Мне удалось установить минимальную длину ключа для schannel, используя реестр Windows.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman] 
"ClientMinKeyBitLength"=dword:00000200 

Но это не искомое решение, так как он изменяет настройки для всей системы, и я хотел бы установить его временно и только в рамках моего приложения.

+0

Привет, вам удалось найти лучшее решение? – Para

+0

Вид. Вместо использования schannel я пошел с openssl, управляемой оберткой, чтобы быть точным [openssl-net] (https://github.com/openssl-net/openssl-net). – savageBum