有没有人能解释一下这个针对SSL证书的回调函数? [英] Can someone explain this callback function for SSL certificates?

查看:9
本文介绍了有没有人能解释一下这个针对SSL证书的回调函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果这不是正确的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆