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

标签 c++ python ssl ssl-certificate voip

好吧,在我真正开始这篇文章之前,我必须警告你,这可能不是一个简单的解决方法。阅读并能够回复这篇文章的人必须了解很多 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/

相关文章:

python - matplotlib NaN 与 pylab NaN 的对比

python - 如何使用 Python 正确提供 json 数据?

ssl - 每个 Camel+Jetty 路由使用不同的 SSL 证书

laravel - 代理通行证 : Mixed Content in Laravel HTTPS

redirect - Nginx 万维网。到非 www。重定向不工作

c++ - 使用 Allegro 库播放任何类型的视频文件的典型示例是什么?

c++ - C++ 中 64 位整数的按位 (Bitshift) 运算

python - 我应该如何使用 twisted 组织多连接客户端?

c++ - 使用命令行参数进行调试时,Visual Studio C++ 抛出异常 : read access violation.

c++ - 我可以强制 g++ 在堆栈上传递 float 参数吗?