在Python的OpenSSL
库中,verify_cb
方法用于验证服务器证书的有效性。如果使用了VERIFY_CB
回调函数,服务器证书将包含一个verify_callback
函数参数。你可以使用此回调函数在验证过程中返回一些额外的标识信息,以便在客户端和连接的套接字之间建立关联。
以下是一个例子,展示如何在pyOpenSSL库中使用verify_cb
方法,将ssl证书
中的CN
(Common Name
,即证书颁发给的一个或多个域名)与生成的套接字对应起来。首先,导入必要的库:
import OpenSSL
from OpenSSL.SSL import Context
from OpenSSL.SSL import Connection, SSLv23_METHOD
from OpenSSL.SSL import VERIFY_CLIENT_ONCE
from OpenSSL.crypto import X509Chain
接下来创建一个ssl_context
对象,它包含我们想要的连接相关的设置:
# CA证书路径(路径中请包含完整文件名)
ca_certificate_path = '/path/to/ca/certificate/full_chain.pem'
# 创建SSL上下文
ssl_context = Context(SSLv23_METHOD)
ssl_context.set_tls_ver_server(OpenSSL.SSL.TLSv1_2_METHOD)
ssl_context.set_cafile(ca_certificate_path)
我们想要使用verify_cb
方法将服务器证书与相应的套接字关联起来。所以,实现一个callback
函数:
def ssl_verify_callback(conn, x509, depth, errnum, callback_arg):
"""此回调函数将在证书有效时调用。在此函数中,您可以解析证书并查找所需的字段。
对于您的问题,您想将客户端的CN与连接的套接字关联起来。
Args:
:param conn: 将要使用的连接对象
:param x509: 待处理的证书
:param depth: 证书链中的深度(即证书的层次结构)
:param errnum: 当前验证错误的数字编号
:param callback_arg: 与回调调用的实例相关的参数
:return: None (您可以通过返回适当的值来执行其他操作)
"""
# 存储服务器证书CN
cn = x509.get_subject().commonName
# 连接的套接字
sock = callback_arg
# 将客户端证书的CN和生成的套接字关联起来
associated_socket = sock.get_context()
associated_socket.set_verify(context.VERIFY_PEER, verify_cb)
associated_socket.set_allow_unsigned_peer_cert(True)
associated_socket.set_issuer(x509.get_issuer())
associated_socket.set_subject(x509.get_subject())
associated_socket.set_subject_name(x509.get_subject_name())
associated_socket.set_issuer_name(x509.get_issuer_name())
associated_socket.set_psk_identity(cn)
associated_socket.set_psk(cn, "password")
# 如果所有操作都能正常执行,则此回调函数正常工作。返回None以不中断客户端连接
return None
# 使用给定的CA路径设置证书验证回调
verify_cb = ssl_verify_callback
然后使用生成的客户端身份与服务器连接:
# 连接到服务器
sock = Connection((hostname, port), ssl_context, verify_callback)
这个代码示例将创建一个CallbackVerify
对象和AssociatedSocket
对象来进行套接字的验证和关联。请注意,您需要替换代码中的ca_certificate_path
值,以指向适合您的实际情况的CA证书路径。
领取专属 10元无门槛券
手把手带您无忧上云