対象:
JRuby

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. sshの公開鍵をDSAでなくRSAに変更する。
  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)

新着情報
【オープンソースソフトウェア環境構築】Apple silicon Macで開発環境を構築
【Rust Tips】Actix webでJSONをPOSTする
【Rust Tips】コマンドライン引数を取得する

Copyright(C) 2004-2014 モバイル開発系(K) All rights reserved.
[Home]