首页 > 解决方案 > 使用 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 配置,如下所示

       //client socket setup
         config.setPrivateKey("server_local.key");
         config.setLocalCertificate("server_local.pem");
         config.addCaCertificate("client_ca.pem");
         config.setPeerVerifyMode("QSslSocket::VerifyPeer");
         sslSocket->setSslConfiguration(config); 
         sslSocket->connectToHostEncrypted("scp.radiant.io",1200);
    
        // server socket setup
         config.setPrivateKey("client_local.key");
         config.setLocalCertificate("client_local.pem");
         config.addCaCertificate("server_ca.pem");
         config.setPeerVerifyMode("QSslSocket::VerifyPeer");
         sslSocket->setSslConfiguration(config); 
         sslSocket->startServerEncryption()
    
  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 帮助都会有所帮助

标签: qtsslqsslsocket

解决方案


推荐阅读