我是 ssl / 网络的新手,想利用互 ssl(客户端验证服务器,服务器验证对等方)我在网上找到了一份白皮书(http://www.infidigm.net/articles/qsslsocket_for_ssl_beginners/),它给了我一些指导设置我的证书和密钥。现在本文使用本地主机 IP 地址作为客户端证书文件。我想将其切换为注册域名(scp.radiant.io)。这个 FQDN 对于我的 ubuntu 操作系统是本地的,用于测试目的
更新了我的本地主机以拥有一个域名 (scp.radiant.io)。通过修改这个文件
sudo nano /etc/hosts/
说127.0.0.1 scp.radiant.io localhost
接下来我为客户端和服务器创建证书和私钥
一个。下面的服务器生成证书示例的步骤。为客户端运行相同的命令以创建客户端证书
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)
我使用生成的证书文件在 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()
运行此代码时,我的 ssl 错误中出现以下错误。
"The host name did not match any of the valid hosts for this certificate
现在,如果我更改客户端套接字以在连接时使用
sslSocket->connectToHostEncrypted("scp.radiant.io",1200,"scp.radiant.io");
它,它将起作用。
我不明白为什么在连接加密时必须设置 peerVerifyHost 参数。我也想为我的 WebSockets 实现使用相同的证书,但是 QWebSocket 类不允许您在连接时设置 peerverifyHost。所以我必须在我的 FQDN 的证书级别或操作系统级别做错了什么。任何网络和 SSL 帮助都会有所帮助