Хорошо, прежде чем я действительно зайду в этот пост, я должен предупредить вас, что это может быть нелегко исправить.Кто бы ни читал и мог ответить на этот пост, он должен знать много языка c / c ++ и, по крайней мере, немного Python, чтобы иметь возможность ответить на мой вопрос.
По сути, у меня есть метод подключения от Mumble(VOIP-клиент), который подключается к серверу и отправляет ему сертификат SSL для проверки подлинности.У меня также есть сценарий Python, который подключается к тому же серверу Mumble VOIP, но я не отправляю сертификат.
Мне нужно изменить существующий код для отправки сертификата, как это делает текущий клиент 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 для подключения к серверам, которые требуютсертификат?Потому что мой источник в настоящее время прекрасно подключается к любому серверу mumble, для которого requirecert имеет значение false.Мне нужно, чтобы он работал на всех серверах, так как он будет использоваться на моем собственном сервере (который, как ни странно, на нем есть requirecerts.)
Я могу предварительно сгенерировать сертификат как файл типа .p12 или w / eпоэтому мне не нужна программа для генерации сертификата.Мне просто нужно отправить сертификат, как того хочет сервер (как это сделано в опубликованном мною c ++).
Пожалуйста, помогите мне очень скоро!Если вам нужна дополнительная информация, напишите мне снова. Удалил весь нерелевантный код, теперь это просто код, который имеет дело с ssl.