我正在尝试编写一个通用的服务器-客户机应用程序,它可以在服务器之间交换数据。我已经阅读了很多OpenSSL文档,并且成功地设置了自己的CA,并为测试目的创建了一个证书(和私钥)。
我只能使用Python2.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()
我从ftp://ftp.pbone.net/mirror/ftp.pld-linux.org/dists/2.0/PLD/i586/PLD/RPMS/python-pyOpenSSL-examples-0.6-2.i586.rpm中找到了这个信息,其中包含一些示例脚本。
正如你可能会发现的,我不完全理解“#?”之间的章节。我不明白为什么客户端和服务器都需要证书和私钥。我不知道每个人应该去哪里,但我不应该只分配密钥的一部分(可能是公共部分)吗?如果您仍然需要在每台服务器上同时使用非对称密钥,这就破坏了不对称密钥的目的,对吗?
我尝试交替移除任一框上的pkey或cert,无论删除哪一个,我都会得到以下错误:
OpenSSL.SSL.Error:('SSL例程‘,'ssl _3_READ_字节’,‘ssl警报握手失败’),('SSL例程‘,’ssl_3_写_字节‘,’ssl握手失败‘)
有人能解释一下这是否是SSL的预期行为吗?我真的需要向我的所有客户分发私钥和公共证书吗?我在努力避免任何巨大的安全问题,而泄露私钥往往是个大问题.
谢谢你的帮助!
==================================================================
感谢咖啡馆帮我解决了这个问题。根据他的推荐,我创建了两个新的证书对: spaceman和dmgr。然后,我将两个"spaceman“部分(key,cert)放在客户端程序中,对于"dmgr”键则是相同的。
基本上,Client中只有以下两行进行了更改,尽管使用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')
发布于 2011-01-05 20:51:04
在SSL事务中,每一方都可以向另一方提交一个验证其身份的证书。为此,它需要有与该证书相对应的私钥。这些证书是两种不同的证书,因此每一方都有两个不同的私钥。
此证书/私钥对是使用use_privatekey_file()
和use_certificate_file()
设置的。这应该是服务器和客户端上的不同的证书/密钥对。
在验证对等证书时,您需要检查:
SubjectName
字段中,并且它是特定于应用程序的如何将其映射到对等身份(可能是用户登录名、DNS名称或其他东西)。https://stackoverflow.com/questions/4609859
复制