質問

私はちょうどSSLについて理解しようとしているところです。

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

今私が行くとき https://ローカルホスト: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)

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

編集

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

役に立ちましたか?

解決

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

サーバー証明書の検証に秘密キーは必要ありません。必要なのは、公開キーを含む証明書自体だけです。サーバーのみが秘密キーを持っています。ここでよく説明されています 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)。次に、証明書自体と有効性情報が表示されます。

以上がすべてでした サーバー証明書. 。これは問題の一部にすぎません。」正しいサーバーに接続しています, 、そしてサーバーは、それに接続しているのが私であることを保証できます。」 実際、上記のコードでは、サーバー証明書をチェックするだけです。今。ご希望の場合は、 クライアント証明書 (ステートメントの 2 番目の部分) 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 コンストラクターの 2 番目の引数に nil を渡します。

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

お役に立てれば。

他のヒント

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

変更

http_session.verify_mode = OpenSSL::SSL::VERIFY_PEER

http_session.verify_mode = OpenSSL::SSL::VERIFY_NONE
あなたがそれを行うたら

は、SSLが正常に動作します。私はいつも完璧に動作、私の開発環境では、この複数回使用しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top