【问题标题】:Porting SSL application from Java to C#将 SSL 应用程序从 Java 移植到 C#
【发布时间】:2012-03-08 03:36:00
【问题描述】:

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

【问题讨论】:

  • 如果协议不允许,为什么服务器会接受 AES-128 连接?你怎么知道你的 java 客户端使用的是 AES-256,你怎么知道你的 C# 客户端使用的是 AES-128?
  • SSL 流有一个属性可以告诉您使用的加密类型,在本例中为 AES,强度为 128。事实证明,我遇到的问题不是服务器忽略了一些事情,而是数据包布局的错误文档。但是,我仍然想知道是否有办法强制加密为 256 位。
  • 当然,只需在服务器上启用那些使用 AES-256 的密码套件。您可以在客户端做同样的事情,但这可能会稍微困难一些。快速谷歌发现:stackoverflow.com/questions/91304/…

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


【解决方案1】:

不,您的代码很好,但是默认情况下,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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2010-12-07
    • 2012-04-14
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多