SSL证书中的Python检查主机名有效

问题描述 投票:0回答:1

我目前正在关注SanSS关于验证SSL证书的博客。

我在另一篇文章的下面有代码:Python SSL certificate check hostname according to common name

from OpenSSL import SSL
from socket import socket

context = SSL.Context(SSL.TLSv1_METHOD) 
context.set_options(SSL.OP_NO_SSLv2)
context.set_verify(SSL.VERIFY_NONE, callback)
context.load_verify_locations(ca_file, ca_path)

host = "google.com"
port = 443  
sock = socket()
ssl_sock = SSL.Connection(context, sock)
ssl_sock.connect((host, port))
ssl_sock.do_handshake()

def callback(self, conn, certificate, err, depth, valid):
    if err == 62:
        print("Hostname mismatch!")

我收到一条错误消息,指出“ NameError:未定义名称'callback'”,即使它是。

我希望使此主机名验证工具动态化,允许用户输入主机并在命令行中发布

例如

py sslverification.py google.com 443

我该怎么办?

谢谢

python ssl openssl verification hostname
1个回答
0
投票

您的问题是,如果您的代码是在函数中声明的,而另一部分不是。”

通常,这不是很好的做法。

但是,如果您坚持要使用@Albin Paul的建议并在使用该函数之前先声明该函数。

但是,我将按照以下内容做更多:

from OpenSSL import SSL
from socket import socket

def main():
    context = SSL.Context(SSL.TLSv1_METHOD) 
    context.set_options(SSL.OP_NO_SSLv2)
    context.set_verify(SSL.VERIFY_NONE, callback)
    context.load_verify_locations(ca_file, ca_path)

    host = "google.com"
    port = 443  
    sock = socket()
    ssl_sock = SSL.Connection(context, sock)
    ssl_sock.connect((host, port))
    ssl_sock.do_handshake()

def callback(self, conn, certificate, err, depth, valid):
    if err == 62:
        print("Hostname mismatch!")

if __name__ == "__main__":
    main()

原因。

如果您的代码是这样编写的,则您知道它在导入期间几乎没有执行任何代码,并且您随时可以调用main()。

© www.soinside.com 2019 - 2024. All rights reserved.