使用自签名证书

时间:2010-01-23 13:56:34

标签: ruby ssl jruby keytool

我只是试图了解SSL。

我在本地主机上设置了一个Jetty服务器,并使用Keytool生成了我自己的证书。

现在,当我转到https://localhost:8443/时,我得到了不能相信此证书错误。

我用

  

keytool -export -alias pongus -keystore keystore -file certfile.cer

创建我认为是客户端需要对服务器进行身份验证的证书。 (这是我可能非常错的地方!)

我有以下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)

任何想法我做错了什么?

修改

我想得到它所以我保证我连接到正确的服务器,服务器可以保证我连接到它,没有任何篡改。我正在开发服务器和客户端。

3 个答案:

答案 0 :(得分:6)

  

您的客户需要访问它   私钥。

您不需要私钥来进行服务器证书验证。您只需要包含公钥的证书本身。只有服务器具有私钥。这里有很好的描述http://www.helpbytes.co.uk/https.phphttp://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,验证常量)并将以上四行添加到其中。

希望这有帮助。

答案 1 :(得分:0)

您的客户需要访问其私钥。私钥不在证书中,证书仅包含公钥。对不起,我不知道ruby,但一种常见的技巧是将私钥和证书捆绑在一个PKCS#12(又名p12)文件中,并将其提供给加密库。

答案 2 :(得分:-8)

更改

http_session.verify_mode = OpenSSL::SSL::VERIFY_PEER

http_session.verify_mode = OpenSSL::SSL::VERIFY_NONE

一旦这样做,SSL将正常工作。我在我的开发环境中多次使用它,总是完美无缺。