対象: net-sshの公開鍵認証でDSAErrorを回避する公開鍵認証を行っているサーバにnet-sshでsshしようとして以下のようなエラーに遭遇したことはないだろうか。 /usr/local/jruby-1.5.6/lib/ruby/gems/1.8/gems/net-ssh-2.0.23/lib/net/ssh/transport/openssl.rb:116:in `ssh_do_sign': bad sig size (OpenSSL::PKey::DSAError) このエラーはsshの公開鍵にDSAを使用しており、かつJRubyでnet-sshを使用してsshしたときに発生(Rubyは問題ない)する。エラーの原因はnet-sshのOpenSSLモジュールのDSA.ssh_do_signメソッド内で、a1sig.value[n].valueが返すオブジェクトがRubyの場合はOpenSSL::BNであるのに対して、JRubyの場合だとBignumを返すことにある。このため、OpenSSL::PKey::DSAError bas sig sizeとなってしまう。 この問題の解決策は2つある。
1の場合はRSAでクライアントの鍵を再作成して該当サーバに設定すればOK。どうしても1が無理ならば、net-sshインストール先の該当モジュール(例えば/usr/local/jruby-1.5.6/lib/ruby/gems/1.8/gems/net-ssh-2.0.23/lib/net/ssh/transport/openssl.rb)のssh_do_signメソッドをこんな風に書き換える。 # Signs the given data. def ssh_do_sign(data) # 途中省略 # 112行目辺りからの2行をコメントアウト # sig_r = a1sig.value[0].value.to_s(2) # sig_s = a1sig.value[1].value.to_s(2) # 上の2行の代わりに以下を追加 w_r = a1sig.value[0].value w_s = a1sig.value[1].value w_r = OpenSSL::BN.new(w_r.to_s) if !w_r.instance_of?(OpenSSL::BN) w_s = OpenSSL::BN.new(w_s.to_s) if !w_s.instance_of?(OpenSSL::BN) sig_r = w_r.to_s(2) sig_s = w_s.to_s(2) (2010/12/21)
Copyright(C) 2004-2014 モバイル開発系(K) All rights reserved.
[Home]
|