为了账号安全,请及时绑定邮箱和手机立即绑定

没有客户端身份验证的SSL连接失败

没有客户端身份验证的SSL连接失败

C#
Cats萌萌 2021-05-04 13:20:55
我读到客户端身份验证是可选的,因此我尝试连接到我的SSL服务器而不在客户端进行身份验证。当我这样做时,我在服务器上收到以下错误:, in accept_connection    ssl_version=ssl.PROTOCOL_SSLv23  File "/usr/lib/python2.7/ssl.py", line 933, in wrap_socket    ciphers=ciphers)  File "/usr/lib/python2.7/ssl.py", line 601, in __init__    self.do_handshake()  File "/usr/lib/python2.7/ssl.py", line 830, in do_handshake    self._sslobj.do_handshake()SSLEOFError: EOF occurred in violation of protocol (_ssl.c:590)这是工作中的服务器和客户端代码,当我在客户端上进行身份验证时,一切正常,但是当我注释掉该行时,就会显示错误。服务器(python):def accept_connection(self, sock):    client, (addr, port) = sock.accept()    sslclient = ssl.wrap_socket(        client,        server_side=True,        certfile=self.ssl_cert_file,        keyfile=self.ssl_key_file,        ssl_version=ssl.PROTOCOL_SSLv23    )客户端(C#):public bool Connect()    {        try        {            client = new TcpClient(this.ServerAddress, this.ServerPort);            sslStream = new SslStream(                client.GetStream(),                false,                new RemoteCertificateValidationCallback(ValidateCert),                null            );            try            {                sslStream.AuthenticateAsClient(this.ServerAddress);            }            catch (AuthenticationException e)            {                sslStream = null;                client.Close();                client = null;                return false;            }        }        catch (Exception e)        {            return false;        }        return true;    }以上是没有错误的工作代码。当我在客户端上注释掉以下代码时://sslStream.AuthenticateAsClient(this.ServerAddress);上面提到的python错误出现了,并且客户端连接不会引发任何异常,并且会继续运行直到第一次读取,然后失败,并显示以下信息:This operation is only allowed using a successfully authenticated context.如果我不打电话AuthenticateAsClient怎么办?这就是我生成certfile和keyfile的方式openssl req -x509 -newkey rsa:1024 -keyout my.key -out my.crt -days 365 -nodes -subj "/C=US/ST=VA/L=Junk/O=None/OU=Junk/CN=example.local"Python是版本2。也许我只是被误导了对的调用AuthenticateAsClient是可选的?
查看完整描述

1 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

SSL客户端证书身份验证确实是可选的。客户端将其证书发送到服务器,然后服务器验证该证书是否有效,服务器期望的时间以及使用该证书对客户端进行身份验证的时间。

但是,这不是由

sslStream.AuthenticateAsClient(this.ServerAddress);

如文档所述,此方法是

客户端调用以认证服务器,并可选地通过客户端-服务器连接对客户端进行身份验证

在ssl握手过程中,必须对服务器进行身份验证(验证其证书是否有效,是否已为预期的域颁发,是否由受信任的权威机构颁发)。例如,使用此链接的描述,我们看到第3步是:

SSL或TLS客户端验证服务器的数字证书

服务器等待客户端执行此步骤的结果。因此,如果您通过注释调用来跳过此步骤,则您AuthenticateAsClient的python服务器正确地抱怨协议违规。

要使用客户端身份验证,您将使用另一个重载:

X509CertificateCollection clientCerts = GetClientCerts();
sslStream.AuthenticateAsClient(this.ServerAddress, clientCerts, true);

由于您未执行此操作-您未在执行(可选)客户端身份验证。


查看完整回答
反对 回复 2021-05-15
  • 1 回答
  • 0 关注
  • 372 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信