我正在使用Savon和HTTPi编写一个SOAP请求,分别是Ruby SOAP客户端和Ruby HTTP客户端的接口。这是代码:
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
这是我实现这一目标的唯一方法。但是,我知道还有其他三种验证模式,它们是:
如果我将验证模式更改为上述任何其他模式,我会收到此错误:
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
然后是我的问题(我有其他人):
我阅读了有关验证模式的OpenSSL文档:
http://www.openssl.org/docs/ssl/SSL_CTX_set_verify.html
关于SSL_VERIFY_NONE,在客户端模式上说:
可以检查证书验证过程的结果 使用SSL_get_verify_result(3)进行TLS / SSL握手后 功能。 握手将继续,无论如何 验证结果。
我应该担心吗?我应该看看验证模式:没有危险吗?
我问的是,因为我无法使其与其他验证模式一起工作,所以我想以现在的工作方式通过SSL功能发布soap请求。但如果那可能是危险的话,我肯定不会这样做。
答案 0 :(得分:6)
过了一会儿,我加入了OpenSSL用户支持邮件列表,最后得到了帮助。
简而言之:
模式标志:fail_if_not_peer_cert和:client_once仅用于服务器,对客户端没有任何意义,因此客户端会忽略它们。
出于客户目的,:peer(SSL_VERIFY_PEER)是唯一重要的事情。
将验证模式设置为:none(SSL_VERIFY_NONE)并不安全。这样,就不会有服务器身份验证。如果有人拦截了我客户端的连接,我的客户端将无法检测到差异,并会向攻击者提供敏感数据。
为了使用:peer,我需要在客户端信任库中拥有证书。
非常感谢OpenSSL邮件列表中的Dave Thompson。