首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用自签名证书

使用自签名证书
EN

Stack Overflow用户
提问于 2010-01-23 13:56:33
回答 3查看 11.3K关注 0票数 8

我只是想把我的头放在SSL上。

我已经在本地主机上设置了Jetty服务器,并使用键工具生成了自己的证书。

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

我使用

密钥工具-export -alias pongus -keystore keystore -file certfile.cer

要创建证书,我认为客户端需要通过服务器进行身份验证。(这就是我可能大错特错的地方)

我有以下红宝石代码:

代码语言:javascript
复制
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文件确实存在。

但我明白错误

代码语言:javascript
复制
/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)

你知道我做错了什么吗?

编辑

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-17 13:06:59

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

您不需要用于服务器证书验证的私钥。您所需要的只是包含公钥的证书本身。只有服务器拥有私钥。在这里,http://www.helpbytes.co.uk/https.phphttp://www.verisign.com/ssl/ssl-information-center/how-ssl-security-works/描述得很好

我的建议很简单。检查你的证书是否正确。

代码语言:javascript
复制
openssl x509 -text -in mycert.crt

另外,如果您可以访问服务器,您可以解释地验证证书和密钥(在httpd配置中使用)是否正确(匹配):http://kb.wisc.edu/middleware/page.php?id=4064 --请注意,这是在服务器上显式检查运行的。永远不要泄露私钥。此检查只能由管理员执行,以验证httpd是否未配置错误。

代码语言:javascript
复制
(openssl x509 -noout -modulus -in server.pem | openssl md5 ;\
   openssl rsa -noout -modulus -in server.key | openssl md5) | uniq

还可以使用标准的openssl命令调试SSL证书通信。发出此命令,然后等待几秒钟,然后键入“退出”并按回车。您将看到服务器发送的证书。

代码语言:javascript
复制
openssl s_client -connect your.server.com:443

还尝试将证书导入到浏览器并访问URL资源。浏览器可以通过点击https (Firefox和Chrome)来验证它。然后,您将看到证书本身和有效性信息。

以上所有内容都是关于服务器证书的。这只是问题的一部分。“我正在连接到正确的服务器,服务器可以保证它是我连接到它”实际上在您上面的代码中只检查服务器证书。现在。如果您想要一个客户端证书(语句的第二部分),那么在中需要这样做:

代码语言:javascript
复制
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)

这就是中应该如何使用客户端证书的方式。如果您的私钥是用密码加密的,只需在RSA构造函数的第二个参数中传递它而不是零。

我强烈建议让服务器证书工作(代码),然后从客户端证书开始。请注意,您保留了当前代码(ca_cert,验证常量),并将上述四行添加到其中。

希望这能有所帮助。

票数 7
EN

Stack Overflow用户

发布于 2010-01-24 02:24:28

你的客户需要访问它的私钥。私钥不在证书中,证书只包含公钥。对不起,我不知道ruby,但是一种常见的技术是将私钥和证书捆绑在一个PKCS#12中,也就是p12中,然后将其提供给密码库。

票数 0
EN

Stack Overflow用户

发布于 2010-01-23 19:13:01

变化

代码语言:javascript
复制
http_session.verify_mode = OpenSSL::SSL::VERIFY_PEER

代码语言:javascript
复制
http_session.verify_mode = OpenSSL::SSL::VERIFY_NONE

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

票数 -6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2123362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档