代码之家  ›  专栏  ›  技术社区  ›  Mongus Pong

使用自签名证书

  •  7
  • Mongus Pong  · 技术社区  · 15 年前

    我只是想了解一下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 回复  |  直到 14 年前
        1
  •  6
  •   lzap    14 年前

    您的客户需要访问 私钥。

    服务器证书验证不需要私钥。您所需要的只是包含公钥的证书本身。只有服务器有私钥。这里描述得很好 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(火狐和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证书、验证常量)并将上述四行添加到其中。

    希望这有帮助。

        2
  •  0
  •   President James K. Polk    15 年前

    您的客户机需要访问其私钥。私钥不在证书中,证书只包含公钥。抱歉,我不知道Ruby,但是一种常见的技术是将私钥和证书捆绑在一个pkcs 12(也叫p12)中,将其归档并提供给加密库。

        3
  •  -8
  •   Eugene    15 年前

    变化

    http_session.verify_mode = OpenSSL::SSL::VERIFY_PEER
    

    http_session.verify_mode = OpenSSL::SSL::VERIFY_NONE
    

    一旦您这样做了,SSL将正常工作。在我的开发环境中,我已经多次使用过这种方法,它总是能够完美地工作。