Класс QSslSocket
Класс QSslSocket предоставляет сокет с SSL-шифрованием для клиентов и серверов. Подробнее...
| Заголовок: | #include <QSslSocket> |
| qmake: | QT += network |
| С момента: | Qt 4.3 |
| Наследуется от: | QTcpSocket |
Этот класс был представлен в Qt 4.3.
Примечание: Все функции этого класса являются перевзаимодействующими.
Публичные типы
| Перечисление | PeerVerifyMode { VerifyNone, QueryPeer, VerifyPeer, AutoVerifyPeer } |
| Перечисление | SslMode { UnencryptedMode, SslClientMode, SslServerMode } |
Публичные функции
| QSslSocket(QObject *parent = nullptr) | |
| virtual | ~QSslSocket() |
| void | abort() |
| void | connectToHostEncrypted(const QString &hostName, quint16 port, QIODevice::OpenMode mode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol) |
| void | connectToHostEncrypted(const QString &hostName, quint16 port, const QString &sslPeerName, QIODevice::OpenMode mode = ReadWrite, QAbstractSocket::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 |
| QSslSocket::SslMode | mode() const |
| QVector<QOcspResponse> | ocspResponses() 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> | sslHandshakeErrors() const |
| bool | waitForEncrypted(int msecs = 30000) |
Реализованные публичные функции
| виртуальный bool | atEnd() const override |
| виртуальный qint64 | bytesAvailable() const override |
| виртуальный qint64 | bytesToWrite() const override |
| виртуальный bool | canReadLine() const override |
| виртуальный void | close() override |
| виртуальный void | resume() override |
| виртуальный void | setReadBufferSize(qint64 size) override |
| виртуальный bool | setSocketDescriptor(qintptr socketDescriptor, QAbstractSocket::SocketState state = ConnectedState, QIODevice::OpenMode openMode = ReadWrite) override |
| виртуальный void | setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value) override |
| виртуальный QVariant | socketOption(QAbstractSocket::SocketOption option) override |
| виртуальный bool | waitForBytesWritten(int msecs = 30000) override |
| виртуальный bool | waitForConnected(int msecs = 30000) override |
| виртуальный bool | waitForDisconnected(int msecs = 30000) override |
| виртуальный bool | waitForReadyRead(int msecs = 30000) override |
Публичные слоты
| void | ignoreSslErrors() |
| void | startClientEncryption() |
| void | startServerEncryption() |
Сигналы
| void | encrypted() |
| void | encryptedBytesWritten(qint64 written) |
| void | modeChanged(QSslSocket::SslMode mode) |
| void | newSessionTicketReceived() |
| void | peerVerifyError(const QSslError &error) |
| void | preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator) |
| void | sslErrors(const QList<QSslError> &errors) |
Статические публичные члены
| long | sslLibraryBuildVersionNumber() |
| QString | sslLibraryBuildVersionString() |
| long | sslLibraryVersionNumber() |
| QString | sslLibraryVersionString() |
| bool | supportsSsl() |
Переопределённые защищённые функции
| виртуальный qint64 | readData(char *data, qint64 maxlen) override |
| виртуальный qint64 | writeData(const char *data, qint64 len) override |
Подробное описание
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 для обработки криптографических шифров, закрытых ключей и локальных, партнёрских и сертификационных (CA) сертификатов. Он также предоставляет API для обработки ошибок, возникающих во время фазы рукопожатия.
Следующие возможности также можно настроить:
- Криптографический набор шифров сокета можно настроить до фазы рукопожатия с помощью QSslConfiguration::setCiphers() и QSslConfiguration::setDefaultCiphers().
- Локальный сертификат и закрытый ключ сокета можно настроить до фазы рукопожатия с помощью setLocalCertificate() и setPrivateKey().
- Базу данных сертификатов CA можно расширить и настроить с помощью QSslConfiguration::addCaCertificate(), QSslConfiguration::addCaCertificates().
Для расширения списка стандартных сертификатов CA, используемых сокетами SSL во время фазы SSL рукопожатия, необходимо обновить конфигурацию по умолчанию, как показано в примере ниже:
QList<QSslCertificate> certificates = getCertificates(); QSslConfiguration configuration = QSslConfiguration::defaultConfiguration(); configuration.addCaCertificates(certificates); QSslConfiguration::setDefaultConfiguration(configuration);
Примечание: Если доступны, корневые сертификаты в 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.
Документация по типам членов
перечисление QSslSocket::PeerVerifyMode
Описывает режимы проверки подлинности клиента для QSslSocket. Режим по умолчанию — AutoVerifyPeer, который выбирает подходящий режим в зависимости от QSocket::SslMode сокета.
| Константа | Значение | Описание |
|---|---|---|
QSslSocket::VerifyNone |
0 |
QSslSocket не запросит сертификат у клиента. Этот режим можно установить, если вас не интересует идентичность другой стороны подключения. Подключение все равно будет зашифровано, и ваш сокет по-прежнему будет отправлять свой локальный сертификат клиенту, если это запрошено. |
QSslSocket::QueryPeer |
1 |
QSslSocket запросит сертификат у клиента, но не требует, чтобы этот сертификат был действительным. Это полезно, когда вы хотите отобразить детали сертификата клиента пользователю, не влияя на фактическое SSL рукопожатие. Этот режим является стандартным для серверов. Примечание: в Schannel это значение работает так же, как VerifyNone. |
QSslSocket::VerifyPeer |
2 |
QSslSocket запросит сертификат у клиента во время фазы SSL рукопожатия и потребует, чтобы этот сертификат был действительным. В случае сбоя QSslSocket отправит сигнал QSslSocket::sslErrors(). Этот режим является стандартным для клиентов. |
QSslSocket::AutoVerifyPeer |
3 |
QSslSocket автоматически будет использовать QueryPeer для серверных сокетов и VerifyPeer для клиентских сокетов. |
Это перечисление было введено или изменено в Qt 4.4.
См. также QSslSocket::peerVerifyMode().
перечисление 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 = nullptr)
Создает объект QSslSocket. parent передается в конструктор QObject. Новый набор шифров сокета устанавливается в значение, возвращенное статическим методом defaultCiphers().
[signal] void QSslSocket::encrypted()
Этот сигнал испускается, когда QSslSocket переходит в зашифрованный режим. После испускания этого сигнала QSslSocket::isEncrypted() вернет true, и все дальнейшие передачи по сокету будут зашифрованы.
См. также QSslSocket::connectToHostEncrypted() и QSslSocket::isEncrypted().
[signal] void QSslSocket::encryptedBytesWritten(qint64 written)
Этот сигнал испускается, когда QSslSocket записывает свои зашифрованные данные в сеть. Параметр written содержит количество успешно записанных байтов.
Эта функция была введена в Qt 4.4.
См. также QIODevice::bytesWritten().
[slot] void QSslSocket::ignoreSslErrors()
Этот слот сообщает QSslSocket игнорировать ошибки во время фазы рукопожатия QSslSocket и продолжить подключение. Если вы хотите продолжить подключение, даже если при рукопожатии произойдут ошибки, необходимо вызвать этот слот, либо из слота, подключенного к sslErrors(), либо до фазы рукопожатия. Если вы не вызываете этот слот, ни в ответ на ошибки, ни перед рукопожатием, подключение будет разорвано после испускания сигнала sslErrors().
Если во время фазы SSL рукопожатия ошибок не произошло (т.е., идентичность клиента установлена без проблем), QSslSocket не отправит сигнал sslErrors(), и вызывать эту функцию не нужно.
Предупреждение: Убедитесь, что пользователь всегда проверяет ошибки, сообщенные сигналом sslErrors(), и только вызывайте этот метод после подтверждения пользователем, что продолжение приемлемо. Если возникнут непредвиденные ошибки, подключение должно быть прервано. Вызов этого метода без проверки фактических ошибок, скорее всего, создаст угрозу безопасности для вашего приложения. Используйте его с большой осторожностью!
См. также sslErrors().
[signal] void QSslSocket::modeChanged(QSslSocket::SslMode mode)
Этот сигнал испускается, когда QSslSocket переключается из QSslSocket::UnencryptedMode в QSslSocket::SslClientMode или QSslSocket::SslServerMode. mode — новый режим.
См. также QSslSocket::mode().
[signal] void QSslSocket::newSessionTicketReceived()
Если протокол TLS 1.3 был согласован во время рукопожатия, QSslSocket отправляет этот сигнал после получения сообщения NewSessionTicket. Срок действия сеанса и подсказка о времени жизни билета сеанса обновляются в конфигурации сокета. Сеанс может быть использован для возобновления сеанса (и сокращенного рукопожатия) в будущих TLS подключениях.
Примечание: Эта функция доступна только с бэкендом OpenSSL и требует OpenSSL версии 1.1.1 или выше.
Эта функция была введена в Qt 5.15.
См. также QSslSocket::sslConfiguration(), QSslConfiguration::sessionTicket() и QSslConfiguration::sessionTicketLifeTimeHint().
[signal] void QSslSocket::peerVerifyError(const QSslError &error)
QSslSocket может отправлять этот сигнал несколько раз во время SSL рукопожатия, прежде чем будет установлено шифрование, чтобы указать, что произошла ошибка при установлении идентичности клиента. Обычно error указывает на то, что QSslSocket не может безопасно идентифицировать клиента.
Этот сигнал предоставляет вам раннее указание на то, что что-то не так. Подключившись к этому сигналу, вы можете вручную выбрать разрыв подключения из подключенного слота до завершения рукопожатия. Если никаких действий не предпринято, QSslSocket продолжит отправку QSslSocket::sslErrors().
Эта функция была введена в Qt 4.4.
См. также sslErrors().
END_OF_DOCUMENT_MARKER
[signal] void QSslSocket::preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator)
QSslSocket излучает этот сигнал, когда он согласовывает шифр с предварительно общим ключом, а поэтому требуется аутентификация с предварительно общим ключом.
При использовании предварительно общего ключа клиент должен отправить серверу действительный идентификатор и действительный предварительно общий ключ, чтобы рукопожатие SSL продолжилось. Приложения могут предоставить эту информацию в слоте, подключенном к этому сигналу, заполнив переданный объект authenticator в соответствии со своими потребностями.
Примечание: Игнорирование этого сигнала или невозможность предоставить необходимые учетные данные приведет к сбою рукопожатия и, следовательно, к прерыванию соединения.
Примечание: Объект authenticator принадлежит сокету и не должен удаляться приложением.
Эта функция была добавлена в Qt 5.5.
См. также QSslPreSharedKeyAuthenticator.
[signal] void QSslSocket::sslErrors(const QList<QSslError> &errors)
QSslSocket излучает этот сигнал после рукопожатия SSL, чтобы указать, что возникли одна или несколько ошибок при установлении идентификатора удаленного узла. Ошибки обычно указывают на то, что QSslSocket не может безопасно идентифицировать удаленный узел. Если не предпринять никаких действий, соединение будет прервано после излучения этого сигнала.
Если вы хотите продолжить подключение несмотря на возникшие ошибки, вы должны вызвать QSslSocket::ignoreSslErrors() изнутри слота, подключенного к этому сигналу. Если вам нужно получить доступ к списку ошибок позже, вы можете вызвать sslHandshakeErrors().
errors содержит одну или несколько ошибок, которые препятствуют QSslSocket в проверке идентификатора удаленного узла.
Примечание: Вы не можете использовать Qt::QueuedConnection при подключении к этому сигналу, в противном случае вызов QSslSocket::ignoreSslErrors() не окажет никакого эффекта.
Примечание: Сигнал sslErrors перегружен в этом классе. Для подключения к этому сигналу с помощью синтаксиса указателя на функцию Qt предоставляет удобную вспомогательную функцию для получения указателя на функцию, как показано в этом примере:
connect(sslSocket, QOverload<const QList<QSslError> &>::of(&QSslSocket::sslErrors),
[=](const QList<QSslError> &errors){ /* ... */ }); См. также peerVerifyError().
[slot] void QSslSocket::startClientEncryption()
Запускает отложенное рукопожатие SSL для подключения клиента. Эту функцию можно вызвать, когда сокет находится в состоянии ConnectedState, но все еще в UnencryptedMode. Если он еще не подключен или уже зашифрован, эта функция не окажет никакого эффекта.
Клиенты, реализующие функциональность STARTTLS, часто используют отложенные рукопожатия SSL. Большинство других клиентов могут избежать непосредственного вызова этой функции, используя connectToHostEncrypted() вместо, что автоматически выполняет рукопожатие.
См. также connectToHostEncrypted() и startServerEncryption().
[slot] void QSslSocket::startServerEncryption()
Запускает отложенное SSL-рукопожатие для серверного соединения. Эту функцию можно вызвать, когда сокет находится в состоянии ConnectedState, но все еще в состоянии UnencryptedMode. Если сокет не подключен или уже зашифрован, функция не окажет никакого эффекта.
Для серверных сокетов вызов этой функции является единственным способом инициировать SSL-рукопожатие. Большинство серверов вызовут эту функцию сразу после получения подключения или в результате получения команды протокола для перехода в SSL-режим (например, сервер может ответить на получение строки "STARTTLS\r\n" вызовом этой функции).
Наиболее распространенный способ реализации SSL-сервера — создание подкласса QTcpServer и переопределение QTcpServer::incomingConnection(). Полученный дескриптор сокета затем передается в QSslSocket::setSocketDescriptor().
См. также connectToHostEncrypted() и startClientEncryption().
[virtual] QSslSocket::~QSslSocket()
Уничтожает QSslSocket.
void QSslSocket::abort()
Прерывает текущее соединение и сбрасывает сокет. В отличие от disconnectFromHost(), эта функция немедленно закрывает сокет, очищая любые ожидающие данные в буфере записи.
См. также disconnectFromHost() и close().
[override virtual] bool QSslSocket::atEnd() const
Переопределяет: QAbstractSocket::atEnd() const.
[override virtual] qint64 QSslSocket::bytesAvailable() const
Переопределяет: QAbstractSocket::bytesAvailable() const.
Возвращает количество расшифрованных байтов, которые немедленно доступны для чтения.
[override virtual] qint64 QSslSocket::bytesToWrite() const
Переопределяет: QAbstractSocket::bytesToWrite() const.
Возвращает количество незашифрованных байтов, которые ожидают зашифрования и записи в сеть.
[override virtual] bool QSslSocket::canReadLine() const
Переопределяет: QAbstractSocket::canReadLine() const.
Возвращает true, если можно прочитать одну строку (завершается одиночным символом ASCII '\n') расшифрованных символов; в противном случае возвращается false.
[override virtual] void QSslSocket::close()
Переопределяет: QAbstractSocket::close().
void QSslSocket::connectToHostEncrypted(const QString &hostName, quint16 port, QIODevice::OpenMode mode = ReadWrite, QAbstractSocket::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, QIODevice::OpenMode mode = ReadWrite, QAbstractSocket::NetworkLayerProtocol protocol = AnyIPProtocol)
Это перегруженная функция.
Помимо исходного поведения connectToHostEncrypted, этот перегруженный метод позволяет использовать другой хост-имя (sslPeerName) для проверки сертификата вместо имени хоста, используемого для TCP-соединения (hostName).
Данная функция была введена в Qt 4.6.
См. также connectToHostEncrypted().
qint64 QSslSocket::encryptedBytesAvailable() const
Возвращает количество зашифрованных байтов, ожидающих дешифрования. Обычно эта функция возвращает 0, так как QSslSocket дешифрует входящие данные как только это возможно.
Эта функция была введена в Qt 4.4.
qint64 QSslSocket::encryptedBytesToWrite() const
Возвращает количество зашифрованных байтов, ожидающих записи в сеть.
Эта функция была введена в Qt 4.4.
bool QSslSocket::flush()
Эта функция записывает как можно больше данных из внутреннего буфера записи в подлежащий сетевой сокет без блокировки. Если данные были записаны, эта функция возвращает true; в противном случае возвращается false.
Вызовите эту функцию, если вам нужно, чтобы QSslSocket немедленно начал отправлять буферизованные данные. Количество успешно записанных байтов зависит от операционной системы. В большинстве случаев вызывать эту функцию не нужно, так как QAbstractSocket начнёт отправлять данные автоматически после возврата управления в цикл событий. В отсутствие цикла событий, вызовите waitForBytesWritten() вместо этого.
См. также write() и waitForBytesWritten().
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() и sslHandshakeErrors().
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().
QSslSocket::SslMode QSslSocket::mode() const
Возвращает текущий режим сокета; либо UnencryptedMode, где QSslSocket ведет себя идентично QTcpSocket, либо один из режимов SslClientMode или SslServerMode, где клиент либо в процессе согласования, либо в зашифрованном режиме.
При изменении режима QSslSocket излучает modeChanged()
См. также SslMode.
QVector<QOcspResponse> QSslSocket::ocspResponses() const
Эта функция возвращает ответы протокола статуса онлайн-сертификатов, которые сервер может отправить во время рукопожатия TLS с использованием OCSP-закрепления. Вектор пуст, если не был получен определенный ответ или вообще не было получено ответа.
Эта функция была введена в Qt 5.13.
См. также QSslConfiguration::setOcspStaplingEnabled().
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().
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().
QSslKey QSslSocket::privateKey() const
Возвращает закрытый ключ этого сокета.
См. также setPrivateKey() и localCertificate().
QSsl::SslProtocol QSslSocket::protocol() const
Возвращает протокол SSL сокета. По умолчанию используется QSsl::SecureProtocols.
См. также setProtocol().
[override virtual protected] qint64 QSslSocket::readData(char *data, qint64 maxlen)
Переопределяет: QAbstractSocket::readData(char *data, qint64 maxSize).
[override virtual] void QSslSocket::resume()
Переопределяет: QAbstractSocket::resume().
Продолжает передачу данных по сокету после его приостановки. Если для этого сокета был вызван "setPauseMode(QAbstractSocket::PauseOnSslErrors);" и поступило событие sslErrors(), для продолжения работы сокета необходимо вызвать этот метод.
Данная функция была введена в Qt 5.0.
См. также QAbstractSocket::pauseMode() и QAbstractSocket::setPauseMode().
QSslCipher QSslSocket::sessionCipher() const
Возвращает криптографическое шифрование сокета или null-шифрование, если соединение не зашифровано. Шифрование сокета для сеанса устанавливается во время фазы рукопожатия. Шифрование используется для шифрования и дешифрования данных, передаваемых через сокет.
QSslSocket также предоставляет функции для установки упорядоченного списка шифров, из которых фаза рукопожатия в конечном итоге выберет шифрование сеанса. Этот упорядоченный список должен быть задан перед началом фазы рукопожатия.
См. также QSslConfiguration::ciphers(), QSslConfiguration::setCiphers(), QSslConfiguration::setCiphers(), QSslConfiguration::ciphers() и QSslConfiguration::supportedCiphers().
QSsl::SslProtocol QSslSocket::sessionProtocol() const
Возвращает протокол SSL/TLS сокета или UnknownProtocol, если соединение не зашифровано. Протокол сокета для сеанса устанавливается во время фазы рукопожатия.
Данная функция была введена в Qt 5.4.
См. также protocol() и setProtocol().
void QSslSocket::setLocalCertificate(const QSslCertificate &certificate)
Устанавливает локальный сертификат сокета на certificate. Локальный сертификат необходим, если вам нужно подтвердить свою личность для удаленного узла. Он используется совместно с закрытым ключом; если вы установили локальный сертификат, вы также должны установить закрытый ключ.
Локальный сертификат и закрытый ключ всегда необходимы для серверных сокетов, но редко используются клиентскими сокетами, если сервер требует аутентификации клиента.
Примечание: Безопасный транспорт SSL бэкенд на macOS может обновить стандартный хранилище ключей (по умолчанию, вероятно, хранилище ключей вашей учетной записи) путем импорта ваших локальных сертификатов и ключей. Это также может привести к появлению системных диалоговых окон, запрашивающих разрешение, когда ваше приложение использует эти закрытые ключи. Если такого поведения следует избегать, установите переменную среды QT_SSL_USE_TEMPORARY_KEYCHAIN с ненулевым значением; это заставит QSslSocket использовать своё временное хранилище ключей.
См. также 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. Установка глубины 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().
[override virtual] void QSslSocket::setReadBufferSize(qint64 size)
Переопределяет: QAbstractSocket::setReadBufferSize(qint64 size).
Устанавливает размер внутреннего буфера чтения QSslSocket на size байт.
Данная функция была введена в Qt 4.4.
[override virtual] bool QSslSocket::setSocketDescriptor(qintptr socketDescriptor, QAbstractSocket::SocketState state = ConnectedState, QIODevice::OpenMode openMode = ReadWrite)
Переопределяет: QAbstractSocket::setSocketDescriptor(qintptr socketDescriptor, QAbstractSocket::SocketState socketState, QIODevice::OpenMode openMode).
Инициализирует QSslSocket с помощью дескриптора сокета socketDescriptor. Возвращает true, если socketDescriptor принят как допустимый дескриптор сокета; в противном случае возвращает false. Сокет открывается в режиме, указанном в openMode, и переходит в состояние сокета, указанное в state.
Примечание: Невозможно инициализировать два сокета с помощью одного и того же дескриптора сокета.
См. также socketDescriptor().
[override virtual] void QSslSocket::setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value)
Переопределяет: QAbstractSocket::setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value).
Устанавливает заданный option в значение, описанное value.
Эта функция была добавлена в Qt 4.6.
См. также socketOption().
void QSslSocket::setSslConfiguration(const QSslConfiguration &configuration)
Устанавливает конфигурацию SSL сокета на содержимое configuration. Эта функция устанавливает локальный сертификат, шифры, приватный ключ и сертификаты CA на значения, сохранённые в configuration.
Невозможно установить поля, связанные с состоянием SSL.
Эта функция была добавлена в Qt 4.4.
См. также sslConfiguration(), setLocalCertificate(), setPrivateKey(), QSslConfiguration::setCaCertificates(), и QSslConfiguration::setCiphers().
[override virtual] QVariant QSslSocket::socketOption(QAbstractSocket::SocketOption option)
Переопределяет: QAbstractSocket::socketOption(QAbstractSocket::SocketOption option).
Возвращает значение параметра option.
Эта функция была добавлена в Qt 4.6.
См. также setSocketOption().
QSslConfiguration QSslSocket::sslConfiguration() const
Возвращает состояние конфигурации SSL сокета. По умолчанию конфигурация SSL сокета использует стандартные шифры, стандартные сертификаты CA, без локального приватного ключа или сертификата.
Конфигурация SSL также содержит поля, которые могут изменяться со временем без уведомления.
Эта функция была добавлена в Qt 4.4.
См. также setSslConfiguration(), localCertificate(), peerCertificate(), peerCertificateChain(), sessionCipher(), privateKey(), QSslConfiguration::ciphers(), и QSslConfiguration::caCertificates().
QList<QSslError> QSslSocket::sslHandshakeErrors() const
Возвращает список последних ошибок SSL, которые произошли. Этот список совпадает со списком, который QSslSocket передаёт через сигнал sslErrors(). Если соединение зашифровано без ошибок, эта функция вернёт пустой список.
Эта функция была добавлена в Qt 5.15.
См. также connectToHostEncrypted().
[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.
[static] bool QSslSocket::supportsSsl()
Возвращает true, если платформа поддерживает SSL; в противном случае возвращает false. Если платформа не поддерживает SSL, сокет завершит соединение с ошибкой.
[override virtual] bool QSslSocket::waitForBytesWritten(int msecs = 30000)
Переопределяет: QAbstractSocket::waitForBytesWritten(int msecs).
[override virtual] bool QSslSocket::waitForConnected(int msecs = 30000)
Переопределяет: QAbstractSocket::waitForConnected(int msecs).
Ожидает, пока сокет не будет подключён или не пройдёт msecs миллисекунд, в зависимости от того, что произойдёт раньше. Если соединение установлено, функция возвращает true; в противном случае возвращает false.
См. также QAbstractSocket::waitForConnected().
[override virtual] bool QSslSocket::waitForDisconnected(int msecs = 30000)
Переопределяет: QAbstractSocket::waitForDisconnected(int msecs).
Ожидает, пока сокет не будет отключён или не пройдёт msecs миллисекунд, в зависимости от того, что произойдёт раньше. Если соединение отключено, функция возвращает true; в противном случае возвращает false.
См. также QAbstractSocket::waitForDisconnected().
bool QSslSocket::waitForEncrypted(int msecs = 30000)
Ожидает, пока сокет завершит рукопожатие SSL и не выпустит encrypted(), или не пройдёт msecs миллисекунд, в зависимости от того, что произойдёт раньше. Если encrypted() был выпущен, функция возвращает true; в противном случае (например, сокет отключён или рукопожатие SSL не удалось), возвращается false.
Следующий пример ждёт до одной секунды, пока сокет не будет зашифрован:
socket->connectToHostEncrypted("imap", 993);
if (socket->waitForEncrypted(1000))
qDebug("Encrypted!"); Если msecs равно -1, эта функция не будет ждать таймаута.
См. также startClientEncryption(), startServerEncryption(), encrypted(), и isEncrypted().
[override virtual] bool QSslSocket::waitForReadyRead(int msecs = 30000)
Переопределяет: QAbstractSocket::waitForReadyRead(int msecs).
[override virtual protected] qint64 QSslSocket::writeData(const char *data, qint64 len)
Переопределяет: QAbstractSocket::writeData(const char *data, qint64 size).
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qsslsocket.html