2012-03-08 2 views
0

Я портирую java client на mumble на C#, и я ударил немного кирпичной стены.Портирование приложения SSL с Java на C#

В Java сокет SSL начинается так:

final SSLContext ctx_ = SSLContext.getInstance("TLS"); 
ctx_.init(null, new TrustManager[] { new LocalSSLTrustManager() }, null); 
final SSLSocketFactory factory = ctx_.getSocketFactory(); 
final SSLSocket sslSocket = (SSLSocket) factory.createSocket(hostAddress, port); 
sslSocket.setUseClientMode(true); 
sslSocket.setEnabledProtocols(new String[] { "TLSv1" }); 
sslSocket.startHandshake(); 

Я портирована это C# как это:

return ssl = new SslStream(netStream, false, (a, b, c, d) => true); //For now, accept any cert 
ssl.AuthenticateAsClient(serverName); 

Теперь, это на самом деле установить соединение, но это используя AES128, а mumble protocol требует AES256, поэтому сервер, как представляется, игнорирует все, что я посылаю в этом сокете.

Действительно ли мой код правильно портирован? И есть ли способ заставить C# использовать AES256 для этого соединения?

+0

Зачем серверу принимать соединения AES-128, если протокол запрещает его? Как вы знаете, что ваш java-клиент использовал AES-256, и как вы знаете, что клиент C# использует AES-128? –

+0

В потоке SSL есть свойство, которое сообщает вам тип используемого шифрования, в данном случае AES, с прочностью 128. Оказывается, проблема, с которой я столкнулась, не была сервером, игнорирующим вещи, это была плохая документация пакетов макетов. Тем не менее, я все равно хотел бы знать, есть ли способ заставить шифрование до 256 бит. – Martin

+1

Несомненно, просто включите только те комплекты шифров на сервере, которые используют AES-256. Вы можете сделать то же самое на клиенте, но это может быть немного сложнее. Быстрый Google нашел: http://stackoverflow.com/questions/91304/nets-sslstream-is-always-negotiating-to-the-least-secure-cipher-i-have-how-ca –

ответ

0

Нет, ваш код в порядке, однако, по мнению defualt, окна не поддерживают AES256, поскольку TLS 1.2 не включен. Java использует собственную реализацию SSL, которая, очевидно, поддерживает ее. В результате при согласовании с сервером usng C# выбран AES128, поскольку по умолчанию его самые сильные окна шифрования поддерживаются.

В соответствии с этим site запуск следующего сценария PowerShell должен включить AES256 в TLS и исправить вашу проблему. Я бы не стал делать ничего смешного, прежде чем запускать его.

# Enables TLS 1.2 on Windows Server 2008 R2 and Windows 7 
# June 27, 2010 
# Version 1.2 
# These keys do not exist so they need to be created prior to setting values. 

md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2" 

md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" 

md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" 

# Enable TLS 1.2 for client and server SCHANNEL communications 

new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" -name "Enabled" -value 1 -PropertyType "DWord" 

new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server" -name "DisabledByDefault" -value 0 -PropertyType "DWord" 

new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -name "Enabled" -value 1 -PropertyType "DWord" 

new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client" -name "DisabledByDefault" -value 0 -PropertyType "DWord" 

# Disable SSL 2.0 (PCI Compliance) 
md "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server" 

new-itemproperty -path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server" -name Enabled -value 0 -PropertyType "DWord" 
Смежные вопросы