使用自签名证书
我只是试图了解SSL。
我在localhost上设置了一个Jetty服务器,并使用Keytool生成了我自己的证书。
现在,当我去https:// localhost:8443 /我得到了不能相信这个证书错误。
我用
keytool -export -alias pongus -keystore keystore -file certfile.cer
创建我认为是客户端需要对服务器进行身份validation的证书。 (这是我可能非常错的地方!)
我有以下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)
我有什么想法我做错了吗?
编辑
我想得到它所以我保证我连接到正确的服务器,服务器可以保证我连接到它,没有任何篡改。 我正在开发服务器和客户端。
您的客户端需要访问其私钥。
您不需要私钥来进行服务器证书validation。 您只需要包含公钥的证书本身。 只有服务器具有私钥。 这里有很好的描述http://www.helpbytes.co.uk/https.php和http://www.weisign.com/ssl/ssl-information-center/how-ssl-security-works/
我的建议很简单。 检查您的证书是否正确。
openssl x509 -text -in mycert.crt
此外,如果您有权访问服务器,您可以明确validation证书和密钥(在httpd配置中使用)是否正确(匹配): http : //kb.wisc.edu/middleware/page.php?id = 4064请注意这是在服务器上运行的显式检查。 永远不要泄露私钥。 此检查只能由管理员进行,以validationhttpd是否未配置错误。
(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)对其进行validation。 然后您将看到证书本身和有效性信息。
以上所有都是关于服务器证书 。 这只是问题的一部分。 “ 我正在连接到正确的服务器 ,服务器可以保证是我连接到它”实际上在您的代码中只检查服务器证书。 现在。 如果你想要一个客户端证书 (你的语句的第二部分)而不是你在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,validation常量)并将以上四行添加到其中。
希望这可以帮助。
您的客户端需要访问其私钥。 私钥不在证书中,证书仅包含公钥。 对不起,我不知道ruby,但一种常见的技术是将私钥和证书捆绑在一个PKCS#12(又名p12)文件中,并将其提供给加密库。
更改
http_session.verify_mode = OpenSSL::SSL::VERIFY_PEER
至
http_session.verify_mode = OpenSSL::SSL::VERIFY_NONE
一旦这样做,SSL将正常工作。 我在我的开发环境中多次使用它,总是完美无缺。
- 在rspec中的控制器测试中使用rails“post”,并在路由上使用作用域和协议
- 已经在jruby-openssl中初始化了常量
- 调试器(Intellij IDEA)在遇到断点时失败(黄瓜,ruby,rspec,水豚)
- NoMethodError:在tomcat上部署rails app时的relative_url_root
- 从jruby-complete中消耗gem
- Rails:我的应用程序如何判断它是在MRI还是JRuby中运行?
- 使用JRuby的Rails控制台问题:没有提示字符,没有选项卡完成,箭头键错误等
- 如何使用dBpedia在ruby-on-rails应用程序上设置neo4j?
- RVM报告未安装Gemfile ruby