Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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
我需要为Python w/SSL套接字连接分发什么(密钥、证书)?_Python_Ssl_Openssl_Pyopenssl - Fatal编程技术网

我需要为Python w/SSL套接字连接分发什么(密钥、证书)?

我需要为Python w/SSL套接字连接分发什么(密钥、证书)?,python,ssl,openssl,pyopenssl,Python,Ssl,Openssl,Pyopenssl,我正在尝试编写一个通用的服务器客户端应用程序,它将能够在服务器之间交换数据。 我已经阅读了很多OpenSSL文档,我已经成功地设置了自己的CA,并创建了一个用于测试的证书(和私钥) 我一直使用Python 2.3,因此无法使用标准的“ssl”库。相反,我坚持使用PyOpenSSL,这看起来并不坏,但是关于它的文档并不多 我的问题不是让它工作。我对证书和它们需要去哪里更困惑 以下是我的两个有效的程序: 服务器: #!/bin/env python from OpenSSL import SSL

我正在尝试编写一个通用的服务器客户端应用程序,它将能够在服务器之间交换数据。 我已经阅读了很多OpenSSL文档,我已经成功地设置了自己的CA,并创建了一个用于测试的证书(和私钥)

我一直使用Python 2.3,因此无法使用标准的“ssl”库。相反,我坚持使用PyOpenSSL,这看起来并不坏,但是关于它的文档并不多

我的问题不是让它工作。我对证书和它们需要去哪里更困惑

以下是我的两个有效的程序:

服务器:

#!/bin/env python

from OpenSSL import SSL
import socket
import pickle

def verify_cb(conn, cert, errnum, depth, ok):
    print('Got cert: %s' % cert.get_subject())
    return ok


ctx = SSL.Context(SSL.TLSv1_METHOD)
ctx.set_verify(SSL.VERIFY_PEER|SSL.VERIFY_FAIL_IF_NO_PEER_CERT, verify_cb)

# ??????
ctx.use_privatekey_file('./Dmgr-key.pem')
ctx.use_certificate_file('Dmgr-cert.pem')
# ??????
ctx.load_verify_locations('./CAcert.pem')

server = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))

server.bind(('', 50000))
server.listen(3)

a, b = server.accept()

c = a.recv(1024)
print(c)
from OpenSSL import SSL
import socket
import pickle


def verify_cb(conn, cert, errnum, depth, ok):
    print('Got cert: %s' % cert.get_subject())
    return ok

ctx = SSL.Context(SSL.TLSv1_METHOD)
ctx.set_verify(SSL.VERIFY_PEER, verify_cb)

# ??????????
ctx.use_privatekey_file('/home/justin/code/work/CA/private/Dmgr-key.pem')
ctx.use_certificate_file('/home/justin/code/work/CA/Dmgr-cert.pem')
# ?????????
ctx.load_verify_locations('/home/justin/code/work/CA/CAcert.pem')

sock = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
sock.connect(('10.0.0.3', 50000))

a = Tester(2, 2)
b = pickle.dumps(a)
sock.send("Hello, world")

sock.flush()
sock.send(b)
sock.shutdown()
sock.close()
客户端:

#!/bin/env python

from OpenSSL import SSL
import socket
import pickle

def verify_cb(conn, cert, errnum, depth, ok):
    print('Got cert: %s' % cert.get_subject())
    return ok


ctx = SSL.Context(SSL.TLSv1_METHOD)
ctx.set_verify(SSL.VERIFY_PEER|SSL.VERIFY_FAIL_IF_NO_PEER_CERT, verify_cb)

# ??????
ctx.use_privatekey_file('./Dmgr-key.pem')
ctx.use_certificate_file('Dmgr-cert.pem')
# ??????
ctx.load_verify_locations('./CAcert.pem')

server = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))

server.bind(('', 50000))
server.listen(3)

a, b = server.accept()

c = a.recv(1024)
print(c)
from OpenSSL import SSL
import socket
import pickle


def verify_cb(conn, cert, errnum, depth, ok):
    print('Got cert: %s' % cert.get_subject())
    return ok

ctx = SSL.Context(SSL.TLSv1_METHOD)
ctx.set_verify(SSL.VERIFY_PEER, verify_cb)

# ??????????
ctx.use_privatekey_file('/home/justin/code/work/CA/private/Dmgr-key.pem')
ctx.use_certificate_file('/home/justin/code/work/CA/Dmgr-cert.pem')
# ?????????
ctx.load_verify_locations('/home/justin/code/work/CA/CAcert.pem')

sock = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
sock.connect(('10.0.0.3', 50000))

a = Tester(2, 2)
b = pickle.dumps(a)
sock.send("Hello, world")

sock.flush()
sock.send(b)
sock.shutdown()
sock.close()
我发现这些信息包含一些示例脚本

您可能会发现,我不完全理解“#?????”之间的部分。我不明白为什么客户端和服务器上都需要证书和私钥。我不确定每个密钥应该放在哪里,但我是否应该只分发密钥的一部分(可能是公共部分)?如果在每台服务器上仍然需要这两个密钥,那么它就破坏了使用非对称密钥的目的,对吗

我尝试交替删除任一框上的pkey或cert,但无论删除哪个框,都会出现以下错误:

OpenSSL.SSL.Error:[(“SSL例程”、“SSL3_读取字节”、“sslv3警报握手失败”)、(“SSL例程”、“SSL3_写入字节”、“SSL握手失败”)]

有人能解释一下这是否是SSL的预期行为吗。我真的需要将私钥和公共证书分发给我的所有客户吗? 我正在努力避免任何重大的安全问题,私钥泄漏往往是一个大问题

谢谢你的帮助

==================================================================

谢谢caf帮我解决了这个问题。根据他的建议,我创建了两个新的证书对:spaceman和dmgr。然后,我将两个“spaceman”部分(key,cert)都放在客户机程序中,“dmgr”密钥也是如此

基本上,只有客户机中的以下两行内容发生了更改,尽管openssl也有大量的工作要做

ctx.use_privatekey_file('/home/justin/code/work/CA/private/Dmgr-key.pem')
ctx.use_certificate_file('/home/justin/code/work/CA/Dmgr-cert.pem')
更正版本:

ctx.use_privatekey_file('/home/justin/code/work/CA/private/spaceman-key.pem')
ctx.use_certificate_file('/home/justin/code/work/CA/spacemancert.pem')

在SSL事务中,每一方都可以向另一方提供证书以验证其身份。为此,它需要具有与该证书对应的私钥。这些证书是两个不同的证书,因此每一方都有两个不同的私钥

此证书/私钥对是您正在使用
use\u privatekey\u file()
use\u certificate\u file()
设置的证书/私钥对。这应该是服务器和客户端上不同的证书/密钥对

验证对等方证书时,您需要检查:

  • 证书有效(即,由您信任的CA签署,未过期、未撤销);及
  • 对应于您认为连接到的对等方(即,证书与对等方声明的身份匹配)。此标识存储在证书的
    SubjectName
    字段中,并且它是特定于应用程序的如何将其映射到对等标识(可能是用户登录名、DNS名称或其他名称)

在SSL事务中,每一方都可以向另一方提供证书以验证其身份。为此,它需要具有与该证书对应的私钥。这些证书是两个不同的证书,因此每一方都有两个不同的私钥

此证书/私钥对是您正在使用
use\u privatekey\u file()
use\u certificate\u file()
设置的证书/私钥对。这应该是服务器和客户端上不同的证书/密钥对

验证对等方证书时,您需要检查:

  • 证书有效(即,由您信任的CA签署,未过期、未撤销);及
  • 对应于您认为连接到的对等方(即,证书与对等方声明的身份匹配)。此标识存储在证书的
    SubjectName
    字段中,并且它是特定于应用程序的如何将其映射到对等标识(可能是用户登录名、DNS名称或其他名称)

非常感谢caf。我认为SSL更像SSH密钥。我忘记了SSL的全部思想是不需要预先分发密钥,只需要根CA。不需要将我的公钥或私钥复制到其他服务器。我的程序早些时候工作的原因与计算机之间的匹配密钥无关,而是在两个“验证”函数中匹配密钥(公共密钥和私有密钥)。请参阅上面更正的代码。非常感谢caf。我认为SSL更像SSH密钥。我忘记了SSL的全部思想是不需要预先分发密钥,只需要根CA。不需要将我的公钥或私钥复制到其他服务器。我的程序早些时候工作的原因与计算机之间的匹配密钥无关,而是在两个“验证”函数中匹配密钥(公共密钥和私有密钥)。请参阅上面更正的代码。我在相同的(ssl握手失败)问题上遇到了问题。你能确切地告诉我你的每个pem文件是什么吗。因为我有:1)client.key只包含客户端的私钥。(我在使用中使用的这个\u privatekey_文件)2)ca.crt在a块中只有ca的证书,以===开始证书===结束证书===3)client.crt,它将整个证书作为客户端公用名、状态信息。。。。然后是另一个随机字符块我在同一件事上遇到了麻烦(ssl握手失败)