Nhìn vào nguồn, ssl.wrap_socket gọi trực tiếp vào mã nguồn gốc (openssl) function SSL_CTX_use_cert_chain_file yêu cầu đường dẫn đến tệp, vì vậy những gì bạn đang cố gắng làm là không thể.
Để tham khảo:
Trong ssl/init py chúng ta thấy:
def wrap_socket(sock, keyfile=None, certfile=None,
server_side=False, cert_reqs=CERT_NONE,
ssl_version=PROTOCOL_SSLv23, ca_certs=None,
do_handshake_on_connect=True):
return SSLSocket(sock, keyfile=keyfile, certfile=certfile,
server_side=server_side, cert_reqs=cert_reqs,
ssl_version=ssl_version, ca_certs=ca_certs,
do_handshake_on_connect=do_handshake_on_connect)
điểm chúng ta đến constructor SSLSocket (đó là trong cùng một tập tin) và chúng ta thấy những điều sau đây xảy ra:
self._sslobj = _ssl2.sslwrap(self._sock, server_side,
keyfile, certfile,
cert_reqs, ssl_version, ca_certs)
_ssl2 được thực hiện trong C (_ssl2.c)
Nhìn vào chức năng sslwrap, chúng ta thấy nó tạo ra một đối tượng mới:
return (PyObject *) newPySSLObject(Sock, key_file, cert_file,
server_side, verification_mode,
protocol, cacerts_file);
Nhìn vào các nhà xây dựng cho đối tượng đó, chúng tôi cuối cùng đã nhìn thấy:
ret = SSL_CTX_use_certificate_chain_file(self->ctx,
cert_file);
Đó là chức năng được định nghĩa trong openssl, vì vậy bây giờ chúng ta cần chuyển sang codebase đó.
Trong ssl/ssl_rsa.c chúng tôi cuối cùng đã tìm thấy trong chức năng:
BIO_read_filename(in,file)
Nếu bạn đào đủ xa vào mã BIO (một phần của openssl), bạn cuối cùng sẽ đi đến một fopen bình thường():
fp=fopen(ptr,p);
Vì vậy, có vẻ như nó đang được viết. Nó phải ở trong một tập tin có thể mở được bằng fopen của C().
Ngoài ra, vì thư viện ssl của python nhanh chóng nhảy vào C, tôi không thấy một vị trí rõ ràng ngay lập tức để monkeypatch trong một workaround hoặc.
Chắc chắn môi trường máy chủ lưu trữ của bạn cho phép bạn lưu trữ chứng chỉ SSL, bằng cách nào đó? ngay cả khi họ muốn tự cung cấp cho họ. – EJP
Tôi đã lưu dữ liệu chứng chỉ trong mysql. mã của tôi cần một ổ cắm ssl đến một máy chủ khác để lấy dữ liệu. Tôi đọc chứng chỉ từ cơ sở dữ liệu, nhưng không biết cách tạo gói ssl. – kaala
Nhìn vào nguồn, ssl.wrap_socket gọi trực tiếp vào mã nguồn gốc (openssl) function SSL_CTX_use_cert_chain_file yêu cầu đường dẫn đến một tệp, vì vậy những gì bạn đang cố gắng làm là không thể. Bạn cần phải ghi chứng chỉ vào một tệp để thao tác này hoạt động. – cnelson