尝试使用客户端证书时解决sslv3警报握手失败问题

Kar*_*rem 11 ssl curl openssl client-certificates

我正在尝试连接到需要证书进行授权的服务.过程是我向服务发送CSR文件.该服务签署CSR并向我发送我用于连接的证书.

  1. 我通过以下命令行生成CSR:

    openssl req -new -nodes -newkey rsa:2048 -keyout cert.key -out cert.csr
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我获取了cert.csr的内容并发送给他们.他们生成客户端证书,我得到了一个PEM文件.

  3. 我现在尝试使用SSLCERT中的证书文件连接curl()并将cert.key中的私钥提供为CURLOPT_SSLKEY - (我在步骤1中获得).

  4. 失败: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure

我在这个过程中做错了什么?

当我尝试收到包含服务中的私钥(自签名证书)的测试证书时,它可以正常工作.但是,当我使用他们从我的CSR生成的证书然后使用我的私钥作为密钥时,它会因握手失败而出错.

所以我知道它与openssl/curl不支持v3/TLS等有关.其他人在研究解决方案时发现了他们的问题.

这是我运行的:

  curl -i -v --request POST https://service.com/ --cert clientcert.pem --key private_key.pem --cert-type pem --tlsv1.1 --insecure
* Connected to service.com (1xx.xxx.xxx.xx) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Request CERT (13):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS handshake, CERT verify (15):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS alert, Server hello (2):
* error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
* Closing connection 0
Run Code Online (Sandbox Code Playgroud)

运行以下版本:curl 7.35.0(x86_64-pc-linux-gnu)libcurl/7.35.0 OpenSSL/1.0.1f zlib/1.2.8 libidn/1.28 librtmp/2.3

dav*_*085 7

不是一个明确的答案,但太多而不适合评论:

我假设他们给了你一个证书,要么有一个错误的颁发者(尽管他们的服务器可以为此使用更具体的警报代码)或一个错误的主题。我们知道证书相匹配的专用密钥-因为无论curlopenssl client配对他们不抱怨不匹配; 但我们实际上并不知道它与他们想要的 CA 相匹配——因为您的 curl 使用 openssl 并且 openssl SSL 客户端不强制配置的客户端证书与 certreq.CAs 匹配。

openssl x509 <clientcert.pem -noout -subject -issuer对有效的测试 P12 的证书执行相同操作。做openssl s_client(或检查你做的)并查看下Acceptable client certificate CA names;那里的名称或其中之一应该与您的证书的颁发者(完全相同!)匹配。如果没有,那很可能是您的问题,您需要与他们核实您是否以正确的方式将 CSR 提交到了正确的位置。也许他们在不同的地区、业务线、测试与生产、或活动与待定等有不同的制度。

如果您的证书的颁发者确实与所需的 CA 匹配,请将其主题与工作 (test-P12) 主题进行比较:它们的格式是否相似?工作组件中是否有任何组件不存在于您的组件中?如果他们允许,请尝试生成并提交一个新的 CSR,其主题名称与 test-P12 的主题名称完全相同,或者尽可能接近,看看是否会产生一个效果更好的证书。(您不必生成新密钥来执行此操作,但如果您选择这样做,请跟踪哪些证书与哪些密钥匹配,以免混淆。)如果这对查看证书没有帮助与扩展openssl x509 <cert -noout -text任何差别(S)可能合理地与受试者的授权,如密钥使用,执行extendedKeyUsage,也许政策,也许约束,甚至一些非标准。

如果所有其他方法都失败了,请询问服务器操作员他们的日志对问题的描述,或者您是否有权查看日志。


jww*_*jww 5

什么SSL私钥应与客户端证书一起发送?

他们都不是:)

关于客户端证书的一个吸引人的事情是它不会做愚蠢的事情,比如将纯文本中的秘密(如密码)传输到服务器(HTTP basic_auth).密码仍然用于解锁客户端证书的密钥,它只是在交换期间不直接使用或tp验证客户端.

相反,客户端为该会话选择临时随机密钥.然后客户端用他的证书签署临时随机密钥并将其发送到服务器(一些人放弃).如果一个坏人拦截任何东西,它是随机的,所以它不能在将来使用.它甚至不能用于服务器的第二次协议运行,因为服务器也会选择一个新的随机值.


失败:错误:14094410:SSL例程:SSL3_READ_BYTES:sslv3警报握手失败

使用TLS 1.0及以上版本; 并使用服务器名称指示.

您还没有提供任何代码,因此我不清楚如何告诉您该怎么做.相反,这是测试它的OpenSSL命令行:

openssl s_client -connect www.example.com:443 -tls1 -servername www.example.com \
    -cert mycert.pem -key mykey.pem -CAfile <certificate-authority-for-service>.pem
Run Code Online (Sandbox Code Playgroud)

您还可以使用-CAfile以避免"验证错误:num = 20".例如,当连接到gateway.sandbox.push.apple.com时,请参阅"验证错误:num = 20".