[Interest] SslServer issues
Francesco Lamonica
alienpenguin at gmail.com
Wed Feb 27 10:35:45 CET 2013
Hello Rich,
thanks for your answer
i'll add a bit of code to make things clearer :)
Upon connection the socket fires onSslErrors() SLOT and there i see the
"untrusted / self-signed cert" error message.
In the slot i never siwtch to the codepaths where ignoreSslErrors() is
invoked.
Can you point me what i am doing wrong?
thanks
/*!
\brief we overload the virtual QTcpServer::incomingConnection(int) method
in order to start the SSL Encryption
*/
void
SslServer::incomingConnection(int socketDescriptor)
{
//qDebug() << "############### server reports ssl socket on descriptor:
" << socketDescriptor;
QSslSocket *serverSocket = new QSslSocket;
qDebug() << "using ssl socket at address " << serverSocket;
if (serverSocket->setSocketDescriptor(socketDescriptor)) {
qDebug() << "Incoming connection from " <<
serverSocket->peerAddress().toString() << ":" << serverSocket->peerPort();
connect(serverSocket, SIGNAL(encrypted()), this, SLOT(ready()));
connect(serverSocket,
SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(onTcpError(QAbstractSocket::SocketError)));
connect(serverSocket,
SIGNAL(sslErrors(QList<QSslError>)),this,SLOT(onSslErrors(QList<QSslError>)));
serverSocket->setLocalCertificate(m_ServerConfig.certfile, QSsl::Pem);
serverSocket->setPrivateKey(m_ServerConfig.keyfile, QSsl::Rsa,
QSsl::Pem, "srv_certificate");
if(!serverSocket->localCertificate().isValid()) {
*m_flogger << UNQL::LOG_CRITICAL << "Invalid certificate " <<
m_ServerConfig.certfile << UNQL::eom;
*m_clogger << UNQL::LOG_CRITICAL << "Invalid certificate " <<
m_ServerConfig.certfile << UNQL::eom;
}
if(serverSocket->privateKey().isNull()) {
*m_flogger << UNQL::LOG_CRITICAL << "Invalid private key (NULL)"
<< m_ServerConfig.keyfile << UNQL::eom;
*m_clogger << UNQL::LOG_CRITICAL << "Invalid private key (NULL)"
<< m_ServerConfig.keyfile << UNQL::eom;
}
qDebug() << serverSocket->privateKey();
qDebug() << serverSocket->localCertificate();
serverSocket->startServerEncryption();
#if (QT_VERSION > 0x040700)
this->addPendingConnection(serverSocket); //this does not work with qt
< 4.7
#else
m_sslSocketQ.enqueue(serverSocket);
#endif
} else {
delete serverSocket;
}
}
void SslServer::onSslErrors(QList<QSslError> aErrorList)
{
qDebug() << "ssl error " << aErrorList;
QList<QSslError> errorsToIgnore;
foreach (QSslError se, aErrorList) {
qDebug() << se.errorString();
*m_flogger << UNQL::LOG_CRITICAL << "Server reports SSL error: " <<
se.errorString() << UNQL::eom;
*m_clogger << UNQL::LOG_CRITICAL << "Server reports SSL error: " <<
se.errorString() << UNQL::eom;
if (se.error()==QSslError::SelfSignedCertificate ||
se.error()==QSslError::SelfSignedCertificateInChain)
{
if (m_ServerConfig.allowUntrustedCerts) {
qDebug() << "Cert is SelfSigned... but we're ok with
that...";
*m_flogger << UNQL::LOG_INFO << "Client certificate is
untrusted but we're ok with that" << UNQL::eom;
*m_clogger << UNQL::LOG_INFO << "Client certificate is
untrusted but we're ok with that" << UNQL::eom;
errorsToIgnore << se;
}
}
}
QSslSocket *sslsock = (QSslSocket*) sender();
if (m_ServerConfig.ignoreSslErrors) {
*m_flogger << UNQL::LOG_WARNING << "There were SSL errors but
server is configured to ignore them all" << UNQL::eom;
*m_clogger << UNQL::LOG_WARNING << "There were SSL errors but
server is configured to ignore them all" << UNQL::eom;
sslsock->ignoreSslErrors();
}
else {
*m_flogger << UNQL::LOG_WARNING << "Ignoring some SSL errors..." <<
UNQL::eom;
*m_clogger << UNQL::LOG_WARNING << "Ignoring some SSL errors..." <<
UNQL::eom;
if (errorsToIgnore.count()>0)
sslsock->ignoreSslErrors(errorsToIgnore);
}
qDebug() << "socket is encrypted: " << sslsock->isEncrypted();
}
On Sat, Feb 23, 2013 at 4:54 PM, Richard Moore <rich at kde.org> wrote:
> On 21 February 2013 18:32, Francesco Lamonica <alienpenguin at gmail.com>
> wrote:
> > i've implemented a simple SslServer inheriting from QTcpServer and
> > overriding the incomingConnection() as suggested from the documentation.
> > However i am stumbling on a strange problem: QSslSocket fires correctly
> the
> > sslErrors() signal for a "self-signed certificate" but even though i do
> not
> > call ignoreSslErrors() at any time the connection is not dropped (as it
> said
> > it should on the docs)
> > Any ideas what i might check?
>
> You'll need to make your question much clearer. A server socket
> doesn't verify it's own certificate, that is something done by the
> client. Any certificate verification done by the server is of the
> chain provided by the client.
>
> Cheers
>
> Rich.
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20130227/d018839a/attachment.html>
More information about the Interest
mailing list