我目前正在关注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
我该怎么办?
谢谢
您的问题是,如果您的代码是在函数中声明的,而另一部分不是。”
通常,这不是很好的做法。
但是,如果您坚持要使用@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()。