首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python中复制证书身份验证(Mumble (c/c++))?

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

Stack Overflow用户
提问于 2010-08-11 05:18:12
回答 1查看 1.3K关注 0票数 1

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

基本上,我有一种连接方法,它连接到服务器,并将SSL证书发送给它以进行身份验证。我还有一个Python脚本,它连接到同一个Mumble服务器,但我不发送证书。

我需要修改我的现有代码以发送证书,就像当前的my客户端所做的那样。

--

下面是发送证书的C++代码:

代码语言:javascript
复制
    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中):

代码语言:javascript
复制
    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.的代码而已。

EN

回答 1

Stack Overflow用户

发布于 2010-11-21 19:59:35

从C++代码看来,您只需获得ssl支持,并与正确的认证文件协商,并使用正确的私钥加密有效负载。这些认证和私钥很可能存储在您的原始程序的某个地方。如果C++可能正在加载一些非标准的权限,那么您将需要找到将这些根权限放在您的python安装中的位置,或者确保python忽略了这些问题,这是不太安全的。

在python中,除了使用urllib之外,您还可以创建一个套接字,如上面所示。该库支持HTTPs,并提供证书和私钥。URLOpener

示例用法:

代码语言:javascript
复制
opener = urllib.URLopener(key_file = 'mykey.key', cert_file = 'mycert.cer')
self.socket = opener.open(url)

您可能需要通过适当的错误检查来使其更加健壮,但是希望这些信息能够帮助您解决问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3455472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档