6

我正在学习 SSL,在这个过程中,我试图在 .NET 服务器与 Java 客户端之间创建 SSL 连接。为此,我使用自签名证书。我不想在 Java 中使用标准密钥库,所以我创建了一个自定义密钥库并加载它。

我使用以下步骤生成证书和 pfx 文件以在 .NET 服务器端使用。

  1. 在 Windows 上使用以下命令生成证书。

    makecert -r -pe -sr "localhost" -$ individual -n "CN=localhost" -sv .pvk -r localhost.cer

  2. 将其转换为 .pfx,以便我可以在 .NET 服务器应用程序上加载此证书。

  3. 将 .cer 文件导出为 .pem(Base64 格式)。

  4. 使用以下命令获取 .cer 文件(上述证书的公共组件)并创建一个 .jks 文件(JavaKeyStore)用作 java 客户端。

    keytool \ -import \ -v \ -trustcacerts \ -alias 0 \ -file <(openssl x509 -in localhost.pem) \ -keystore mystore.jks\ -storetype JKS\ -storepass ez24get

  5. 在 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);

这可能是什么原因,我该如何解决?

任何帮助将不胜感激。

4

1 回答 1

-1

SSLEngine(从 SSLContext 获得)必须设置为客户端模式(setUseClientMode)

于 2012-11-10T05:13:44.683 回答