我正在学习 SSL,在这个过程中,我试图在 .NET 服务器与 Java 客户端之间创建 SSL 连接。为此,我使用自签名证书。我不想在 Java 中使用标准密钥库,所以我创建了一个自定义密钥库并加载它。
我使用以下步骤生成证书和 pfx 文件以在 .NET 服务器端使用。
在 Windows 上使用以下命令生成证书。
makecert -r -pe -sr "localhost" -$ individual -n "CN=localhost" -sv .pvk -r localhost.cer
将其转换为 .pfx,以便我可以在 .NET 服务器应用程序上加载此证书。
将 .cer 文件导出为 .pem(Base64 格式)。
使用以下命令获取 .cer 文件(上述证书的公共组件)并创建一个 .jks 文件(JavaKeyStore)用作 java 客户端。
keytool \ -import \ -v \ -trustcacerts \ -alias 0 \ -file <(openssl x509 -in localhost.pem) \ -keystore mystore.jks\ -storetype JKS\ -storepass ez24get
在 Java 客户端应用程序中加载此 .jks 并使用以下代码启动连接
FileInputStream fis = new FileInputStream("res/myjksstore.jks"); KeyStore trusted = KeyStore.getInstance("JKS"); trusted.load(fis, "ez24get".toCharArray()); TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(trusted); SSLContext context = SSLContext.getInstance("SSL"); context.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom()); Socket socket = context.getSocketFactory().createSocket("localhost", 443); String str = "abc123"; socket.getOutputStream().write(GeneralUtil.toByta(str.length())); socket.getOutputStream().write(str.getBytes()); socket.setKeepAlive(true);
但是当我尝试将数据写入套接字时,我在服务器端收到以下错误
System.ComponentModel.Win32Exception:客户端和服务器无法通信,因为它们没有共同的算法
我的服务器代码如下所示...
X509Certificate cert = new X509Certificate("localhost.pfx", "abc123");
TcpListener listener = new TcpListener(IPAddress.Loopback, 443); listener.Start();
而(真){
尝试 { TcpClient tcpClient = listener.AcceptTcpClient();
NetworkStream networkStream = tcpClient.GetStream(); SslStream sslStream = new SslStream(networkStream); sslStream.AuthenticateAsServer(cert, false, SslProtocols.Default,
错误的);
byte[] data1 = new byte[4]; sslStream.Read(data1, 0, data1.Length); int len = BitConverter.ToInt32(data1, 0); String message = "Length of incoming data " +
BitConverter.ToInt32(data1, 0);
byte[] data2 = new byte[len]; sslStream.Read(data2, 0, data2.Length); message += " Message: " + ASCIIEncoding.ASCII.GetString(data2); Thread.Sleep(1000);
} 捕捉(异常前)
{
} }
异常发生在该行
sslStream.AuthenticateAsServer(cert, false, SslProtocols.Default, false);
这可能是什么原因,我该如何解决?
任何帮助将不胜感激。