好吧,在我真正进入这篇文章之前,我必须警告你,这可能不是一个容易的解决办法。无论谁阅读并能够回复这篇文章,都必须了解大量的c/c++,并且至少有一些python能够回答我上面的问题。
基本上,我有一种连接方法,它连接到服务器,并将SSL证书发送给它以进行身份验证。我还有一个Python脚本,它连接到同一个Mumble服务器,但我不发送证书。
我需要修改我的现有代码以发送证书,就像当前的my客户端所做的那样。
--
下面是发送证书的C++代码:
ServerHandler::ServerHandler() {
MumbleSSL::addSystemCA();
{
QList<QSslCipher> pref;
foreach(QSslCipher c, QSslSocket::defaultCiphers()) {
if (c.usedBits() < 128)
continue;
pref << c;
}
if (pref.isEmpty())
qFatal("No ciphers of at least 128 bit found");
QSslSocket::setDefaultCiphers(pref);
}
void ServerHandler::run() {
qbaDigest = QByteArray();
QSslSocket *qtsSock = new QSslSocket(this);
qtsSock->setPrivateKey(g.s.kpCertificate.second);
qtsSock->setLocalCertificate(g.s.kpCertificate.first.at(0));
QList<QSslCertificate> certs = qtsSock->caCertificates();
certs << g.s.kpCertificate.first;
qtsSock->setCaCertificates(certs);
cConnection = ConnectionPtr(new Connection(this, qtsSock));
qtsSock->setProtocol(QSsl::TlsV1);
qtsSock->connectToHostEncrypted(qsHostName, usPort);
void ServerHandler::serverConnectionConnected() {
tConnectionTimeoutTimer->stop();
qscCert = cConnection->peerCertificateChain();
qscCipher = cConnection->sessionCipher();
if (! qscCert.isEmpty()) {
const QSslCertificate &qsc = qscCert.last();
qbaDigest = sha1(qsc.publicKey().toDer());
bUdp = Database::getUdp(qbaDigest);
} else {
bUdp = true;
}
QStringList tokens = Database::getTokens(qbaDigest);
foreach(const QString &qs, tokens)
mpa.add_tokens(u8(qs));
QMap<int, CELTCodec *>::const_iterator i;
for (i=g.qmCodecs.constBegin(); i != g.qmCodecs.constEnd(); ++i)
mpa.add_celt_versions(i.key());
sendMessage(mpa);--
唉,我现在就是这么连接到它的(在python中):
try:
self.socket.connect(self.host)
except:
print self.threadName,"Couldn't connect to server"
return
self.socket.setblocking(0)
print self.threadName,"connected to server"--
苏..。要连接到需要证书的服务器,我需要对Python源代码做更多的事情吗?因为我的源当前很好地连接到任何含糊的服务器,并将requirecert设置为false。我需要它在所有服务器上工作,因为这将在我自己的服务器上使用(具有讽刺意味的是,它已经启动了请求服务器)。
我可以将证书预生成为.p12或w/e类型文件,因此我不需要程序来生成证书。我只需要它发送证书,就像服务器想要的那样(正如我发布的c++中所做的那样)。
请尽快帮我!如果你需要更多信息,再给我留言。去掉了所有无关的代码,现在只是处理ssl.的代码而已。
发布于 2010-11-21 19:59:35
从C++代码看来,您只需获得ssl支持,并与正确的认证文件协商,并使用正确的私钥加密有效负载。这些认证和私钥很可能存储在您的原始程序的某个地方。如果C++可能正在加载一些非标准的权限,那么您将需要找到将这些根权限放在您的python安装中的位置,或者确保python忽略了这些问题,这是不太安全的。
在python中,除了使用urllib之外,您还可以创建一个套接字,如上面所示。该库支持HTTPs,并提供证书和私钥。URLOpener
示例用法:
opener = urllib.URLopener(key_file = 'mykey.key', cert_file = 'mycert.cer')
self.socket = opener.open(url)您可能需要通过适当的错误检查来使其更加健壮,但是希望这些信息能够帮助您解决问题。
https://stackoverflow.com/questions/3455472
复制相似问题