8

私はSSLに頭を悩ませようとしています。

ローカルホストにJettyサーバーをセットアップし、Keytoolを使用して独自の証明書を生成しました。

https:// localhost:8443にアクセスすると、この証明書を信頼できないというエラーが表示されます。

私が使う

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

クライアントがサーバーで認証する必要があると思う証明書を作成するには。(これは私が非常に間違っている可能性がある場所です!)

私は次のルビーコードを持っています:

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)

私が間違っていることについて何か考えはありますか?

編集

私はそれを取得したいので、私は正しいサーバーに接続していることを保証し、サーバーは、間に改ざんすることなく、私がそれに接続していることを保証できます。サーバーとクライアントの両方を開発しています。

4

3 に答える 3

7

クライアントはその秘密鍵にアクセスする必要があります。

サーバー証明書の検証に秘密鍵は必要ありません。必要なのは、公開鍵を含む証明書自体だけです。サーバーだけが秘密鍵を持っています。ここ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で必要なクライアント証明書(ステートメントの2番目の部分)が必要な場合は、次のようにします

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コンストラクターの2番目の引数で代わりにnilを渡します。

サーバー証明書(コード)を機能させてから、クライアント証明書から始めることを強くお勧めします。現在のコード(ca_cert、検証定数)を保持し、上記の4行を追加することに注意してください。

お役に立てれば。

于 2011-02-17T13:06:59.393 に答える
0

クライアントはその秘密鍵にアクセスする必要があります。秘密鍵は証明書に含まれていません。証明書には公開鍵のみが含まれています。申し訳ありませんが、ルビーはわかりませんが、一般的な手法は、秘密鍵と証明書を単一のPKCS#12、別名p12ファイルにバンドルし、これを暗号ライブラリに提供することです。

于 2010-01-24T02:24:28.763 に答える
-6

変化する

http_session.verify_mode = OpenSSL::SSL::VERIFY_PEER

http_session.verify_mode = OpenSSL::SSL::VERIFY_NONE

これを行うと、SSLは正しく機能します。私はこれを開発環境で何度も使用しており、常に問題なく動作します。

于 2010-01-23T19:13:01.107 に答える