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

C# 将SSL应用程序从Java移植到C,c#,java,ssl,.net-4.0,cryptography,C#,Java,Ssl,.net 4.0,Cryptography,我正在将a移植到C,我遇到了一点麻烦 在java中,SSL套接字的启动方式如下: final SSLContext ctx_ = SSLContext.getInstance("TLS"); ctx_.init(null, new TrustManager[] { new LocalSSLTrustManager() }, null); final SSLSocketFactory factory = ctx_.getSocketFactory(); final SSLSocket sslSoc

我正在将a移植到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,并且需要AES256,因此服务器似乎会忽略我在这个套接字上发送的任何内容


我的代码移植正确吗?有没有办法强制C使用AES256进行此连接?

不,您的代码很好,不过,windows似乎没有启用AES256支持,因为TLS 1.2未启用。Java使用自己的SSL实现,显然它确实支持SSL。因此,在与服务器usng c协商时,选择AES128,因为默认情况下,AES128是windows支持的最强大的密码

根据这一点,运行以下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"

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