5

我正在使用 Savon 和 HTTPi(分别是 Ruby 肥皂客户端和 Ruby HTTP 客户端的接口)通过 SSL 编写肥皂请求。这是代码:

client = Savon::Client.new(original_class.constantize.wsdl_url)
client.http.auth.ssl.cert_key_file = "path_to_the_key"
client.http.auth.ssl.cert_key_password = 'secret'
client.http.auth.ssl.cert_file = "path_to_the_certification"
client.http.auth.ssl.verify_mode = :none
@response = client.request :ins0, action do
  soap.body = encoded_body
end

这是我让它工作的唯一方法。但是,我知道还有其他三种验证模式,它们是:

  • :peer (SSL_VERIFY_PEER)
  • :fail_if_no_peer_cert (SSL_VERIFY_FAIL_IF_NO_PEER_CERT)
  • :client_once (SSL_VERIFY_CLIENT_ONCE)

如果我将验证模式更改为上述任何其他模式,我会收到此错误:

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

然后是我的问题(其中包括我的问题):

  • 如果我将验证模式保持为:none,我做错了吗?是否缺乏安全感?
  • 错误的真正含义是什么?我的代码是错误的还是我的证书(这是自分配的——我在开发环境中)不好?

我阅读了有关验证模式的 OpenSSL 文档:

http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html

关于客户端模式下的 SSL_VERIFY_NONE 说:

在 TLS/SSL 握手之后,可以使用 SSL_get_verify_result(3) 函数检查证书验证过程的结果。无论验证结果如何,都会继续握手

我应该担心吗?我应该将验证模式 :none 视为危险的事情吗?

我之所以这么问,是因为我无法使其与其他验证模式一起使用,因此我想以现在的工作方式通过 SSL 功能释放肥皂请求。但如果这可能很危险,我肯定不会这样做。

4

1 回答 1

7

过了一会儿,我加入了 OpenSSL 用户支持邮件列表,终于得到了帮助。

简而言之:

模式标志 :fail_if_not_peer_cert 和 :client_once 仅用于服务器,对客户端没有任何意义,因此它们在客户端被忽略。

对于客户端目的,:peer (SSL_VERIFY_PEER) 是唯一重要的。

并且将验证模式设置为 :none (SSL_VERIFY_NONE) 是不安全的。这样,将不会有服务器身份验证。如果有人拦截了来自我的客户端的连接,我的客户端将无法检测到差异,并将敏感数据提供给攻击者。

为了使用 :peer,我需要在客户端 truststore 中有证书。

非常感谢来自 OpenSSL 邮件列表的 Dave Thompson。

于 2012-09-27T12:35:24.607 回答