问题标签 [qsslsocket]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
371 浏览

c++ - 为什么在移动到另一个线程时出现运行时错误,使用套接字 (TCP/Web)?`QObject::moveToThread()` 是同步调用吗?

我正在将一些套接字从主线程移动到工作线程,并在新线程上处理,readyRead()等。我很少看到以下危险警告:close()write()

“QSocketNotifier:不能从另一个线程启用或禁用套接字通知”

通常在此警告之后执行会导致未定义的行为(崩溃/未捕获的异常/正常)。
已经检查了插座的所有信号/插槽,它们看起来是正确的。根据我的经验,如果有任何编码不规则,通常上述警告会很频繁或很快。

现在我怀疑moveToThread()它是否按预期工作!因为从QEvent文档QEvent::ThreadChange中,在此函数调用期间,a 作为当前线程上的最后一个事件引发。

对象被移动到另一个线程。这是在前一个线程中发送给该对象的最后一个事件。见11在线程亲和性改变之前,一个事件被发送到这个对象。您可以处理此事件以执行任何特殊处理。QObject::moveToThread()
QEvent::ThreadChange

在我的代码中,我没有检查此事件。相反,我假设,一旦moveToThread()完成,线程亲和力就会改变,并且对象上的新“信号/插槽”在新线程上得到保证。

问题

  1. 将套接字移动到另一个线程是否安全?
  2. moveToThread()确保该对象上的信号在此函数之后也被移动到新线程?
  3. 应该如何设计以确保 Socket 没有螺纹不规则性?

顺便说一句,在最新的 Qt 调试器中,它位于以下代码段:

下面是主线程的堆栈帧: 在此处输入图像描述

下面是工作线程的堆栈帧,它在日志记录时停止: 在此处输入图像描述

0 投票
0 回答
51 浏览

qt - Qt Linux Mint 19.2 QSslSocket

我开发了小型 Qt 应用程序,用于通过 smtp 465 端口发送邮件。它适用于我的开发人员 linux mint 19.2 机器。当我将带有所有库的应用程序部署到 Mint 17.3 机器时,我得到 QAbstractSocketError::HostNotFoundError。我正在使用 QSslSocket。

如果我将我的应用程序和库部署到另一台 linux mint 19.2 机器上,它可以正常工作。所以问题是薄荷 19.2 和 17.3 的区别。我用尽了所有的可能性/想法。

ps

两台机器上安装的 OpenSsl 相同!

0 投票
0 回答
125 浏览

qt - 使用 Qt 进行双向 SSL 身份验证

我是 ssl / 网络的新手,想利用互 ssl(客户端验证服务器,服务器验证对等方)我在网上找到了一份白皮书(http://www.infidigm.net/articles/qsslsocket_for_ssl_beginners/),它给了我一些指导设置我的证书和密钥。现在本文使用本地主机 IP 地址作为客户端证书文件。我想将其切换为注册域名(scp.radiant.io)。这个 FQDN 对于我的 ubuntu 操作系统是本地的,用于测试目的

  1. 更新了我的本地主机以拥有一个域名 (scp.radiant.io)。通过修改这个文件sudo nano /etc/hosts/127.0.0.1 scp.radiant.io localhost

  2. 接下来我为客户端和服务器创建证书和私钥

    一个。下面的服务器生成证书示例的步骤。为客户端运行相同的命令以创建客户端证书

openssl req -out server_ca.pem -new -x509 -nodes -subj "/C=$COUNTRY/ST=$STATE/L=$LOCALITY/O=$ORG/OU=$ORG_UNIT/CN=server/emailAddress=radiant.$EMAIL"

mv privkey.pem server_privatekey.pem

touch server_index.txt

echo "00" >> server_index.txt

openssl genrsa -out server_local.key 1024

openssl req -key ${NAME}_local.key -new -out server_local.req -subj "/C=$COUNTRY/ST=$STATE/L=$LOCALITY/O=$ORG/OU=$ORG_UNIT/CN=scp.radiant.io/emailAddress=$EMAIL"

openssl x509 -req -in ${NAME}_local.req -CA ${NAME}_ca.pem -CAkey server_privatekey.pem -CAserial server_index.txt -out server_local.pem

湾。这会生成一个 CaCerts(server_ca.pem 和 client_ca.pem)

C。这会生成一个本地证书文件(server_local.pem 和 client_local.pem).. 这是我将 FQDN 设置为 scp.radiant.io

d。这会生成一个 LocalKey(server_local.key 和 client_local.key)

  1. 我使用生成的证书文件在 QSslSocket 上为双方设置 ssl 配置,如下所示

  2. 运行此代码时,我的 ssl 错误中出现以下错误。"The host name did not match any of the valid hosts for this certificate

  3. 现在,如果我更改客户端套接字以在连接时使用sslSocket->connectToHostEncrypted("scp.radiant.io",1200,"scp.radiant.io");它,它将起作用。

我不明白为什么在连接加密时必须设置 peerVerifyHost 参数。我也想为我的 WebSockets 实现使用相同的证书,但是 QWebSocket 类不允许您在连接时设置 peerverifyHost。所以我必须在我的 FQDN 的证书级别或操作系统级别做错了什么。任何网络和 SSL 帮助都会有所帮助

0 投票
0 回答
29 浏览

windows - 平台什么时候不支持ssl?(QSslSocket::supportsSsl() 返回 false)

我是一个使用 https 连接到 rest api 的 qt 应用程序开发人员。我将 ssl dll 库与应用程序(与构建 qt 的版本相同)一起部署,但有时在 Windows 上会发生,用户向我报告我的应用程序中的互联网连接无法正常工作。在调试时,我发现 qsslSocket::supportsSsl 返回 false 并且正在使用的 openssl 版本是空字符串。这什么时候发生?用户可以使用他的互联网浏览器并向我发送电子邮件。可能是什么问题?