ruby – 使用自签名证书
我只是试图了解SSL.
我在localhost上设置了一个Jetty服务器,并使用Keytool生成了我自己的证书. 现在当我去https://localhost:8443/时,我得到了不能相信这个证书的错误. 我用
创建我认为是客户端需要对服务器进行身份验证的证书. (这是我可能非常错的地方!) 我有以下ruby代码: require 'net/https' require 'openssl' require 'open-uri' puts 'yay' if File.exists?('certfile.cer') uri = URI.parse("https://localhost:8443/") http_session = Net::HTTP.new(uri.host,uri.port) http_session.use_ssl = true http_session.verify_mode = OpenSSL::SSL::VERIFY_PEER http_session.ca_file = 'certfile.cer' res = http_session.start do |http| # do some requests here http.get('/') end 这会打印’yay’,因此certfile.cer文件确实存在. 但是我得到了错误 /Applications/NetBeans/NetBeans 6.8.app/Contents/Resources/NetBeans/ruby2/jruby-1.4.0/lib/ruby/1.8/net/http.rb:586 warning: can't set verify locations /Applications/NetBeans/NetBeans 6.8.app/Contents/Resources/NetBeans/ruby2/jruby-1.4.0/lib/ruby/1.8/net/http.rb:586:in `connect': certificate verify failed (OpenSSL::SSL::SSLError) 我有什么想法我做错了吗? 编辑 我想得到它所以我保证我连接到正确的服务器,服务器可以保证我连接到它,没有任何篡改.我正在开发服务器和客户端. 解决方法
您不需要私钥来进行服务器证书验证.您只需要包含公钥的证书本身.只有服务器具有私钥.这里很好地描述了http://www.helpbytes.co.uk/https.php和这里http://www.verisign.com/ssl/ssl-information-center/how-ssl-security-works/ 我的建议很简单.检查您的证书是否正确. openssl x509 -text -in mycert.crt 此外,如果您有权访问服务器,则可以明确验证证书和密钥(在httpd配置中使用)是否正确(匹配):http://kb.wisc.edu/middleware/page.php?id=4064请注意这是在服务器上运行的显式检查.永远不要泄露私钥.此检查只能由管理员进行,以验证httpd是否配置错误. (openssl x509 -noout -modulus -in server.pem | openssl md5 ; openssl rsa -noout -modulus -in server.key | openssl md5) | uniq 您还可以使用标准openssl命令调试SSL证书通信.发出此命令然后等待几秒钟,然后键入QUIT并按Enter键.您将看到服务器发出的证书. openssl s_client -connect your.server.com:443 还尝试将证书导入浏览器并访问URL资源.浏览器可以通过单击https(Firefox和Chrome)来验证它.然后,您将看到证书本身和有效性信息. 以上所有都是关于服务器证书.这只是问题的一部分. “我正在连接到正确的服务器,服务器可以保证是我连接到它”在上面的代码中,只检查服务器证书.现在.如果你想要一个客户端证书(你的语句的第二部分)而不是你在Ruby中需要它: File.open( "client_certificate.pem",'rb' ) { |f| cert = f.read } File.open( "client_key.pem",'rb' ) { |f| key = f.read } http_session.cert = OpenSSL::X509::Certificate.new(cert) http_session.key = OpenSSL::PKey::RSA.new(key,nil) 这就是如何在Ruby中使用客户端证书.如果您的私钥使用密码加密,则在RSA构造函数的第二个参数中将其传递给nil. 我强烈建议让服务器证书工作(您的代码),然后从客户端证书开始.请注意,保留当前代码(ca_cert,验证常量)并将以上四行添加到其中. 希望这可以帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |