Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有SSL错误的Python3套接字编程?_Python_Sockets_Ssl - Fatal编程技术网

有SSL错误的Python3套接字编程?

有SSL错误的Python3套接字编程?,python,sockets,ssl,Python,Sockets,Ssl,我只是在学习Python套接字编程和安全网络的基础知识。我已经在我的网络上连接了两个VM,我想看看Wireshark中加密消息和非加密消息的区别。因此,我遵循这些教程,为我的服务器VM设置了一些openSSL证书,并将rootCA证书复制到我的客户端VM 以下是创建自签名证书所遵循的命令: openssl genrsa -des3 -out rootCA.key 4096 openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 10

我只是在学习Python套接字编程和安全网络的基础知识。我已经在我的网络上连接了两个VM,我想看看Wireshark中加密消息和非加密消息的区别。因此,我遵循这些教程,为我的服务器VM设置了一些openSSL证书,并将rootCA证书复制到我的客户端VM

以下是创建自签名证书所遵循的命令:

openssl genrsa -des3 -out rootCA.key 4096
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256
当它要求一个通用名称时,我给了它我服务器的IP,即172.25.1.5

但是,当我尝试运行服务器和客户端python脚本时,会出现以下错误:

$ python3 server.py 
what is host? 172.25.1.5
server bound.
server listening
Accepted conn from: ('172.25.1.4', 59592)
Traceback (most recent call last):
  File "server.py", line 32, in <module>
    connstream = context.wrap_socket(conn,server_side=True)
  File "/usr/lib/python3.6/ssl.py", line 407, in wrap_socket
    _context=self, _session=session)
  File "/usr/lib/python3.6/ssl.py", line 817, in __init__
    self.do_handshake()
  File "/usr/lib/python3.6/ssl.py", line 1077, in do_handshake
    self._sslobj.do_handshake()
  File "/usr/lib/python3.6/ssl.py", line 689, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: TLSV1_ALERT_UNKNOWN_CA] tlsv1 alert unknown ca (_ssl.c:852)
下面是我在不同VM上的客户端脚本:

import os, socket, ssl

# get context
context = ssl.SSLContext(ssl.PROTOCOL_TLS)
context.verify_mode = ssl.CERT_REQUIRED
context.check_hostname = True
context.load_verify_locations("rootCA.crt")
# define host and port
host = "172.25.1.5" #ip of linked clone
port = 1234

# make socket and connect to tuple host,port. Wrap socket in context
s = context.wrap_socket(socket.socket(socket.AF_INET),server_hostname=host)
s.connect((host,port))

cert = s.getpeercert()
print("What is cert? " +str(cert))
print("\n\n")
# get input
msg = input("out: ")

# Receive msg loop and send loop
while msg.lower().strip() != '':
    s.send(msg.encode())
    data = s.recv(1024).decode()

    print("In: " + data)

    msg = input("Out: ")

s.close()
我被卡住了。我已经确保我的代码遵循示例。我如何避免这些错误?有什么我遗漏的吗


任何帮助或解释都将不胜感激。我还在学习。

按照帕特里克·梅夫泽克在评论中的建议,我试着换了一行

context.load_cert_chain(certfile="server.crt",keyfile="server.key")

这很有效,这告诉我在创建server.crt和server.key时出现了一些问题。因此,我只是删除了服务器VM中的server.key、server.csr和server.crt,并使用

openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256
在重新创建它们之后,我可以使用server.crt和server.key作为certfile和keyfile

在server.crt上使用我的假CA设置,或者直接使用rootCA for SSL对我的消息进行加密,并且使用Wireshark也验证了这一点


我感谢大家的帮助,我希望这个答案能帮助其他在使用套接字编程和SSL时遇到这个问题的人。

按照Patrick Mevzek在评论中的建议,我试着改变思路

context.load_cert_chain(certfile="server.crt",keyfile="server.key")

这很有效,这告诉我在创建server.crt和server.key时出现了一些问题。因此,我只是删除了服务器VM中的server.key、server.csr和server.crt,并使用

openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256
在重新创建它们之后,我可以使用server.crt和server.key作为certfile和keyfile

在server.crt上使用我的假CA设置,或者直接使用rootCA for SSL对我的消息进行加密,并且使用Wireshark也验证了这一点


我感谢大家的帮助,我希望这个答案能够帮助其他在使用套接字编程和SSL时遇到此问题的人。

如果您只是尝试使用SSL并学习基础知识,那么您肯定不希望与客户端证书有任何关系。我只有服务器证书。客户机只能访问我用来创建服务器密钥和证书的自签名证书。我遵循的是一个教程,这是它的代码片段,解释说,如果我只有客户机将检查有效性的服务器证书,它应该可以工作。服务器不应检查客户端。请参阅,默认情况下,它是需要证书的,因此服务器将向客户端请求证书,然后它不知道签署此证书的CA,因此服务器端出现TLS CA错误,这意味着客户端报告的客户端证书未经验证。@JosephSible
Purpose.client\u AUTH
完全正常,请参阅。问题在于
verify\u mode
默认设置。如果您只是尝试使用SSL并学习基础知识,那么您肯定不希望与客户端证书有任何关系。我只有服务器证书。客户机只能访问我用来创建服务器密钥和证书的自签名证书。我遵循的是一个教程,这是它的代码片段,解释说,如果我只有客户机将检查有效性的服务器证书,它应该可以工作。服务器不应检查客户端。请参阅,默认情况下,它是需要证书的,因此服务器将向客户端请求证书,然后它不知道签署此证书的CA,因此服务器端出现TLS CA错误,这意味着客户端报告的客户端证书未经验证。@JosephSible
Purpose.client\u AUTH
完全正常,请参阅。问题在于
verify_mode
默认设置。
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256