|
|||||
|
対象: 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]
|
|||||