Openssl 相互身份验证-来自服务器的空回复 我一直在使用PoC+C++库创建Web服务器。我需要实现相互身份验证,因此在服务器中,我已将验证模式配置为严格模式(SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT)

Openssl 相互身份验证-来自服务器的空回复 我一直在使用PoC+C++库创建Web服务器。我需要实现相互身份验证,因此在服务器中,我已将验证模式配置为严格模式(SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT),openssl,ssl-certificate,client-certificates,poco-libraries,mutual-authentication,Openssl,Ssl Certificate,Client Certificates,Poco Libraries,Mutual Authentication,如果我将其配置为RELAXED(SSL\u VERIFY\u PEER),我可以通过HTTPS将服务器卷曲而不会出现问题,但是当我尝试使用严格验证模式时,服务器和客户端完成握手,然后服务器没有响应,结果给了我“来自服务器的空回复”消息 我使用的是以下旋度: curl -u user:pass --cert client.cert.pem:password --key client.key.pem --cacert ca-chain.cert.pem --capath /home/ca/ 'htt

如果我将其配置为RELAXED(SSL\u VERIFY\u PEER),我可以通过HTTPS将服务器卷曲而不会出现问题,但是当我尝试使用严格验证模式时,服务器和客户端完成握手,然后服务器没有响应,结果给了我“来自服务器的空回复”消息

我使用的是以下旋度:

curl -u user:pass --cert client.cert.pem:password --key client.key.pem --cacert ca-chain.cert.pem --capath /home/ca/ 'https://V.X.Y.Z:PORT' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'Accept-Encoding: gzip, deflate, sdch, br' -H 'Accept-Language: es-US,es;q=0.8,es-419;q=0.6,en;q=0.4' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36' --compressed --insecure
我得到了这个结果:

*   Trying V.X.Y.Z...
* TCP_NODELAY set
* Connected to V.X.Y.Z (V.X.Y.Z) port PORT (#0)
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: ca-chain.cert.pem
  CApath: /home/ca/
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
} [5 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.2 (IN), TLS handshake, Server hello (2):
{ [62 bytes data]
* TLSv1.2 (IN), TLS handshake, Certificate (11):
{ [1560 bytes data]
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
{ [333 bytes data]
* TLSv1.2 (IN), TLS handshake, Request CERT (13):
{ [42 bytes data]
* TLSv1.2 (IN), TLS handshake, Server finished (14):
{ [4 bytes data]
* TLSv1.2 (OUT), TLS handshake, Certificate (11):
} [4514 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
} [70 bytes data]
* TLSv1.2 (OUT), TLS handshake, CERT verify (15):
} [264 bytes data]
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
} [1 bytes data]
* TLSv1.2 (OUT), TLS handshake, Finished (20):
} [16 bytes data]
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server did not agree to a protocol
* Server certificate:
*  subject: C=MX; ST=Sonora; L=Cajeme; O=Gustavo Inc; OU=Gustavo Systems; CN=CNName; emailAddress=gustavoinc@gmail.com
*  start date: Apr 11 18:07:27 2017 GMT
*  expire date: Apr 21 18:07:27 2018 GMT
*  issuer: C=MX; ST=Sonora; O=Gustavo Inc; OU=Gustavo Systems; CN=Gustavo Inter; emailAddress=gustavoinc@gmail.com
*  SSL certificate verify ok.
* Server auth using Basic with user 'user'
} [5 bytes data]
> GET / HTTP/1.1
> Host: V.X.Y.Z:PORT
> Authorization: Basic dXNlcjpwYXNz
> Accept: application/json
> Connection: keep-alive
> Accept-Encoding: gzip, deflate, sdch, br
> Accept-Language: es-US,es;q=0.8,es-419;q=0.6,en;q=0.4
> Upgrade-Insecure-Requests: 1
> User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36
{ [5 bytes data]
* TLSv1.2 (IN), TLS alert, Client hello (1):
{ [2 bytes data]
* Empty reply from server
* Connection #0 to host V.X.Y.Z left intact
它返回一个状态代码000

据我所知,握手过程中没有出现任何问题。我们执行hello消息,密钥释放,我们发送证书来识别我们自己,我们同意协议和密码套件,我们可以看到“SSL Certificate Ok”消息,表明我们正确地进行了身份验证。 在那之后,我们发送我们的凭证用于基本授权目的,然后BAM,我们得到“来自服务器的空回复”消息。此外,我们没有收到“无效凭据消息”,因此似乎它甚至没有到达服务器以检查凭据,例如,如果客户端和服务器同意密码套件,但随后失去了通信

你知道为什么会这样吗?还是我遗漏了什么?我也尝试过使用web浏览器,但我仍然得到响应超时,所以curl似乎没有问题

编辑:在使用以下OpenSSL命令后,我还将添加完整的OpenSSL输出:

openssl s_client -connect url:port -cert client.cert.pem -key client.key.pem -pass pass:password -CAfile ca.cert.pem -msg -state -debug

输出:

“SSL证书验证正常”。表示客户端(curl/OpenSSL)确定服务器证书良好——这并不意味着服务器喜欢您的客户端证书。事实上,对您的第二次飞行(cCert CKX CVer CCS Finished)的响应是一个警报,指示出现了一些问题,尽管此显示未确认是什么问题。检查所记录的服务器通常是最好的;否则,如果您拥有(或获得)OpenSSL,您可以通过
OpenSSL s_客户端-连接$host:$port-cert$file-key$file[-pass$pw][-CAfile$CAfile]-msg
获得更多详细信息。嘿,感谢您的帮助!我已经尝试过使用OpenSSL使用s_client命令,除了“未发送客户端证书CA名称”这条消息之外,一切似乎都正常。我觉得这很奇怪,因为我已经尝试发送了ca.cert文件和ca-chain.cert文件(都是PEM格式)。此外,客户端和服务器证书都是使用相同的中间CA进行签名的(并且都是自签名证书)。编辑:这可能是因为服务器无法将客户端的证书CA识别为受信任的CA?对于Poco,我相信库对客户端和服务器使用相同的
SSL\u上下文。在这种情况下,我认为您需要修改源代码,创建客户机上下文和服务器上下文,然后在客户机上下文中设置其他选项。上次我检查时,只有一个与SSL/TLS相关的文件,所以工作不多。@jww嗨,谢谢你的帮助!你是说要创建另一个Poco应用程序作为客户端吗?因为我们的最终目标是使用移动应用程序进行连接,Poco将仅用于服务器。“无客户端证书CA名称”是因为(根据您的pastebin),您的服务器正在发送CA列表为空的CertReq,这是不寻常的,但协议允许。OpenSSL(libssl)服务器执行此操作,除非应用程序或中间件(如Poco)显式调用
SSL[CTX]{set,add}\u client\u CA*
例程;它不会自动使用信任库中的CA名称(与其他实现一样)。此外,请求和/或受信任的客户端CA列表与用于服务器证书的CA是分开的。但是,现在我无法想象为什么
curl
和浏览器在
s_client
成功时失败。。。