c# – 带有客户端身份验证的.Net和Java之间的SSL套接字
我正在尝试在.NET和
Java之间创建一个SSL套接字服务器/客户端.在这种情况下,我的SSL套接字服务器将在.net中运行,客户端在
Linux下以Java运行.我的问题是握手期间连接失败,特别是当服务器从客户端请求证书时,客户端无法发送回来的东西,连接失败.
在.net中我使用sslStream建立连接,在Java上我使用的是标准的SSLSocket.下面是一些代码片段,但这是我到目前为止的内容: 在服务器端(Windows),我在MMC下的Personal / Certificates文件夹中有一个私有证书.我在“受信任的人/证书”中拥有来自客户的公共证书.两个证书都是由同一个CA颁发的.两个证书的证书链都有多个级别,但两者都相同.链中的根级证书也安装在受信任的证书颁发机构/证书文件夹中. 在客户端(Linux),我有一个密钥库,其中包含与服务器上安装的公共证书匹配的私有证书.我有一个信任存储,它包含来自服务器的公共证书,与服务器的私有证书匹配. 在服务器端(.net)我使用的是一个执行异步读取的Socket,然后它被包装到SSLStream中,代码片段如下所示: NetworkStream ns = new NetworkStream(socket,false); SslStream ssl = new SslStream(ns,true); ssl.AuthenticateAsServer(serverCertificate,true,SslProtocols.Default,true); 客户端代码几乎是标准代码: SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault(); InetAddress addr = InetAddress.getByName(servername); SSLSocket socket = (SSLSocket) factory.createSocket(addr,port); socket.setUseClientMode(true); socket.setNeedClientAuth(true); socket.setWantClientAuth(true); socket.startHandshake(); os = new DataOutputStream(socket.getOutputStream()); is = new DataInputStream(socket.getInputStream()); byte[] outBuf = new byte[50]; os.write("SEND SOMETHING".getBytes("UTF-8")); is.read(outBuf); 在java中,我设置了适当的varialbes以指向信任和密钥存储区及其密码. 现在,遵循标准SSL握手,这是发生的事情: > ClientHello 就是这样,客户端不会将有效证书发送回服务器.我对此有一些疑问: 有没有人经历过这样的事情? 我在代码的两边都遗漏了什么吗? 任何帮助将不胜感激. 解决方法
以下两个语句在客户端是无用的(尽管它们不应该受到伤害):
socket.setNeedClientAuth(true); socket.setWantClientAuth(true); 您看到证书请求消息和客户端证书消息的事实表明服务器配置正确. 在客户端证书消息中缺少证书的最可能原因是密钥库(在客户端)可能未正确配置.您可能对this answer感兴趣,以确保正确配置了客户端密钥库.更具体地说,您需要确保将客户端证书的私钥导入到与证书链相同的别名中(并且它是链回到证书请求消息中公布的CA). (关于你的其余问题,我不确定在C#中使用SslStream时如何修改服务器发送的CA列表.This earlier question似乎表明没有解决方案,尽管.Net的新版本可能解决了这个问题因为这个问题被问到了.通过查看SslStream API文档和相关类,我找不到任何可以做到的事情,但这并不意味着它不存在.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |