Я пытаюсь подключиться к тестовому серверу начал с 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 с последними обновлениями.
Попробуйте дать свой собственный параметр DH с по меньшей мере 1024 бит. По умолчанию для s_server являются слабый 512 бит, который может быть неприемлем для IE. –
@SteffenUllrich спасибо, используя специальные 1024bit params. Но мой вопрос заключается в том, как подключиться к этому серверу ** без ** изменения его конфигурации, т.е. как обойти эту защиту в schannel – savageBum
Не думаю, что это хорошая идея обойти эту проверку, см. https://weakdh.org/. И ожидайте, что другие браузеры и библиотеки тоже получат этот предел. В OpenSSL forks BoringSSL и LibreSSL уже есть ограничение по 1024 бит уже слишком, без возможности обойти его. Но вы можете использовать более новую версию OpenSSL (после 1.02), где они больше не используют 512-битный DH-по умолчанию в s_server. –