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

2024-10-01 00:33:46 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,在我真正进入这篇文章之前,我要警告你,这可能不是一个容易的解决办法。无论是谁读过这篇文章并且能够回复这篇文章,他都必须知道很多c/c++,至少还有一些python,才能回答我上面的问题。在

基本上,我有一个来自Mumble(VOIP客户机)的连接方法,它连接到服务器并发送SSL证书用于身份验证。我还有一个Python脚本,它连接到同一个mumblevoip服务器,但是我不发送证书。在

我需要修改现有代码以发送证书,就像当前的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中):

^{pr2}$

秀。。。为了连接到需要证书的服务器,我需要对Python源代码做些什么?因为我的源代码当前可以很好地连接到任何一个requireRecert设置为false的mumble服务器。我需要它在所有服务器上工作,因为这将在我自己的服务器上使用(讽刺的是,它已经启用了requirecerts)

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

请尽快帮帮我!如果你需要更多信息,再给我留言。 去掉了所有无关的代码,现在只剩下处理ssl的代码。


Tags: 代码服务器if证书certsprefconst篇文章
1条回答
网友
1楼 · 发布于 2024-10-01 00:33:46

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

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

相关问题 更多 >