gpt4 book ai didi

c++ - 如何在 Python 中复制证书身份验证 (Mumble (c/c++))?

转载 作者:太空宇宙 更新时间:2023-11-04 14:26:38 29 4
gpt4 key购买 nike

好吧,在我真正开始这篇文章之前,我必须警告你,这可能不是一个简单的解决方法。阅读并能够回复这篇文章的人必须了解很多 c/c++,并且至少了解一些 python 才能回答我上面的问题。

基本上,我有一种来自 Mumble(VOIP 客户端)的连接方法,它连接到服务器并向其发送 SSL 证书以进行身份​​验证。我还有一个连接到同一个 Mumble VOIP 服务器的 Python 脚本,但我没有发送证书。

我需要像当前的 Mumble 客户端一样修改现有代码以发送证书。

--

这是似乎发送证书的 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 的任何 mumble 服务器。我需要它在所有服务器上工作,因为这将在我自己的服务器上使用(具有讽刺意味的是,已经打开 requirecerts。)

我可以将证书预生成为 .p12 或 w/e 类型的文件,因此我不需要程序来生成证书。我只需要它按照服务器的要求发送证书(就像我发布的 C++ 中所做的那样)。

请尽快帮助我!如果您需要更多信息,请再次给我发消息。去掉了所有不相关的代码,现在只有处理 ssl 的代码。

最佳答案

从 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)

您可能需要通过适当的错误检查等使其更加健壮,但希望此信息能帮助您。

关于c++ - 如何在 Python 中复制证书身份验证 (Mumble (c/c++))?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3455472/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com