Add support for intermediate certificates to server sockets.
Add intermediate certificates to our server sockets, and to our client certs. Change-Id: Ib5aa575473f9e84f337bebe35099506dd7d7e2ba Task-Number: QTBUG-19825 Task-Number: QTBUG-13281 Reviewed-by: Peter Hartmann <phartmann@rim.com>
This commit is contained in:
parent
4a07519877
commit
7898080ca7
@ -324,6 +324,33 @@ QList<QSslCertificate> QSslConfiguration::localCertificateChain() const
|
||||
return d->localCertificateChain;
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the certificate chain to be presented to the peer during the
|
||||
SSL handshake to be \a localChain.
|
||||
|
||||
Setting the certificate chain once the connection has been
|
||||
established has no effect.
|
||||
|
||||
A certificate is the means of identification used in the SSL
|
||||
process. The local certificate is used by the remote end to verify
|
||||
the local user's identity against its list of Certification
|
||||
Authorities. In most cases, such as in HTTP web browsing, only
|
||||
servers identify to the clients, so the client does not send a
|
||||
certificate.
|
||||
|
||||
Unlike QSslConfiguration::setLocalCertificate() this method allows
|
||||
you to specify any intermediate certificates required in order to
|
||||
validate your certificate. The first item in the list must be the
|
||||
leaf certificate.
|
||||
|
||||
\sa localCertificateChain()
|
||||
\since 5.1
|
||||
*/
|
||||
void QSslConfiguration::setLocalCertificateChain(const QList<QSslCertificate> &localChain)
|
||||
{
|
||||
d->localCertificateChain = localChain;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the certificate to be presented to the peer during the SSL
|
||||
handshake process.
|
||||
|
@ -100,6 +100,7 @@ public:
|
||||
|
||||
// Certificate & cipher configuration
|
||||
QList<QSslCertificate> localCertificateChain() const;
|
||||
void setLocalCertificateChain(const QList<QSslCertificate> &localChain);
|
||||
|
||||
QSslCertificate localCertificate() const;
|
||||
void setLocalCertificate(const QSslCertificate &certificate);
|
||||
|
@ -234,6 +234,17 @@ init_context:
|
||||
sslContext->errorCode = QSslError::UnspecifiedError;
|
||||
return sslContext;
|
||||
}
|
||||
|
||||
// If we have any intermediate certificates then we need to add them to our chain
|
||||
bool first = true;
|
||||
foreach (const QSslCertificate &cert, configuration.d->localCertificateChain) {
|
||||
if (first) {
|
||||
first = false;
|
||||
continue;
|
||||
}
|
||||
q_SSL_CTX_ctrl(sslContext->ctx, SSL_CTRL_EXTRA_CHAIN_CERT, 0,
|
||||
q_X509_dup(reinterpret_cast<X509 *>(cert.handle())));
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize peer verification.
|
||||
|
@ -911,6 +911,32 @@ void QSslSocket::setSslConfiguration(const QSslConfiguration &configuration)
|
||||
d->allowRootCertOnDemandLoading = false;
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the certificate chain to be presented to the peer during the
|
||||
SSL handshake to be \a localChain.
|
||||
|
||||
\sa QSslConfiguration::setLocalCertificateChain()
|
||||
\since 5.1
|
||||
*/
|
||||
void QSslSocket::setLocalCertificateChain(const QList<QSslCertificate> &localChain)
|
||||
{
|
||||
Q_D(QSslSocket);
|
||||
d->configuration.localCertificateChain = localChain;
|
||||
}
|
||||
|
||||
/*!
|
||||
Returns the socket's local \l {QSslCertificate} {certificate} chain,
|
||||
or an empty list if no local certificates have been assigned.
|
||||
|
||||
\sa setLocalCertificateChain()
|
||||
\since 5.1
|
||||
*/
|
||||
QList<QSslCertificate> QSslSocket::localCertificateChain() const
|
||||
{
|
||||
Q_D(const QSslSocket);
|
||||
return d->configuration.localCertificateChain;
|
||||
}
|
||||
|
||||
/*!
|
||||
Sets the socket's local certificate to \a certificate. The local
|
||||
certificate is necessary if you need to confirm your identity to the
|
||||
|
@ -131,6 +131,9 @@ public:
|
||||
void setSslConfiguration(const QSslConfiguration &config);
|
||||
|
||||
// Certificate & cipher accessors.
|
||||
void setLocalCertificateChain(const QList<QSslCertificate> &localChain);
|
||||
QList<QSslCertificate> localCertificateChain() const;
|
||||
|
||||
void setLocalCertificate(const QSslCertificate &certificate);
|
||||
void setLocalCertificate(const QString &fileName, QSsl::EncodingFormat format = QSsl::Pem);
|
||||
QSslCertificate localCertificate() const;
|
||||
|
22
tests/auto/network/ssl/qsslsocket/certs/ca.crt
Normal file
22
tests/auto/network/ssl/qsslsocket/certs/ca.crt
Normal file
@ -0,0 +1,22 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDpTCCAl2gAwIBAgIQAKraD9BoqaSa75qOqcP7ZTANBgkqhkiG9w0BAQUFADA8
|
||||
MQswCQYDVQQGEwJHQjEZMBcGA1UEChMQV2VzdHBvaW50IENBIEtleTESMBAGA1UE
|
||||
ChMJV2VzdHBvaW50MB4XDTEzMDIxNjE2NTMwOFoXDTIzMDIxNjE2NTMwOFowPDEL
|
||||
MAkGA1UEBhMCR0IxGTAXBgNVBAoTEFdlc3Rwb2ludCBDQSBLZXkxEjAQBgNVBAoT
|
||||
CVdlc3Rwb2ludDCCAVIwDQYJKoZIhvcNAQEBBQADggE/ADCCAToCggExAJv0H92j
|
||||
WjDB9h1DmSQzt772IPSirpE82sN9ls5J19TJcPnw49LdUUqkELJkpS1ty2hYPdUw
|
||||
7q3n00D+nzS+rt1QIDSKwDVoqeIyFZw4h0ULbASErfy51xBjVIr6NNoiqazp59wQ
|
||||
RDvqps7of+b/NcbOh73MsiYi8T5OoI4Quv9rMBefQTAI3d2NRQ4GUzS6Hzh2INOc
|
||||
4twApTDYY+yrU8IalXttIOVdKJZTHeTCdIXD3HMfHCkzyELz8rCI1/wDEp8zyoqF
|
||||
/tpBStZ5LUSrlRRM7PegqcnM+aojXyrEiXBvPuqO7tabU3nsfix9+8+7GDweDXsP
|
||||
OUHv+ahGNTUya7hBDaQmVk3/5hbig9kQlNiOcvcdnYYyJqiXhvjPPzOBbRaFNvBT
|
||||
uG/ehHNHYsdhEBkCAwEAAaNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8E
|
||||
BQMDBwYAMB0GA1UdDgQWBBSUJzi1uYQUxqb3Nr33LOLCaUUTyTANBgkqhkiG9w0B
|
||||
AQUFAAOCATEAPeGh2GiIhT3cii3DU8ihd5TmnEstuHKz2FwHDChmen0zxE8lf08/
|
||||
onL1yIeaxbDA8KwZnv71/zZHJv02sPtIMUfuXQc0wOIFjDf0ngc6xIBuU7FUpLxF
|
||||
2dK7g9OsiNeC7L/ZemRXgpJURdNF2Ujge9/H9yfpHFBXZztmaWir+TXc5g3PKIu6
|
||||
97t75Og+stPhTcSlph8ZHYep08b2uthCfcnuIRGeDW9LkfR8VugnuUf7GoIlqSTs
|
||||
SR6bNuyTnnCHQMJzbsQ472+ag3aZS5HzoR8wyGiPmpc43lQM5ZEDrWGu8bub2gKa
|
||||
/+KeqHd0wnl7Y5cxnmAptQjxvzBXX/pl4sWczesiGcYm5z5mabp4CY09Y8JtrJZT
|
||||
IJodXy9ykRmEurgtRoRVc1aSp+xfV725bQ==
|
||||
-----END CERTIFICATE-----
|
22
tests/auto/network/ssl/qsslsocket/certs/inter.crt
Normal file
22
tests/auto/network/ssl/qsslsocket/certs/inter.crt
Normal file
@ -0,0 +1,22 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDvDCCAnSgAwIBAgIQO+uZxerYC10Ll11PBnVL4TANBgkqhkiG9w0BAQUFADA8
|
||||
MQswCQYDVQQGEwJHQjEZMBcGA1UEChMQV2VzdHBvaW50IENBIEtleTESMBAGA1UE
|
||||
ChMJV2VzdHBvaW50MB4XDTEzMDIxNjE2NTMwOFoXDTIzMDIxNjE2NTMwOFowMjEL
|
||||
MAkGA1UEBhMCR0IxIzAhBgNVBAoTGldlc3Rwb2ludCBJbnRlcm1lZGlhdGUgS2V5
|
||||
MIIBUjANBgkqhkiG9w0BAQEFAAOCAT8AMIIBOgKCATEAsR4tRskg2IFfQFMfGBJ1
|
||||
eqlrNejANw0oM6k5HlEB8uFA9qeyAzmflwQUPoJ55KRQ/gVHTOBdWrtgGgPMiekF
|
||||
1Q36Ry1elwbAl4a+LZ6qsc9ASipvk8HirKpt1v5L9hG+aI4yDxyvjNztFtg5R4P5
|
||||
zqsh/WwhCgsYmEVfcSDbhUjqoqxGRLaZxPKO+IMCNFrjZqi0yxc8f6Un4G5SQzHA
|
||||
4szi/ezcITnAFYWxHG2yaed4hawpxNS1WXabk2rzCi0pWeIcHuIczaCfZ7ElRcqV
|
||||
VNNXbGTtUDlfIsh6FAVI5kTUDcPV27uf6BmHuFOu/R9Tjni25+vBFvohwQh7ZwCX
|
||||
5COXnfkJLPkJQQEFVQv8nS27ht/vmyoKjERUeiuMd+hFcN5zl7bS5A2JCgi7erlP
|
||||
ZQIDAQABo2QwYjAPBgNVHRMBAf8EBTADAQH/MA8GA1UdDwEB/wQFAwMHBgAwHQYD
|
||||
VR0OBBYEFGn5shQ0SeTcc3x/cNu6TkoV0bPmMB8GA1UdIwQYMBaAFJQnOLW5hBTG
|
||||
pvc2vfcs4sJpRRPJMA0GCSqGSIb3DQEBBQUAA4IBMQAVDS0enQQ1FL0d92xOFfwx
|
||||
mjcNPz9oO7jMyEVxAs2eR2QD+xZ3Xj4gAiUEp40aGieDcLv+dg+cmuBFWF61IYSR
|
||||
UyuoakVm08VDcLAwUzU+xtSvJiSSROb0GsAnVsYZj4TYlvKDplqfapOYaiIkwF+c
|
||||
iE4n7G0hQW9fzqO+n3FGtBD8YUjghRqLggeRVJ2+8S3Bm8cfx8xPpRIO3ksA6opn
|
||||
CORRGuzetDHihbks59mkoY3GqKFgBOyrC3kG07nv5wtKjdKDtmD/kS/SAc4fIXKy
|
||||
Uruq2uXNf/1BUgF5gFGRyj22yB2D0763fJJpl5nqcLrL5RmnVObQKZGhE2VsRTV0
|
||||
untj+AmiJivhiAjjkHfw3XDf8tuL7D4pTmEkGgl5xl23fyeTIuygDCLT8fRD3ZqQ
|
||||
-----END CERTIFICATE-----
|
23
tests/auto/network/ssl/qsslsocket/certs/leaf.crt
Normal file
23
tests/auto/network/ssl/qsslsocket/certs/leaf.crt
Normal file
@ -0,0 +1,23 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIID3zCCApegAwIBAgIQEKCtd1j2bq5Gk6ND+VmKnjANBgkqhkiG9w0BAQUFADAy
|
||||
MQswCQYDVQQGEwJHQjEjMCEGA1UEChMaV2VzdHBvaW50IEludGVybWVkaWF0ZSBL
|
||||
ZXkwHhcNMTMwMjE2MTY1MzA4WhcNMjMwMjE2MTY1MzA4WjA1MQswCQYDVQQGEwJH
|
||||
QjESMBAGA1UEChMJV2VzdHBvaW50MRIwEAYDVQQDEwkxMjcuMC4wLjEwggFSMA0G
|
||||
CSqGSIb3DQEBAQUAA4IBPwAwggE6AoIBMQC7EIWIzb7XCfmQQ1KFdZ5E9f49eNK/
|
||||
KvsXYfq/iV29K1cz2hUyvfdKgyU5F/+BOPQKQ5zdWn1CraZosFv/ibuO3mhRpMfB
|
||||
SfNn3rfdrE7WtA0wgT2YNIN0L4aCe+C15j2ESdmyMaFLUaUIS47JS66UtaYxp5ia
|
||||
mJFO1hSNaoI0pGHyPFTTtfOza9z/01qkBbHB4htzauqs/fX5ZrnyCDSrfpVipXke
|
||||
zkPKg4MkkytEkjRKw6tSXLpWIgF3ee2N/jBdefqlw8YPW08K0wmwF5qGuX6PZ8vB
|
||||
sOZeWeCfVr136BopkbfP3TkGWw2BrD8xSzOUez9HVc0v4SZ/7pe5w3L4V/mzYQLt
|
||||
O+1AHevCjX8+M58HYGBaWCAjxYUPGcGKcj0LLtgZgL6wY88N7RtfeOY3AgMBAAGj
|
||||
gY0wgYowFAYDVR0RBA0wC4IJMTI3LjAuMC4xMAwGA1UdEwEB/wQCMAAwEwYDVR0l
|
||||
BAwwCgYIKwYBBQUHAwEwDwYDVR0PAQH/BAUDAwcoADAdBgNVHQ4EFgQUKKuyJSrT
|
||||
Y+dnm1do7l0sVMX96SYwHwYDVR0jBBgwFoAUafmyFDRJ5NxzfH9w27pOShXRs+Yw
|
||||
DQYJKoZIhvcNAQEFBQADggExAHELijlIFdcncP3B+vxEp0SGKl0arIaCXahivb2F
|
||||
VxeM3WajN6O+oDRLFltzMeDKA9RVkao7fgITzXQgCGzeNhKv0vc9iDyvR9/67vuS
|
||||
W8xEEJrYowtw3VK5H1y0ewqZaxJhvKUjm4TBRWe8FGKD3s64lEsfbjOaI5VPidVc
|
||||
DXmdAlXsj0Hk+v4Ej8mshPQAnVSyJ3D0ZMgTjk8Di28N0qROFIYJaTObK1rCb1nQ
|
||||
GaCcmbZU6JnkYvVZ+iUe5U0GXFbb+LRNTUT8/fw1zADeHnv/G+WWVrfND+sov5Oc
|
||||
33fkNE6z+n6ayABVnGLuCYhbzD38sv0dnxeh8vbykNBPzYdzPg6nw3Czv2vlhKpJ
|
||||
8Yj/maoXuAyTXVf30K1/fAWyU45noq57MjQpU6UxIX1D7qw=
|
||||
-----END CERTIFICATE-----
|
32
tests/auto/network/ssl/qsslsocket/certs/leaf.key
Normal file
32
tests/auto/network/ssl/qsslsocket/certs/leaf.key
Normal file
@ -0,0 +1,32 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
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
|
||||
q/hM51H0bsQ13AIVUSdNHA==
|
||||
-----END RSA PRIVATE KEY-----
|
@ -143,6 +143,7 @@ private slots:
|
||||
void setCaCertificates();
|
||||
void setLocalCertificate();
|
||||
void localCertificateChain();
|
||||
void setLocalCertificateChain();
|
||||
void setPrivateKey();
|
||||
void setSocketDescriptor();
|
||||
void setSslConfiguration_data();
|
||||
@ -928,15 +929,20 @@ class SslServer : public QTcpServer
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
SslServer(const QString &keyFile = SRCDIR "certs/fluke.key", const QString &certFile = SRCDIR "certs/fluke.cert")
|
||||
SslServer(const QString &keyFile = SRCDIR "certs/fluke.key",
|
||||
const QString &certFile = SRCDIR "certs/fluke.cert",
|
||||
const QString &interFile = QString())
|
||||
: socket(0),
|
||||
protocol(QSsl::TlsV1_0),
|
||||
m_keyFile(keyFile),
|
||||
m_certFile(certFile) { }
|
||||
m_certFile(certFile),
|
||||
m_interFile(interFile)
|
||||
{ }
|
||||
QSslSocket *socket;
|
||||
QSsl::SslProtocol protocol;
|
||||
QString m_keyFile;
|
||||
QString m_certFile;
|
||||
QString m_interFile;
|
||||
|
||||
protected:
|
||||
void incomingConnection(qintptr socketDescriptor)
|
||||
@ -951,10 +957,24 @@ protected:
|
||||
QVERIFY(!key.isNull());
|
||||
socket->setPrivateKey(key);
|
||||
|
||||
QList<QSslCertificate> localCert = QSslCertificate::fromPath(m_certFile);
|
||||
QVERIFY(!localCert.isEmpty());
|
||||
QVERIFY(localCert.first().handle());
|
||||
socket->setLocalCertificate(localCert.first());
|
||||
// If we have a cert issued directly from the CA
|
||||
if (m_interFile.isEmpty()) {
|
||||
QList<QSslCertificate> localCert = QSslCertificate::fromPath(m_certFile);
|
||||
QVERIFY(!localCert.isEmpty());
|
||||
QVERIFY(localCert.first().handle());
|
||||
socket->setLocalCertificate(localCert.first());
|
||||
}
|
||||
else {
|
||||
QList<QSslCertificate> localCert = QSslCertificate::fromPath(m_certFile);
|
||||
QVERIFY(!localCert.isEmpty());
|
||||
QVERIFY(localCert.first().handle());
|
||||
|
||||
QList<QSslCertificate> interCert = QSslCertificate::fromPath(m_interFile);
|
||||
QVERIFY(!interCert.isEmpty());
|
||||
QVERIFY(interCert.first().handle());
|
||||
|
||||
socket->setLocalCertificateChain(localCert + interCert);
|
||||
}
|
||||
|
||||
QVERIFY(socket->setSocketDescriptor(socketDescriptor, QAbstractSocket::ConnectedState));
|
||||
QVERIFY(!socket->peerAddress().isNull());
|
||||
@ -1116,6 +1136,40 @@ void tst_QSslSocket::localCertificateChain()
|
||||
QCOMPARE(chain[0], socket.localCertificate());
|
||||
}
|
||||
|
||||
void tst_QSslSocket::setLocalCertificateChain()
|
||||
{
|
||||
if (!QSslSocket::supportsSsl())
|
||||
return;
|
||||
|
||||
QFETCH_GLOBAL(bool, setProxy);
|
||||
if (setProxy)
|
||||
return;
|
||||
|
||||
SslServer server(QLatin1String(SRCDIR "certs/leaf.key"),
|
||||
QLatin1String(SRCDIR "certs/leaf.crt"),
|
||||
QLatin1String(SRCDIR "certs/inter.crt"));
|
||||
|
||||
QVERIFY(server.listen());
|
||||
|
||||
QEventLoop loop;
|
||||
QTimer::singleShot(5000, &loop, SLOT(quit()));
|
||||
|
||||
socket = new QSslSocket();
|
||||
connect(socket, SIGNAL(encrypted()), &loop, SLOT(quit()));
|
||||
connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), &loop, SLOT(quit()));
|
||||
connect(socket, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(ignoreErrorSlot()));
|
||||
|
||||
socket->connectToHostEncrypted(QHostAddress(QHostAddress::LocalHost).toString(), server.serverPort());
|
||||
loop.exec();
|
||||
|
||||
QList<QSslCertificate> chain = socket->peerCertificateChain();
|
||||
QCOMPARE(chain.size(), 2);
|
||||
QCOMPARE(chain[0].serialNumber(), QByteArray("10:a0:ad:77:58:f6:6e:ae:46:93:a3:43:f9:59:8a:9e"));
|
||||
QCOMPARE(chain[1].serialNumber(), QByteArray("3b:eb:99:c5:ea:d8:0b:5d:0b:97:5d:4f:06:75:4b:e1"));
|
||||
|
||||
socket->deleteLater();
|
||||
}
|
||||
|
||||
void tst_QSslSocket::setPrivateKey()
|
||||
{
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user