Класс 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) | |
| виртуальный | ~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, 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 |
Переопределённые публичные функции
| виртуальный 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 |
Public Slots
| void | ignoreSslErrors() |
| void | startClientEncryption() |
| void | startServerEncryption() |
Signals
| 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) |
Static Public Members
| 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() |
Reimplemented Protected Functions
| виртуальный qint64 | readData(char *data, qint64 maxlen) override |
| виртуальный qint64 | writeData(const char *data, qint64 len) override |
Detailed Description
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 для обработки ошибок, возникающих во время фазы рукопожатия.
Следующие функции также могут быть настроены:
- Криптографический набор шифров сокета можно настроить до фазы рукопожатия с помощью QSslConfiguration::setCiphers() и QSslConfiguration::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.
Документация типов членов
перечисление 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::peerVerifyError(const QSslError &error)
QSslSocket может испускать этот сигнал несколько раз во время SSL-рукопожатия, прежде чем будет установлено шифрование, чтобы указать, что при установлении подлинности клиента произошла ошибка. Ошибка обычно указывает, что QSslSocket не может безопасно идентифицировать клиента.
Этот сигнал предоставляет вам раннее уведомление о проблемах. Подключившись к этому сигналу, вы можете вручную выбрать разрыв соединения из связанного слота до завершения рукопожатия. Если никаких действий не будет предпринято, QSslSocket продолжит испускание QSslSocket::sslErrors().
Эта функция была введена в Qt 4.4.
См. также sslErrors().
[signal] void QSslSocket::preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator)
QSslSocket излучает этот сигнал, когда он согласовывает криптографический набор PSK, и, следовательно, требуется аутентификация PSK.
При использовании PSK клиент должен отправить серверу действительный идентификатор и действительный предварительно согласованный ключ, чтобы продолжить обмен SSL. Приложения могут предоставить эту информацию в слоте, подключённом к этому сигналу, заполнив переданный объект authenticator в соответствии со своими потребностями.
Примечание: Игнорирование этого сигнала или невозможность предоставить необходимые учетные данные приведут к сбою процесса рукопожатия, а следовательно, к прерыванию соединения.
Примечание: Объект authenticator принадлежит сокету и не должен удаляться приложением.
Эта функция была добавлена в Qt 5.5.
См. также QSslPreSharedKeyAuthenticator.
[signal] void QSslSocket::sslErrors(const QList<QSslError> &errors)
QSslSocket излучает этот сигнал после процесса рукопожатия SSL, чтобы указать, что возникли одна или несколько ошибок при установлении идентичности узла. Ошибки обычно свидетельствуют о том, что QSslSocket не может надёжно идентифицировать узел. Если никаких действий не предпринято, соединение будет разорвано после излучения этого сигнала.
Если вы хотите продолжить подключение, несмотря на возникшие ошибки, необходимо вызвать QSslSocket::ignoreSslErrors() внутри слота, подключённого к этому сигналу. Если вам нужно получить доступ к списку ошибок позже, вы можете вызвать sslErrors() (без аргументов).
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().
void QSslSocket::addCaCertificate(const QSslCertificate &certificate)
Добавляет certificate в базу данных сертификатов CA этого сокета. База данных сертификатов CA используется сокетом во время фазы рукопожатия для проверки сертификата узла.
Для добавления нескольких сертификатов используйте addCaCertificates().
См. также QSslConfiguration::caCertificates() и QSslConfiguration::setCaCertificates().
bool QSslSocket::addCaCertificates(const QString &path, QSsl::EncodingFormat format = QSsl::Pem, QRegExp::PatternSyntax syntax = QRegExp::FixedString)
Ищет все файлы в path для сертификатов, закодированных в указанном format, и добавляет их в базу данных сертификатов CA этого сокета. path должен быть файлом или шаблоном, соответствующим одному или нескольким файлам, как указано в syntax. Возвращает true если один или несколько сертификатов добавлены в базу данных сертификатов CA сокета; в противном случае возвращает false.
База данных сертификатов CA используется сокетом во время фазы рукопожатия для проверки сертификата узла.
Для более точного управления используйте addCaCertificate().
См. также addCaCertificate() и QSslCertificate::fromPath().
void QSslSocket::addCaCertificates(const QList<QSslCertificate> &certificates)
Добавляет certificates в базу данных сертификатов CA этого сокета. База данных сертификатов CA используется сокетом во время фазы рукопожатия для проверки сертификата узла.
Для более точного управления используйте addCaCertificate().
См. также QSslConfiguration::caCertificates() и addDefaultCaCertificate().
[static] void QSslSocket::addDefaultCaCertificate(const QSslCertificate &certificate)
Добавляет certificate в базу данных по умолчанию сертификатов CA. База данных сертификатов CA каждого сокета SSL инициализируется базой данных сертификатов CA по умолчанию.
См. также addCaCertificates().
[static] bool QSslSocket::addDefaultCaCertificates(const QString &path, QSsl::EncodingFormat encoding = QSsl::Pem, QRegExp::PatternSyntax syntax = QRegExp::FixedString)
Ищет все файлы в path для сертификатов с указанным encoding и добавляет их в базу данных сертификатов CA по умолчанию. path может содержать явный файл или может содержать подстановки в формате, указанном в syntax. Возвращает true если любые сертификаты CA добавлены в базу данных по умолчанию.
База данных сертификатов CA каждого сокета SSL инициализируется базой данных сертификатов CA по умолчанию.
См. также QSslConfiguration::caCertificates(), addCaCertificates(), и addDefaultCaCertificate().
[static] void QSslSocket::addDefaultCaCertificates(const QList<QSslCertificate> &certificates)
Добавляет certificates в базу данных сертификатов CA по умолчанию. База данных сертификатов CA каждого сокета SSL инициализируется базой данных сертификатов CA по умолчанию.
См. также QSslConfiguration::caCertificates() и addCaCertificates().
[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().
bool QSslSocket::isEncrypted() const
Возвращает true если сокет зашифрован; в противном случае возвращается false.
Зашифрованный сокет шифрует все данные, которые записываются с помощью вызовов write() или putChar() перед записью данных в сеть, и расшифровывает все входящие данные, как только они получены из сети, до вызова read(), readLine() или getChar().
QSslSocket посылает сигнал encrypted() при переходе в защищённый режим.
Вы можете вызвать sessionCipher(), чтобы узнать, какой криптографический шифр используется для шифрования и расшифровки ваших данных.
См. также mode().
QSslCertificate QSslSocket::localCertificate() const
Возвращает локальный сертификат сокета certificate, или пустой сертификат, если локальный сертификат не назначен.
См. также setLocalCertificate() и privateKey().
QList<QSslCertificate> QSslSocket::localCertificateChain() const
Возвращает цепочку локальных сертификатов сокета certificate, или пустой список, если локальные сертификаты не назначены.
Эта функция была введена в 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. Этот режим определяет, должен ли 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
Возвращает криптографический шифр сокета или нулевой шифр, если соединение не зашифровано. Шифр сокета для сеанса устанавливается во время фазы рукопожатия. Шифр используется для шифрования и дешифрования данных, передаваемых через сокет.
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, который анализируется в соответствии с указанным форматом.
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().
void QSslSocket::setReadBufferSize(qint64 size)
Переопределяет: QAbstractSocket::setReadBufferSize(qint64 size).
Устанавливает размер внутреннего буфера чтения QSslSocket на size байтов.
Эта функция была добавлена в Qt 4.4.
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().
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().
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::sslErrors() const
Возвращает список последних ошибок SSL, которые произошли. Это тот же список, который QSslSocket передаёт через сигнал sslErrors(). Если подключение было зашифровано без ошибок, эта функция вернёт пустой список.
См. также connectToHostEncrypted().
long QSslSocket::sslLibraryBuildVersionNumber()
Возвращает номер версии используемой библиотеки SSL во время компиляции. Если поддержка SSL недоступна, возвращает неопределённое значение.
Эта функция была добавлена в Qt 5.4.
См. также sslLibraryVersionNumber().
QString QSslSocket::sslLibraryBuildVersionString()
Возвращает строку версии используемой библиотеки SSL во время компиляции. Если поддержка SSL недоступна, возвращает пустое значение.
Эта функция была добавлена в Qt 5.4.
См. также sslLibraryVersionString().
long QSslSocket::sslLibraryVersionNumber()
Возвращает номер версии используемой библиотеки SSL. Обратите внимание, что это версия библиотеки, используемой во время выполнения, а не во время компиляции. Если поддержка SSL недоступна, возвращает неопределённое значение.
Эта функция была добавлена в Qt 5.0.
QString QSslSocket::sslLibraryVersionString()
Возвращает строку версии используемой библиотеки SSL. Обратите внимание, что это версия библиотеки, используемой во время выполнения, а не во время компиляции. Если поддержка SSL недоступна, возвращает пустое значение.
Эта функция была добавлена в Qt 5.0.
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-handshake завершился неудачно), возвращается 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.14/qsslsocket.html