将SSL应用程序从Java移植到C#

时间:2012-03-08 03:36:01

标签: c# java ssl .net-4.0 cryptography

我正在为java client移植mumble到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进行此连接?

1 个答案:

答案 0 :(得分:0)

没有你的代码没问题,但是,默认情况下,Windows似乎不启用AES256支持,因为未启用TLS 1.2。 Java使用自己的SSL实现,显然支持它。因此,在与服务器通信c#进行协商时,会选择AES128,因为默认情况下它的最强密码窗口是支持的。

根据此site运行以下powershell脚本应在TLS中启用AES256并修复您的问题。在运行它之前,我确保它没有做任何有趣的事情。

# 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"