Spec-Zone.ru › Qt 5.6

Класс QSslSocket

Класс QSslSocket предоставляет SSL-шифрованный сокет для клиентов и серверов. Подробнее...

Заголовок: #include <QSslSocket>
qmake: QT += network
С версии: Qt 4.3
Наследует: QTcpSocket
  • Список всех членов, включая унаследованные
  • Устаревшие члены

Примечание: Все функции в этом классе являются реентерабельными.

Публичные типы

перечисление PeerVerifyMode { VerifyNone, QueryPeer, VerifyPeer, AutoVerifyPeer }
перечисление SslMode { UnencryptedMode, SslClientMode, SslServerMode }

Публичные функции

QSslSocket(QObject *parent = Q_NULLPTR)
~QSslSocket()
void abort()
void addCaCertificate(const QSslCertificate &certificate)
bool addCaCertificates(const QString &path, QSsl::EncodingFormat format = QSsl::Pem, QRegExp::PatternSyntax syntax = QRegExp::FixedString)
void addCaCertificates(const QList<QSslCertificate> &certificates)
void connectToHostEncrypted(const QString &hostName, quint16 port, OpenMode mode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol)
void connectToHostEncrypted(const QString &hostName, quint16 port, const QString &sslPeerName, OpenMode mode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol)
qint64 encryptedBytesAvailable() const
qint64 encryptedBytesToWrite() const
bool flush()
void ignoreSslErrors(const QList<QSslError> &errors)
bool isEncrypted() const
QSslCertificate localCertificate() const
QList<QSslCertificate> localCertificateChain() const
SslMode mode() const
QSslCertificate peerCertificate() const
QList<QSslCertificate> peerCertificateChain() const
int peerVerifyDepth() const
QSslSocket::PeerVerifyMode peerVerifyMode() const
QString peerVerifyName() const
QSslKey privateKey() const
QSsl::SslProtocol protocol() const
QSslCipher sessionCipher() const
QSsl::SslProtocol sessionProtocol() const
void setLocalCertificate(const QSslCertificate &certificate)
void setLocalCertificate(const QString &path, QSsl::EncodingFormat format = QSsl::Pem)
void setLocalCertificateChain(const QList<QSslCertificate> &localChain)
void setPeerVerifyDepth(int depth)
void setPeerVerifyMode(QSslSocket::PeerVerifyMode mode)
void setPeerVerifyName(const QString &hostName)
void setPrivateKey(const QSslKey &key)
void setPrivateKey(const QString &fileName, QSsl::KeyAlgorithm algorithm = QSsl::Rsa, QSsl::EncodingFormat format = QSsl::Pem, const QByteArray &passPhrase = QByteArray())
void setProtocol(QSsl::SslProtocol protocol)
void setSslConfiguration(const QSslConfiguration &configuration)
QSslConfiguration sslConfiguration() const
QList<QSslError> sslErrors() const
bool waitForEncrypted(int msecs = 30000)

Реализованные публичные функции

виртуальный bool atEnd() const
виртуальный qint64 bytesAvailable() const
виртуальный qint64 bytesToWrite() const
виртуальный bool canReadLine() const
виртуальный void close()
виртуальный void resume()
виртуальный void setReadBufferSize(qint64 size)
виртуальный bool setSocketDescriptor(qintptr socketDescriptor, SocketState state = ConnectedState, OpenMode openMode = ReadWrite)
виртуальный void setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value)
виртуальный QVariant socketOption(QAbstractSocket::SocketOption option)
виртуальный bool waitForBytesWritten(int msecs = 30000)
виртуальный bool waitForConnected(int msecs = 30000)
виртуальный bool waitForDisconnected(int msecs = 30000)
виртуальный bool waitForReadyRead(int msecs = 30000)
  • 37 публичные функции, унаследованные от QAbstractSocket
  • 33 публичные функции, унаследованные от QIODevice
  • 31 публичные функции, унаследованные от QObject

Публичные слоты

void ignoreSslErrors()
void startClientEncryption()
void startServerEncryption()
  • 1 публичный слот, унаследованный от QObject

Сигналы

void encrypted()
void encryptedBytesWritten(qint64 written)
void modeChanged(QSslSocket::SslMode mode)
void peerVerifyError(const QSslError &error)
void preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator)
void sslErrors(const QList<QSslError> &errors)
  • 6 сигналов, унаследованных от QAbstractSocket
  • 4 сигнала, унаследованные от QIODevice
  • 2 сигнала, унаследованные от QObject

Статические публичные члены

void addDefaultCaCertificate(const QSslCertificate &certificate)
bool addDefaultCaCertificates(const QString &path, QSsl::EncodingFormat encoding = QSsl::Pem, QRegExp::PatternSyntax syntax = QRegExp::FixedString)
void addDefaultCaCertificates(const QList<QSslCertificate> &certificates)
long sslLibraryBuildVersionNumber()
QString sslLibraryBuildVersionString()
long sslLibraryVersionNumber()
QString sslLibraryVersionString()
bool supportsSsl()
  • 11 статических публичных членов, унаследованных от QObject

Переопределенные защищенные функции

виртуальный qint64 readData(char *data, qint64 maxlen)
виртуальный qint64 writeData(const char *data, qint64 len)
  • 10 защищенных функций, унаследованных от QAbstractSocket
  • 5 защищенных функций, унаследованных от QIODevice
  • 9 защищенных функций, унаследованных от QObject

Дополнительные унаследованные члены

  • 1 свойство, унаследованное от QObject
  • 10 защищенных функций, унаследованных от QAbstractSocket
  • 5 защищенных функций, унаследованных от QIODevice
  • 9 защищенных функций, унаследованных от QObject

Подробное описание

Класс QSslSocket предоставляет сокет SSL для шифрования как для клиентов, так и для серверов.

QSslSocket устанавливает безопасное, зашифрованное TCP-соединение, которое вы можете использовать для передачи зашифрованных данных. Он может работать в режиме клиента и сервера и поддерживает современные протоколы SSL, включая SSL 3 и TLS 1.2. По умолчанию QSslSocket использует только протоколы SSL, которые считаются безопасными (QSsl::SecureProtocols), но вы можете изменить протокол SSL, вызвав setProtocol(), если вы сделаете это до начала рукопожатия.

Шифрование SSL работает поверх существующего TCP-потока после того, как сокет перейдет в состояние ConnectedState. Существует два простых способа установить защищенное соединение с помощью QSslSocket: с немедленным SSL-рукопожатием или с отложенным SSL-рукопожатием, которое происходит после того, как соединение было установлено в незашифрованном режиме.

Наиболее распространенный способ использования QSslSocket — создание объекта и начало безопасного соединения, вызвав connectToHostEncrypted(). Этот метод запускает немедленное SSL-рукопожатие после того, как соединение будет установлено.

QSslSocket *socket = new QSslSocket(this);
connect(socket, SIGNAL(encrypted()), this, SLOT(ready()));

socket->connectToHostEncrypted("imap.example.com", 993);

Как и с обычным QTcpSocket, QSslSocket переходит в состояния HostLookupState, ConnectingState и, наконец, ConnectedState, если соединение установлено успешно. Затем автоматически начинается рукопожатие, и если оно успешно, испускается сигнал encrypted(), чтобы указать, что сокет перешел в зашифрованное состояние и готов к использованию.

Обратите внимание, что данные могут быть записаны в сокет сразу после возврата из connectToHostEncrypted() (т. е. до того, как будет испущен сигнал encrypted()). Данные очередируются в QSslSocket до момента испускания сигнала encrypted().

Пример использования отложенного рукопожатия SSL для защиты существующего соединения — случай, когда сервер SSL защищает входящее соединение. Предположим, что вы создаёте класс SSL-сервера как подкласс QTcpServer. Вы бы переопределили QTcpServer::incomingConnection() на что-то подобное приведённому ниже примеру, который сначала создаёт экземпляр QSslSocket, а затем вызывает setSocketDescriptor() для установки дескриптора нового сокета на существующий, переданный в качестве параметра. Затем он инициирует SSL-рукопожатие, вызвав startServerEncryption().

void SslServer::incomingConnection(qintptr socketDescriptor)
{
    QSslSocket *serverSocket = new QSslSocket;
    if (serverSocket->setSocketDescriptor(socketDescriptor)) {
        addPendingConnection(serverSocket);
        connect(serverSocket, &QSslSocket::encrypted, this, &SslServer::ready);
        serverSocket->startServerEncryption();
    } else {
        delete serverSocket;
    }
}

Если произошла ошибка, QSslSocket генерирует сигнал sslErrors(). В этом случае, если не предпринять никаких действий для игнорирования ошибки(ошибок), соединение будет разорвано. Чтобы продолжить, несмотря на возникновение ошибки, вы можете вызвать ignoreSslErrors(), либо изнутри этого слота после возникновения ошибки, либо в любое время после создания QSslSocket и до попытки подключения. Это позволит QSslSocket игнорировать ошибки, с которыми он сталкивается при установлении идентичности удалённого узла. Игнорирование ошибок во время SSL-рукопожатия следует использовать с осторожностью, поскольку фундаментальной характеристикой защищённых соединений является то, что они должны быть установлены с успешным рукопожатием.

После шифрования вы используете QSslSocket как обычный QTcpSocket. Когда генерируется событие readyRead(), вы можете вызвать read(), canReadLine() и readLine(), или getChar() для чтения расшифрованных данных из внутреннего буфера QSslSocket, и вы можете вызвать write() или putChar() для записи данных обратно удалённому узлу. QSslSocket автоматически зашифрует записанные данные для вас, и сгенерирует encryptedBytesWritten() после того, как данные будут записаны удалённому узлу.

Для удобства QSslSocket поддерживает блокирующие функции QTcpSocket, такие как waitForConnected(), waitForReadyRead(), waitForBytesWritten() и waitForDisconnected(). Он также предоставляет waitForEncrypted(), которая заблокирует вызывающую нить до тех пор, пока не будет установлено зашифрованное соединение.

QSslSocket socket;
socket.connectToHostEncrypted("http.example.com", 443);
if (!socket.waitForEncrypted()) {
    qDebug() << socket.errorString();
    return false;
}

socket.write("GET / HTTP/1.0\r\n\r\n");
while (socket.waitForReadyRead())
    qDebug() << socket.readAll().data();

QSslSocket предоставляет обширный и простой в использовании API для работы с криптографическими алгоритмами, закрытыми ключами и локальными, удалёнными и сертификатами Удостоверяющего центра (УЦ). Он также предоставляет API для обработки ошибок, возникающих во время фазы рукопожатия.

Следующие функции также могут быть настроены:

  • Криптографический набор шифров сокета может быть настроен до фазы рукопожатия с помощью setCiphers() и setDefaultCiphers().
  • Локальный сертификат и закрытый ключ сокета могут быть настроены до фазы рукопожатия с помощью setLocalCertificate() и setPrivateKey().
  • База данных сертификатов УЦ может быть расширена и настроена с помощью addCaCertificate(), addCaCertificates(), addDefaultCaCertificate(), addDefaultCaCertificates() и QSslConfiguration::defaultConfiguration().setCaCertificates().

Примечание: Если доступны, корневые сертификаты в Unix (за исключением macOS) будут загружаться по мере необходимости из стандартных каталогов сертификатов. Если вы не хотите загружать корневые сертификаты по запросу, вам необходимо вызвать либо QSslConfiguration::defaultConfiguration().setCaCertificates() до первого SSL-рукопожатия в вашем приложении (например, передав QSslSocket::systemCaCertificates() в него), или вызовите QSslConfiguration::defaultConfiguration()::setCaCertificates() на вашем экземпляре QSslSocket до SSL-рукопожатия.

Дополнительную информацию о шифрах и сертификатах можно найти в QSslCipher и QSslCertificate.

Этот продукт включает программное обеспечение, разработанное OpenSSL Project для использования в OpenSSL Toolkit (http://www.openssl.org/).

Примечание: Обратите внимание на разницу между сигналами bytesWritten() и encryptedBytesWritten(). Для QTcpSocket сигнал bytesWritten() генерируется сразу после записи данных в TCP-сокет. Для QSslSocket сигнал bytesWritten() генерируется при шифровании данных, а encryptedBytesWritten() — сразу после записи данных в TCP-сокет.

См. также QSslCertificate, QSslCipher и QSslError.

Документация по типам членов

enum QSslSocket::PeerVerifyMode

Описывает режимы проверки удалённого узла для QSslSocket. По умолчанию используется режим AutoVerifyPeer, который выбирает подходящий режим в зависимости от QSocket::SslMode сокета.

Константа Значение Описание
QSslSocket::VerifyNone 0 QSslSocket не будет запрашивать сертификат у удалённого узла. Вы можете установить этот режим, если вас не интересует идентичность другой стороны соединения. Соединение всё равно будет зашифровано, и ваш сокет всё равно отправит свой локальный сертификат удалённому узлу, если это необходимо.
QSslSocket::QueryPeer 1 QSslSocket будет запрашивать сертификат у удалённого узла, но не требует, чтобы этот сертификат был действительным. Это полезно, когда вы хотите отобразить подробности сертификата удалённого узла пользователю, не влияя на фактическое SSL-рукопожатие. Этот режим используется по умолчанию для серверов.
QSslSocket::VerifyPeer 2 QSslSocket будет запрашивать сертификат у удалённого узла во время фазы SSL-рукопожатия и потребует, чтобы этот сертификат был действительным. В случае неудачи QSslSocket сгенерирует сигнал QSslSocket::sslErrors(). Этот режим используется по умолчанию для клиентов.
QSslSocket::AutoVerifyPeer 3 QSslSocket будет автоматически использовать QueryPeer для серверных сокетов и VerifyPeer для клиентских сокетов.

Этот перечисление был введён или изменён в Qt 4.4.

См. также QSslSocket::peerVerifyMode().

enum QSslSocket::SslMode

Описывает режимы соединения, доступные для QSslSocket.

Константа Значение Описание
QSslSocket::UnencryptedMode 0 Сокет не зашифрован. Его поведение идентично QTcpSocket.
QSslSocket::SslClientMode 1 Сокет — SSL-сокет на стороне клиента. Он либо уже зашифрован, либо находится в фазе SSL-рукопожатия (см. QSslSocket::isEncrypted()).
QSslSocket::SslServerMode 2 Сокет — SSL-сокет на стороне сервера. Он либо уже зашифрован, либо находится в фазе SSL-рукопожатия (см. QSslSocket::isEncrypted()).

Документация по функциям-членам

QSslSocket::QSslSocket(QObject *parent = Q_NULLPTR)

Создаёт объект QSslSocket. parent передаётся конструктору QObject. Набор шифров нового сокета устанавливается в тот, который возвращает статический метод defaultCiphers().

QSslSocket::~QSslSocket()

Уничтожает QSslSocket.

void QSslSocket::abort()

Прерывает текущее подключение и сбрасывает сокет. В отличие от disconnectFromHost(), эта функция немедленно закрывает сокет, очищая любые ожидающие данные в буфере записи.

См. также disconnectFromHost() и close().

void QSslSocket::addCaCertificate(const QSslCertificate &certificate)

Добавляет certificate в базу данных сертификатов УЦ этого сокета. База данных сертификатов УЦ используется сокетом во время фазы рукопожатия для проверки сертификата удалённого узла.

Для добавления нескольких сертификатов используйте addCaCertificates().

См. также caCertificates() и setCaCertificates().

bool QSslSocket::addCaCertificates(const QString &path, QSsl::EncodingFormat format = QSsl::Pem, QRegExp::PatternSyntax syntax = QRegExp::FixedString)

Ищет все файлы в пути с сертификатами, закодированными в указанном формате, и добавляет их в базу данных сертификатов доверенных центров выдачи этого сокета. Путь должен быть файлом или шаблоном, соответствующим одному или нескольким файлам, как указано в синтаксисе. Возвращает true, если один или несколько сертификатов добавлены в базу данных сертификатов доверенных центров выдачи сокета; в противном случае возвращает false.

База данных сертификатов доверенных центров выдачи используется сокетом на стадии рукопожатия для проверки сертификата удалённого узла.

Для более точного управления используйте addCaCertificate().

См. также addCaCertificate() и QSslCertificate::fromPath().

void QSslSocket::addCaCertificates(const QList<QSslCertificate> &certificates)

Добавляет сертификаты в базу данных сертификатов доверенных центров выдачи этого сокета. База данных сертификатов доверенных центров выдачи используется сокетом на стадии рукопожатия для проверки сертификата удалённого узла.

Для более точного управления используйте addCaCertificate().

См. также caCertificates() и addDefaultCaCertificate().

[static] void QSslSocket::addDefaultCaCertificate(const QSslCertificate &certificate)

Добавляет certificate в базу данных сертификатов доверенных центров выдачи по умолчанию. База данных сертификатов доверенных центров выдачи каждого сокета SSL инициализируется базой данных сертификатов доверенных центров выдачи по умолчанию.

См. также defaultCaCertificates() и addCaCertificates().

[static] bool QSslSocket::addDefaultCaCertificates(const QString &path, QSsl::EncodingFormat encoding = QSsl::Pem, QRegExp::PatternSyntax syntax = QRegExp::FixedString)

Ищет все файлы в пути с сертификатами указанного кодирования и добавляет их в базу данных сертификатов доверенных центров выдачи по умолчанию. Путь может быть явным файлом или содержать подстановочные знаки в формате, заданном синтаксисом. Возвращает true, если сертификаты доверенных центров выдачи добавлены в базу данных по умолчанию.

База данных сертификатов доверенных центров выдачи каждого сокета SSL инициализируется базой данных сертификатов доверенных центров выдачи по умолчанию.

См. также defaultCaCertificates(), addCaCertificates() и addDefaultCaCertificate().

[static] void QSslSocket::addDefaultCaCertificates(const QList<QSslCertificate> &certificates)

Добавляет сертификаты в базу данных сертификатов доверенных центров выдачи по умолчанию. База данных сертификатов доверенных центров выдачи каждого сокета SSL инициализируется базой данных сертификатов доверенных центров выдачи по умолчанию.

См. также defaultCaCertificates() и addCaCertificates().

[virtual] bool QSslSocket::atEnd() const

Переопределено из QIODevice::atEnd().

[virtual] qint64 QSslSocket::bytesAvailable() const

Переопределено из QIODevice::bytesAvailable().

Возвращает количество дешифрованных байтов, которые немедленно доступны для чтения.

[virtual] qint64 QSslSocket::bytesToWrite() const

Переопределено из QIODevice::bytesToWrite().

Возвращает количество незашифрованных байтов, которые ожидают шифрования и записи в сеть.

[virtual] bool QSslSocket::canReadLine() const

Переопределено из QIODevice::canReadLine().

Возвращает true, если можно прочитать одну строку (ограниченную одним ASCII-символом '\n') дешифрованных символов; в противном случае возвращается false.

[virtual] void QSslSocket::close()

Переопределено из QIODevice::close().

void QSslSocket::connectToHostEncrypted(const QString &hostName, quint16 port, OpenMode mode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol)

Начинает зашифрованное подключение к устройству hostName на port, используя mode в качестве OpenMode. Это эквивалентно вызову connectToHost() для установления соединения, за которым следует вызов startClientEncryption(). Параметр protocol может использоваться для указания сетевого протокола (например, IPv4 или IPv6).

QSslSocket сначала переходит в состояние HostLookupState. Затем, после перехода в цикл событий или в одну из функций waitFor..., он переходит в состояние ConnectingState, генерирует connected() и затем инициирует SSL-клиентский обмен. При каждом изменении состояния QSslSocket генерирует сигнал stateChanged().

После инициирования SSL-клиентского обмена, если идентичность удалённого узла не может быть установлена, генерируется сигнал sslErrors(). Если вы хотите проигнорировать ошибки и продолжить подключение, вы должны вызвать ignoreSslErrors(), либо из внутри функции-слота, подключенного к сигналу sslErrors(), либо до перехода в зашифрованный режим. Если ignoreSslErrors() не вызывается, подключение прерывается, генерируется сигнал disconnected(), и QSslSocket возвращается в состояние UnconnectedState.

Если SSL-рукопожатие успешно завершено, QSslSocket генерирует encrypted().

QSslSocket socket;
connect(&socket, SIGNAL(encrypted()), receiver, SLOT(socketEncrypted()));

socket.connectToHostEncrypted("imap", 993);
socket->write("1 CAPABILITY\r\n");

Примечание: Приведённый пример показывает, что текст может быть записан в сокет сразу после запроса зашифрованного подключения, до того, как был выпущен сигнал encrypted(). В таких случаях текст помещается в очередь объекта и записывается в сокет после установления соединения и выдачи сигнала encrypted().

Значение по умолчанию для mode — ReadWrite.

Если вы хотите создать QSslSocket на стороне сервера подключения, вы должны вместо этого вызвать startServerEncryption() при получении входящего подключения через QTcpServer.

См. также connectToHost(), startClientEncryption(), waitForConnected() и waitForEncrypted().

void QSslSocket::connectToHostEncrypted(const QString &hostName, quint16 port, const QString &sslPeerName, OpenMode mode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol)

Это перегруженный метод.

В дополнение к исходному поведению connectToHostEncrypted, этот перегруженный метод позволяет использовать другое имя хоста (sslPeerName) для проверки сертификата вместо имени, используемого для TCP-соединения (hostName).

Эта функция была добавлена в Qt 4.6.

См. также connectToHostEncrypted().

[signal] void QSslSocket::encrypted()

Этот сигнал генерируется, когда QSslSocket переходит в зашифрованный режим. После выдачи этого сигнала QSslSocket::isEncrypted() вернёт true, и все дальнейшие передачи по сокету будут зашифрованы.

См. также QSslSocket::connectToHostEncrypted() и QSslSocket::isEncrypted().

qint64 QSslSocket::encryptedBytesAvailable() const

Возвращает количество зашифрованных байтов, ожидающих дешифрования. Обычно эта функция возвращает 0, потому что QSslSocket дешифрует свои входящие данные как только может.

Эта функция была добавлена в Qt 4.4.

qint64 QSslSocket::encryptedBytesToWrite() const

Возвращает количество зашифрованных байтов, ожидающих записи в сеть.

Эта функция была добавлена в Qt 4.4.

[signal] void QSslSocket::encryptedBytesWritten(qint64 written)

Этот сигнал испускается, когда QSslSocket записывает свои зашифрованные данные в сеть. Параметр written содержит количество байтов, которые были успешно записаны.

Эта функция была добавлена в Qt 4.4.

См. также QIODevice::bytesWritten().

bool QSslSocket::flush()

Эта функция записывает как можно больше данных из внутреннего буфера записи в подлежащий сокет сети без блокировки. Если какие-либо данные были записаны, эта функция возвращает true; в противном случае возвращается false.

Вызовите эту функцию, если вам необходимо, чтобы QSslSocket сразу начал отправлять данные из буфера. Количество успешно записанных байтов зависит от операционной системы. В большинстве случаев вызывать эту функцию не нужно, потому что QAbstractSocket начнёт отправку данных автоматически, как только управление вернётся в цикл событий. При отсутствии цикла событий, используйте waitForBytesWritten() вместо этого.

См. также write() и waitForBytesWritten().

[slot] void QSslSocket::ignoreSslErrors()

Этот слот сообщает QSslSocket игнорировать ошибки во время фазы рукопожатия и продолжать подключение. Если вы хотите продолжить подключение, даже если во время фазы рукопожатия произошли ошибки, то вам необходимо вызвать этот слот, либо из слота, подключенного к sslErrors(), либо до начала фазы рукопожатия. Если вы не вызовете этот слот, ни в ответ на ошибки, ни до начала рукопожатия, подключение будет прервано после того, как был испущен сигнал sslErrors().

Если во время фазы SSL-рукопожатия не возникло ошибок (т.е., идентичность узла установлена без проблем), QSslSocket не будет испускать сигнал sslErrors(), и вызывать эту функцию не нужно.

Предупреждение: Убедитесь, что пользователь всегда проверяет ошибки, сообщённые сигналом sslErrors(), и вызывайте этот метод только при подтверждении пользователем, что продолжение возможно. Если возникнут непредвиденные ошибки, подключение должно быть прервано. Вызов этого метода без проверки фактических ошибок, скорее всего, создаст угрозу безопасности для вашего приложения. Используйте его с большой осторожностью!

См. также sslErrors().

void QSslSocket::ignoreSslErrors(const QList<QSslError> &errors)

Это перегруженная функция.

Этот метод сообщает QSslSocket игнорировать только ошибки, указанные в errors.

Примечание: Поскольку большинство SSL-ошибок связаны с сертификатом, для большинства из них вам необходимо указать ожидаемый сертификат, связанный с этой SSL-ошибкой. Например, если вы хотите подключиться к серверу, использующему самозаверяющий сертификат, рассмотрите следующий фрагмент:

QList<QSslCertificate> cert = QSslCertificate::fromPath(QLatin1String("server-certificate.pem"));
QSslError error(QSslError::SelfSignedCertificate, cert.at(0));
QList<QSslError> expectedSslErrors;
expectedSslErrors.append(error);

QSslSocket socket;
socket.ignoreSslErrors(expectedSslErrors);
socket.connectToHostEncrypted("server.tld", 443);

Многократные вызовы этой функции заменят список ошибок, переданных в предыдущих вызовах. Вы можете очистить список ошибок, которые вы хотите игнорировать, вызвав эту функцию со пустым списком.

Эта функция была добавлена в Qt 4.6.

См. также sslErrors().

bool QSslSocket::isEncrypted() const

Возвращает true, если сокет зашифрован; в противном случае возвращает false.

Зашифрованный сокет шифрует все данные, которые записываются с помощью write() или putChar() перед записью данных в сеть, и расшифровывает все входящие данные по мере их получения из сети, перед вызовом read(), readLine() или getChar().

QSslSocket испускает encrypted(), когда он переходит в зашифрованный режим.

Вы можете вызвать sessionCipher(), чтобы узнать, какой криптографический алгоритм используется для шифрования и расшифрования ваших данных.

См. также mode().

QSslCertificate QSslSocket::localCertificate() const

Возвращает локальный сертификат сокета или пустой сертификат, если локальный сертификат не был назначен.

См. также setLocalCertificate() и privateKey().

QList<QSslCertificate> QSslSocket::localCertificateChain() const

Возвращает цепочку локальных сертификатов сокета или пустой список, если локальные сертификаты не были назначены.

Эта функция была добавлена в Qt 5.1.

См. также setLocalCertificateChain().

SslMode QSslSocket::mode() const

Возвращает текущий режим сокета; либо UnencryptedMode, где QSslSocket ведёт себя идентично QTcpSocket, либо SslClientMode или SslServerMode, где клиент либо ведёт переговоры, либо находится в зашифрованном режиме.

При изменении режима QSslSocket испускает modeChanged()

См. также SslMode.

[signal] void QSslSocket::modeChanged(QSslSocket::SslMode mode)

Этот сигнал испускается, когда QSslSocket меняет режим с QSslSocket::UnencryptedMode на QSslSocket::SslClientMode или QSslSocket::SslServerMode. mode — новый режим.

См. также QSslSocket::mode().

QSslCertificate QSslSocket::peerCertificate() const

Возвращает цифровой сертификат узла (то есть непосредственный сертификат хоста, к которому вы подключены) или пустой сертификат, если узел не предоставил сертификат.

Сертификат узла проверяется автоматически во время фазы рукопожатия, поэтому эта функция обычно используется для получения сертификата для отображения или диагностики подключения. Он содержит информацию об узле, включая его имя хоста, издателя сертификата и открытый ключ узла.

Поскольку сертификат узла устанавливается во время фазы рукопожатия, доступ к сертификату узла из слота, подключенного к сигналу sslErrors() или encrypted(), безопасен.

Возврат пустого сертификата может означать, что SSL-рукопожатие не удалось, что у хоста, к которому вы подключены, нет сертификата или что нет подключения.

Если вы хотите проверить полную цепочку сертификатов узла, используйте peerCertificateChain() для получения всех сертификатов.

См. также peerCertificateChain().

QList<QSslCertificate> QSslSocket::peerCertificateChain() const

Возвращает цепочку цифровых сертификатов узла или пустой список сертификатов.

Сертификаты узла проверяются автоматически во время фазы рукопожатия. Эта функция обычно используется для получения сертификатов для отображения или диагностики подключения. Сертификаты содержат информацию об узле и издателях сертификатов, включая имя хоста, имена издателей и открытые ключи издателей.

Сертификаты узла устанавливаются в QSslSocket во время фазы рукопожатия, поэтому вызов этой функции из слота, подключенного к сигналу sslErrors() или encrypted(), безопасен.

Если возвращается пустой список, это может означать, что SSL-рукопожатие не удалось, что у хоста, к которому вы подключены, нет сертификата или что нет подключения.

Если нужно получить только непосредственный сертификат узла, используйте peerCertificate().

См. также peerCertificate().

int QSslSocket::peerVerifyDepth() const

Возвращает максимальное количество сертификатов в цепочке сертификатов узла, которое должно быть проверено во время фазы SSL-рукопожатия, или 0 (по умолчанию), если максимальная глубина не задана, что указывает на необходимость проверки всей цепочки сертификатов.

Сертификаты проверяются в порядке выдачи, начиная с сертификата самого узла, затем сертификата его издателя и так далее.

Эта функция была добавлена в Qt 4.4.

См. также setPeerVerifyDepth() и peerVerifyMode().

[signal] void QSslSocket::peerVerifyError(const QSslError &error)

QSslSocket может испускать этот сигнал несколько раз во время SSL-рукопожатия, прежде чем будет установлено шифрование, чтобы указать, что возникла ошибка при установлении идентичности узла. Параметр error обычно указывает на то, что QSslSocket не может безопасно идентифицировать узел.

Этот сигнал предоставляет вам раннее указание на проблему. Подключившись к этому сигналу, вы можете вручную разорвать соединение внутри подключенного слота до завершения рукопожатия. Если никаких действий не будет предпринято, QSslSocket продолжит испускать QSslSocket::sslErrors().

Эта функция была добавлена в Qt 4.4.

См. также sslErrors().

QSslSocket::PeerVerifyMode QSslSocket::peerVerifyMode() const

Возвращает режим проверки подлинности сокета. Этот режим определяет, должен ли QSslSocket запрашивать сертификат от собеседника (т.е., клиент запрашивает сертификат у сервера или сервер запрашивает сертификат у клиента), и должен ли он требовать, чтобы этот сертификат был действительным.

По умолчанию используется режим AutoVerifyPeer, который сообщает QSslSocket использовать VerifyPeer для клиентов и QueryPeer для серверов.

Эта функция была добавлена в Qt 4.4.

См. также setPeerVerifyMode(), peerVerifyDepth() и mode().

QString QSslSocket::peerVerifyName() const

Возвращает другое имя хоста для проверки сертификата, заданное с помощью setPeerVerifyName или connectToHostEncrypted.

Эта функция была добавлена в Qt 4.8.

См. также setPeerVerifyName() и connectToHostEncrypted().

[signal] void QSslSocket::preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator)

QSslSocket излучает этот сигнал при согласовании шифра PSK, а значит, впоследствии требуется аутентификация PSK.

При использовании PSK клиент должен отправить серверу действительную идентификацию и действительный предварительно согласованный ключ, чтобы рукопожатие SSL продолжилось. Приложения могут предоставить эту информацию в слоте, подключенном к этому сигналу, заполнив переданный объект authenticator в соответствии со своими потребностями.

Примечание: Игнорирование этого сигнала или невозможность предоставить необходимые учетные данные приведет к сбою рукопожатия и, следовательно, к прерыванию соединения.

Примечание: Объект authenticator принадлежит сокету и не должен удаляться приложением.

Эта функция была добавлена в Qt 5.5.

См. также QSslPreSharedKeyAuthenticator.

QSslKey QSslSocket::privateKey() const

Возвращает закрытый ключ этого сокета.

См. также setPrivateKey() и localCertificate().

QSsl::SslProtocol QSslSocket::protocol() const

Возвращает протокол SSL сокета. По умолчанию используется QSsl::SecureProtocols.

См. также setProtocol().

[virtual protected] qint64 QSslSocket::readData(char *data, qint64 maxlen)

Переопределено из QIODevice::readData().

[virtual] void QSslSocket::resume()

Переопределено из QAbstractSocket::resume().

Продолжает передачу данных по сокету после его приостановки. Если был вызван "setPauseMode(QAbstractSocket::PauseOnSslErrors);" для этого сокета и получен сигнал sslErrors(), для продолжения работы сокета необходимо вызвать этот метод.

Эта функция была добавлена в Qt 5.0.

См. также QAbstractSocket::pauseMode() и QAbstractSocket::setPauseMode().

QSslCipher QSslSocket::sessionCipher() const

Возвращает криптографический шифр шифра сокета или нулевой шифр, если соединение не зашифровано. Шифр сокета для сеанса устанавливается во время фазы рукопожатия. Шифр используется для шифрования и дешифрования данных, передаваемых через сокет.

QSslSocket также предоставляет функции для установки упорядоченного списка шифров, из которого фаза рукопожатия в конечном итоге выберет сеансовый шифр. Этот упорядоченный список должен быть создан до начала фазы рукопожатия.

См. также ciphers(), setCiphers(), setDefaultCiphers(), defaultCiphers() и supportedCiphers().

QSsl::SslProtocol QSslSocket::sessionProtocol() const

Возвращает протокол SSL/TLS сокета или UnknownProtocol, если соединение не зашифровано. Протокол сокета для сеанса устанавливается во время фазы рукопожатия.

Эта функция была добавлена в Qt 5.4.

См. также protocol() и setProtocol().

void QSslSocket::setLocalCertificate(const QSslCertificate &certificate)

Устанавливает локальный сертификат сокета на certificate. Локальный сертификат необходим, если вам нужно подтвердить свою личность собеседнику. Он используется вместе с закрытым ключом; если вы установили локальный сертификат, вы также должны установить закрытый ключ.

Локальный сертификат и закрытый ключ всегда необходимы для серверных сокетов, но также редко используются клиентами, если сервер требует аутентификации клиента.

См. также localCertificate() и setPrivateKey().

void QSslSocket::setLocalCertificate(const QString &path, QSsl::EncodingFormat format = QSsl::Pem)

Это перегруженная функция.

Устанавливает локальный сертификат сокета на первый найденный в файле path, который анализируется в соответствии с указанным форматом format.

void QSslSocket::setLocalCertificateChain(const QList<QSslCertificate> &localChain)

Устанавливает цепочку сертификатов, которая будет представлена собеседнику во время рукопожатия SSL, на localChain.

Эта функция была добавлена в Qt 5.1.

См. также localCertificateChain() и QSslConfiguration::setLocalCertificateChain().

void QSslSocket::setPeerVerifyDepth(int depth)

Устанавливает максимальное количество сертификатов в цепочке сертификатов собеседника, которые будут проверены во время фазы рукопожатия SSL, на depth. Установка depth 0 означает, что максимальная глубина не установлена, что означает, что вся цепочка сертификатов должна быть проверена.

Сертификаты проверяются в порядке выдачи, начиная с собственного сертификата собеседника, затем сертификата его издателя и так далее.

Эта функция была добавлена в Qt 4.4.

См. также peerVerifyDepth() и setPeerVerifyMode().

void QSslSocket::setPeerVerifyMode(QSslSocket::PeerVerifyMode mode)

Устанавливает режим проверки подлинности сокета на mode. Этот режим определяет, должен ли QSslSocket запрашивать сертификат от собеседника (т.е., клиент запрашивает сертификат у сервера или сервер запрашивает сертификат у клиента), и должен ли он требовать, чтобы этот сертификат был действительным.

По умолчанию используется режим AutoVerifyPeer, который сообщает QSslSocket использовать VerifyPeer для клиентов и QueryPeer для серверов.

Установка этого режима после начала шифрования не влияет на текущее соединение.

Эта функция была добавлена в Qt 4.4.

См. также peerVerifyMode(), setPeerVerifyDepth() и mode().

void QSslSocket::setPeerVerifyName(const QString &hostName)

Устанавливает другое имя хоста, заданное hostName, для проверки сертификата вместо имени, используемого для TCP-соединения.

Эта функция была добавлена в Qt 4.8.

См. также peerVerifyName() и connectToHostEncrypted().

void QSslSocket::setPrivateKey(const QSslKey &key)

Устанавливает закрытый ключ сокета на key. Закрытый ключ и локальный сертификат используются клиентами и серверами, которые должны подтвердить свою личность для собеседников SSL.

И ключ, и локальный сертификат необходимы для создания SSL-серверного сокета. Если вы создаете SSL-клиентский сокет, ключ и локальный сертификат необходимы, если ваш клиент должен идентифицироваться для SSL-сервера.

См. также privateKey() и setLocalCertificate().

void QSslSocket::setPrivateKey(const QString &fileName, QSsl::KeyAlgorithm algorithm = QSsl::Rsa, QSsl::EncodingFormat format = QSsl::Pem, const QByteArray &passPhrase = QByteArray())

Это перегруженный метод.

Считывает строку из файла fileName и декодирует её с использованием заданного algorithm и кодировки format для построения ключа SSL. Если закодированный ключ зашифрован, то passPhrase используется для его расшифровки.

Приватный ключ сокета устанавливается на созданный ключ. Приватный ключ и локальный сертификат используются клиентами и серверами, которые должны доказать свою личность для узлов SSL.

И ключ, и локальный сертификат необходимы, если вы создаёте сокет SSL-сервера. Если вы создаёте сокет SSL-клиента, ключ и локальный сертификат необходимы, если ваш клиент должен идентифицировать себя для SSL-сервера.

См. также privateKey() и setLocalCertificate().

void QSslSocket::setProtocol(QSsl::SslProtocol protocol)

Устанавливает протокол SSL сокета на protocol. Это повлияет на следующий начатый обмен; вызов этой функции для уже зашифрованного сокета не повлияет на протокол сокета.

См. также protocol().

[virtual] void QSslSocket::setReadBufferSize(qint64 size)

Переопределено из QAbstractSocket::setReadBufferSize().

Устанавливает размер внутреннего буфера чтения QSslSocket на size байт.

Эта функция была добавлена в Qt 4.4.

[virtual] bool QSslSocket::setSocketDescriptor(qintptr socketDescriptor, SocketState state = ConnectedState, OpenMode openMode = ReadWrite)

Переопределено из QAbstractSocket::setSocketDescriptor().

Инициализирует QSslSocket с дескриптором сокета socketDescriptor. Возвращает true если socketDescriptor принят как действительный дескриптор сокета; в противном случае возвращает false. Сокет открывается в режиме, указанном openMode, и переходит в состояние сокета, указанное state.

Примечание: Невозможно инициализировать два сокета с одним и тем же дескриптором сокета.

См. также socketDescriptor().

[virtual] void QSslSocket::setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value)

Переопределено из QAbstractSocket::setSocketOption().

Устанавливает заданный option на значение, описанное value.

Эта функция была добавлена в Qt 4.6.

См. также socketOption().

void QSslSocket::setSslConfiguration(const QSslConfiguration &configuration)

Устанавливает конфигурацию SSL сокета на содержимое configuration. Эта функция устанавливает локальный сертификат, шифры, приватный ключ и сертификаты CA на те, что хранятся в configuration.

Невозможно установить поля, связанные с состоянием SSL.

Эта функция была добавлена в Qt 4.4.

См. также sslConfiguration(), setLocalCertificate(), setPrivateKey(), setCaCertificates(), и setCiphers().

[virtual] QVariant QSslSocket::socketOption(QAbstractSocket::SocketOption option)

Переопределено из QAbstractSocket::socketOption().

Возвращает значение опции option.

Эта функция была добавлена в Qt 4.6.

См. также setSocketOption().

QSslConfiguration QSslSocket::sslConfiguration() const

Возвращает состояние конфигурации SSL сокета. По умолчанию конфигурация SSL сокета использует стандартные шифры, стандартные сертификаты CA, без локального приватного ключа или сертификата.

Конфигурация SSL также содержит поля, которые могут меняться со временем без уведомления.

Эта функция была добавлена в Qt 4.4.

См. также setSslConfiguration(), localCertificate(), peerCertificate(), peerCertificateChain(), sessionCipher(), privateKey(), ciphers(), и caCertificates().

QList<QSslError> QSslSocket::sslErrors() const

Возвращает список последних ошибок SSL, произошедших. Этот список совпадает со списком, который QSslSocket передает через сигнал sslErrors(). Если соединение было зашифровано без ошибок, эта функция вернёт пустой список.

См. также connectToHostEncrypted().

[signal] void QSslSocket::sslErrors(const QList<QSslError> &errors)

QSslSocket излучает этот сигнал после SSL-рукопожатия, чтобы указать, что произошла одна или несколько ошибок при установлении подлинности узла. Ошибки, как правило, указывают на то, что QSslSocket не может безопасно идентифицировать узел. Если никаких действий не будет предпринято, соединение будет разорвано после излучения этого сигнала.

Если вы хотите продолжить подключение, несмотря на произошедшие ошибки, вы должны вызвать QSslSocket::ignoreSslErrors() из слота, подключенного к этому сигналу. Если вам нужно получить доступ к списку ошибок позже, вы можете вызвать sslErrors() (без аргументов).

errors содержит одну или несколько ошибок, которые препятствуют QSslSocket в проверке подлинности узла.

Примечание: Вы не можете использовать Qt::QueuedConnection при подключении к этому сигналу, или вызов QSslSocket::ignoreSslErrors() не будет иметь никакого эффекта.

Примечание: Сигнал sslErrors перегружен в этом классе. Чтобы подключиться к этому сигналу с помощью синтаксиса указателя на функцию, вам необходимо указать тип сигнала в статическом преобразовании, как показано в этом примере:

connect(sslSocket, static_cast<void(QSslSocket::*)(const QList<QSslError> &)>(&QSslSocket::sslErrors),
    [=](const QList<QSslError> &errors){ /* ... */ });

См. также peerVerifyError().

[static] long QSslSocket::sslLibraryBuildVersionNumber()

Возвращает номер версии используемой в момент компиляции библиотеки SSL. Если поддержка SSL недоступна, то возвращает неопределённое значение.

Эта функция была добавлена в Qt 5.4.

См. также sslLibraryVersionNumber().

[static] QString QSslSocket::sslLibraryBuildVersionString()

Возвращает строку версии используемой в момент компиляции библиотеки SSL. Если поддержка SSL недоступна, то возвращает пустую строку.

Эта функция была добавлена в Qt 5.4.

См. также sslLibraryVersionString().

[static] long QSslSocket::sslLibraryVersionNumber()

Возвращает номер версии используемой библиотеки SSL. Обратите внимание, что это версия библиотеки, используемой во время выполнения, а не во время компиляции. Если поддержка SSL недоступна, то возвращает неопределённое значение.

Эта функция была добавлена в Qt 5.0.

[static] QString QSslSocket::sslLibraryVersionString()

Возвращает строку версии используемой библиотеки SSL. Обратите внимание, что это версия библиотеки, используемой во время выполнения, а не во время компиляции. Если поддержка SSL недоступна, то возвращает пустую строку.

Эта функция была добавлена в Qt 5.0.

[slot] void QSslSocket::startClientEncryption()

Начинает отложенное SSL-рукопожатие для соединения клиента. Эту функцию можно вызвать, когда сокет находится в состоянии ConnectedState, но все ещё в режиме UnencryptedMode. Если он ещё не подключён или уже зашифрован, эта функция не имеет эффекта.

Клиенты, которые реализуют функциональность STARTTLS, часто используют отложенные SSL-рукопожатия. Большинство других клиентов могут избежать непосредственного вызова этой функции, используя connectToHostEncrypted() вместо этого, что автоматически выполняет рукопожатие.

См. также connectToHostEncrypted() и startServerEncryption().

[slot] void QSslSocket::startServerEncryption()

Начинает отложенный SSL-handshake для серверного подключения. Данная функция может быть вызвана, когда сокет находится в состоянии ConnectedState, но всё ещё в UnencryptedMode. Если сокет не подключен или уже зашифрован, функция не оказывает никакого эффекта.

Для серверных сокетов вызов этой функции является единственным способом инициировать SSL-handshake. Большинство серверов вызовут эту функцию сразу после получения подключения или в результате получения специфической для протокола команды для перехода в SSL-режим (например, сервер может ответить на получение строки "STARTTLS\r\n" вызовом этой функции).

Наиболее распространённый способ реализации SSL-сервера — создание подкласса QTcpServer и переопределение QTcpServer::incomingConnection(). Описатель сокета, возвращаемый данной функцией, затем передаётся в QSslSocket::setSocketDescriptor().

См. также connectToHostEncrypted() и startClientEncryption().

[static] bool QSslSocket::supportsSsl()

Возвращает true, если платформа поддерживает SSL; в противном случае возвращает false. Если платформа не поддерживает SSL, сокет потерпит неудачу на стадии подключения.

[virtual] bool QSslSocket::waitForBytesWritten(int msecs = 30000)

Переопределено из QIODevice::waitForBytesWritten().

[virtual] bool QSslSocket::waitForConnected(int msecs = 30000)

Переопределено из QAbstractSocket::waitForConnected().

Ожидает подключения сокета или истечения msecs миллисекунд, в зависимости от того, что произойдёт раньше. Если соединение установлено, функция возвращает true; в противном случае она возвращает false.

См. также QAbstractSocket::waitForConnected().

[virtual] bool QSslSocket::waitForDisconnected(int msecs = 30000)

Переопределено из QAbstractSocket::waitForDisconnected().

Ожидает разъединения сокета или истечения msecs миллисекунд, в зависимости от того, что произойдёт раньше. Если соединение разъединено, функция возвращает true; в противном случае она возвращает false.

См. также QAbstractSocket::waitForDisconnected().

bool QSslSocket::waitForEncrypted(int msecs = 30000)

Ожидает, пока сокет завершит SSL-handshake и испустит сигнал encrypted(), или истечения msecs миллисекунд, в зависимости от того, что произойдёт раньше. Если сигнал encrypted() был испущен, функция возвращает true; в противном случае (например, сокет разъединён или SSL-handshake завершается неудачно), возвращается false.

Следующий пример ожидает до одной секунды, пока сокет не станет зашифрованным:

socket->connectToHostEncrypted("imap", 993);
if (socket->waitForEncrypted(1000))
    qDebug("Encrypted!");

Если msecs равно -1, эта функция не будет ожидать.

См. также startClientEncryption(), startServerEncryption(), encrypted() и isEncrypted().

[virtual] bool QSslSocket::waitForReadyRead(int msecs = 30000)

Переопределено из QIODevice::waitForReadyRead().

[virtual protected] qint64 QSslSocket::writeData(const char *data, qint64 len)

Переопределено из QIODevice::writeData().

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.6/qsslsocket.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API