.Net 和 Java 之间的 SSL 套接字,具有客户端身份验证

2024-06-28

我正在尝试在 .NET 和 Java 之间创建 SSL 套接字服务器/客户端。在这种情况下,我的 SSL 套接字服务器将在 .net 中运行,客户端在 Linux 下以 Java 运行。我的问题是在握手期间连接失败,特别是当服务器向客户端请求证书时,客户端无法发回某些内容并且连接失败。

在.net 中,我使用 sslStream 建立连接,在 Java 上,我使用标准 SSLSocket。下面是一些代码片段,但这是我到目前为止所拥有的:

在服务器端 (Windows),我在 MMC 下的个人/证书文件夹中有一个私有证书。我在受信任的人/证书中拥有来自客户的公共证书。两个证书均由同一 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中,我已经设置了正确的变量来指向信任和密钥存储及其密码。

现在,按照标准 SSL 握手,会发生以下情况:

  • 客户您好
  • 服务器问候语
  • 服务器发送公共证书
  • 客户端将公共证书与信任存储中的证书进行匹配
  • 服务器发送证书请求
  • 通过证书请求,服务器发送有效 CA 列表,在此列表中仅发送我的根 CA(在其他众所周知的 CA 的长列表中)。
  • 客户端证书为空。
  • 服务器从客户端收到空证书,从而关闭连接。

就是这样,客户端不会将有效的证书发送回服务器。我对此有一些疑问:

有人经历过这样的事情吗? 关于服务器 (Windows) 发送的 CA 列表,.net 如何确定发送到客户端的内容?有没有办法修改该列表? 我是否需要发送用于在该 CA 列表中签署我的证书的链中的所有授权机构?或者 Root 就足够了?

我的代码两侧是否遗漏了某些内容?

任何帮助将不胜感激。 在


以下两条语句在客户端没有用(尽管它们不应该造成伤害):

socket.setNeedClientAuth(true);
socket.setWantClientAuth(true);

您看到证书请求消息和客户端证书消息这一事实表明服务器配置正确。

客户端证书消息中缺少证书的最可能原因是密钥库(在客户端)可能未正确配置。您可能感兴趣这个答案 https://stackoverflow.com/a/9300727/372643确保您的客户端密钥存储配置正确。更具体地说,您需要确保客户端证书的私钥是使用与证书链相同的别名导入的(并且该链返回到证书请求消息中公布的 CA)。

(关于你的问题的其余部分,我不知道如何修改服务器发送的CA列表时使用SslStream in C#. 之前的这个问题 https://stackoverflow.com/q/53824/372643似乎表明没有解决方案,尽管自提出这个问题以来,较新版本的 .Net 可能已经解决了该问题。我无法通过查看来找到任何可以做到这一点的东西SslStreamAPI文档和相关类,但这并不意味着它不存在。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.Net 和 Java 之间的 SSL 套接字,具有客户端身份验证 的相关文章

随机推荐