有没有人能解释一下这个针对SSL证书的回调函数? [英] Can someone explain this callback function for SSL certificates?
问题描述
如果这不是正确的SO(信息安全或加密),我立即道歉。无论如何,我正在尝试找出如何在Python中验证SSL证书客户端。我发现了一个回调函数here,它看起来与我在网上看到的其他函数相似。然而,在我的代码中,我不确定它是如何工作的(或者为什么,实际上)。当我运行我的代码时,它似乎可以工作,但是为什么(在PyCharm中)前四个参数是灰色的,而只有第五个参数是白色的?是否有方法可以使用此回调函数来检查特定的证书错误?
这是我运行它时的输出
Certs are fine
Certs are fine
Certs are fine
b'HTTP/1.1 200 OK
Date: Tue, 12 Apr 2016...etc
我假设"证书都很好"的每一行都在验证链中的每个证书?
import socket
from OpenSSL import SSL
HOST = "www.google.com"
PORT = 443
def verify_callback(connection, x509, errnum, errdepth, ok):
if not ok:
print("Bad Certs")
else:
print("Certs are fine")
return ok
context = SSL.Context(SSL.TLSv1_2_METHOD)
context.load_verify_locations("cacerts.pem")
context.set_options(SSL.OP_NO_SSLv2)
context.set_verify(SSL.VERIFY_PEER | SSL.VERIFY_FAIL_IF_NO_PEER_CERT, verify_callback)
# create socket and connect to server
sock = socket.socket()
sock = SSL.Connection(context, sock)
sock.connect((HOST, PORT))
sock.do_handshake()
sock.sendall("GET / HTTP/1.1
")
openssl
推荐答案上的pyOpenSSL docs非常稀疏,但此函数是对相应openssl函数的包装,其文档是much better。
VERIFY_CALLBACK函数用于控制设置了SSL_VERIFY_PEER标志时的行为。它必须由应用程序提供并接收两个参数:PREVERIFY_OK表示相关证书的验证是否已通过(PREVERIFY_OK=1)或(PREVERIFY_OK=0)。X509_ctx是指向用于证书链验证的完整上下文的指针。
将从最深嵌套级别(根CA证书)开始检查证书链,并向上检查对等方的证书。在每个级别都会检查签名和颁发者属性。每当发现验证错误时,错误号都存储在x509_ctx中,并在preify_ok=0的情况下调用Verify_Callback。通过应用X509_CTX_STORE_*函数,VERIFY_CALLBACK可以定位有问题的证书并执行其他步骤(请参见示例)。如果未发现证书错误,则在进入下一级别之前,将使用preify_ok=1调用VERIFY_CALLBACK。VERIFY_CALLBACK的返回值控制进一步验证过程的策略。如果VERIFY_CALLBACK返回0,则验证过程立即停止,并显示&Quot;验证失败&Quot;状态。如果设置了SSL_VERIFY_PEER,则向对等设备发送验证失败警报,并终止TLS/SSL握手。如果VERIFY_CALLBACK返回1,则验证过程继续。如果VERIFY_CALLBACK始终返回1,则TLS/SSL握手将不会因验证失败而终止,并且将建立连接。但是,调用进程可以使用SSL_GET_VERIFY_RESULT(3)或通过维护由VERIFY_CALLBACK管理的自己的错误存储来检索上次验证错误的错误代码。
如果未指定VERIFY_CALLBACK,将使用默认回调。其返回值与PREVERIFY_OK相同,因此,如果设置了SSL_VERIFY_PEER,则任何验证失败都将导致TLS/SSL握手终止并显示一条警报消息。
文档还具有一个解释良好的示例验证功能,用于检查被验证的链是否太长。如果链太长,则记录错误,然后根据用户设置的值,回调要么返回0以导致验证失败,要么返回1(即忽略错误并无论如何进行验证)。
此外,this blog post有一个pyOpenSSL示例,它只检查几个特定的错误,并在出现错误时使验证失败。
这篇关于有没有人能解释一下这个针对SSL证书的回调函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!