Spec-Zone.ru › Qt 5.13

Класс 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
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> sslErrors() const
bool waitForEncrypted(int msecs = 30000)

Переопределённые открытые функции

virtual bool atEnd() const override
virtual qint64 bytesAvailable() const override
virtual qint64 bytesToWrite() const override
virtual bool canReadLine() const override
virtual void close() override
virtual void resume() override
virtual void setReadBufferSize(qint64 size) override
virtual bool setSocketDescriptor(qintptr socketDescriptor, QAbstractSocket::SocketState state = ConnectedState, QIODevice::OpenMode openMode = ReadWrite) override
virtual void setSocketOption(QAbstractSocket::SocketOption option, const QVariant &value) override
virtual QVariant socketOption(QAbstractSocket::SocketOption option) override
virtual bool waitForBytesWritten(int msecs = 30000) override
virtual bool waitForConnected(int msecs = 30000) override
virtual bool waitForDisconnected(int msecs = 30000) override
virtual bool waitForReadyRead(int msecs = 30000) override

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

void ignoreSslErrors()
void startClientEncryption()
void startServerEncryption()

Сигналы

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)

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

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()

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

virtual qint64 readData(char *data, qint64 maxlen) override
virtual 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 может быть расширена и настроена с помощью 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, прежде чем будет установлено шифрование, чтобы указать, что произошла ошибка при установлении идентичности партнера. Ошибка error обычно указывает, что 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-сокета инициализируется по умолчанию.

См. также QSslConfiguration::defaultCaCertificates() и 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

Данная функция возвращает ответы протокола Online Certificate Status Protocol, которые сервер может отправить во время рукопожатия 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

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

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. Установка 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.

[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.13/qsslsocket.html

Spec-Zone.ru

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