加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 带有客户端身份验证的.Net和Java之间的SSL套接字

发布时间:2020-12-15 21:31:49 所属栏目:百科 来源:网络整理
导读:我正在尝试在.NET和 Java之间创建一个SSL套接字服务器/客户端.在这种情况下,我的SSL套接字服务器将在.net中运行,客户端在 Linux下以Java运行.我的问题是握手期间连接失败,特别是当服务器从客户端请求证书时,客户端无法发送回来的东西,连接失败. 在.net中我使
我正在尝试在.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
> ServerHello
>服务器发送公共证书
>客户端将公共证书与信任存储上的证书进行匹配
>服务器发送证书请求
>使用证书请求,服务器发送有效CA列表,在此列表中仅发送我的根CA(在其他众所周知的CA的长列表中).
>客户端证书为空.
>服务器从客户端收到空证书,从而关闭连接.

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

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

我在代码的两边都遗漏了什么吗?

任何帮助将不胜感激.

解决方法

以下两个语句在客户端是无用的(尽管它们不应该受到伤害):

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

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

在客户端证书消息中缺少证书的最可能原因是密钥库(在客户端)可能未正确配置.您可能对this answer感兴趣,以确保正确配置了客户端密钥库.更具体地说,您需要确保将客户端证书的私钥导入到与证书链相同的别名中(并且它是链回到证书请求消息中公布的CA).

(关于你的其余问题,我不确定在C#中使用SslStream时如何修改服务器发送的CA列表.This earlier question似乎表明没有解决方案,尽管.Net的新版本可能解决了这个问题因为这个问题被问到了.通过查看SslStream API文档和相关类,我找不到任何可以做到的事情,但这并不意味着它不存在.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读