【问题标题】:_ssl.c:777 sslv3 alert certificate unknown in ftplib program_ssl.c:777 sslv3 警报证书在 ftplib 程序中未知
【发布时间】:2020-07-26 13:55:04
【问题描述】:

我正在尝试使用 ftplib 模块在 ftps 连接上实现相互身份验证。

这是我的代码:

Context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
Context.load_verify_locations(cafile=trusted.txt,capath=path)

Context.load_cert_chain(certfile=mycert.txt,keyfile=mikey.txt,password=xxxx)

Context.verify_mode=True

Ftp = ftplib.FTP_TLS(Context=Context)

Ftp.connect(host, port)

Ftp.auth()

Ftp.prot_p()

Ftp.set_pasv(True)

Ftp.cwd(dest_dir)

Ftp.storlines(xx,xx)

Ftp.close()

但是,只有在 ftps 服务器端将客户端身份验证设置为 no 时,上述方法才能正常工作。当我们尝试使用客户端身份验证时是的

错误码如下。

Ssl.SSLError: [SSL:SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 alert certificate unknown (_ssl.c:777)

我在 ca 文件中定义了服务器证书链。 我在服务器端定义了我的信任。 仍然无法正常连接。如果在服务器端禁用客户端身份验证,它会很好地工作。

关于可能出错的任何建议。会不会是密码? 我尝试设置密码,但不知道实时交换是如何发生的。或者这可能是 ftplib 根本不支持完全相互身份验证?

【问题讨论】:

    标签: python ssl ftplib mutual-authentication


    【解决方案1】:

    Ssl.SSLError: [SSL:SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 警报证书未知 (_ssl.c:777)

    如果您在客户端收到此错误,则服务器无法验证客户端证书,即您的 mycert.txtmikey.txt

    由于客户端证书的验证是由服务器完成的,因此您必须查看服务器配置和日志以获取有关您的客户端证书不被接受的原因的更多信息。典型的问题是客户端证书是自签名证书,颁发客户端证书的 CA 在服务器中不受信任,或者需要中间证书来验证证书,但客户端没有发送这些证书。

    【讨论】:

    • 感谢 Steffen,我检查了服务器配置,表明客户端证书不受信任。虽然受信任的存在于服务器上。
    • 是因为密码不匹配?有没有办法在客户端获取更多调试日志或我能做些什么来弄清楚?我可以在 mycert 上包含 priv key 和 cert 并尝试吗?这可能是因为密钥格式吗?因为它适用于自签名证书之一。此自签名证书看起来确实具有不同的密钥格式,即** BEGINNING CERT 和 END CERTIFICATE 之后没有换行符。
    • @Sy-py:证书验证与密码无关。它也与证书的格式无关 - 只有当客户首先可以使用证书(它可以)或不使用(这将导致其他错误)时才相关。确保服务器信任颁发客户端证书的 CA,并且所有必要的中间证书都由客户端发送。
    猜你喜欢
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 2020-05-13
    • 1970-01-01
    • 2020-12-05
    相关资源
    最近更新 更多