最近、Tamir.SharpSSH を使用するアプリケーションを Windows 2003 サーバーから Windows Server 2012 に移動しました。
アプリの SFTP 機能をテストしているときに、次のエラーを受け取りました。
{"Session.connect: System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。\r\n at Tamir.SharpSsh.jsch.jce.HMACMD5.update(Byte[] foo, Int32 s, Int32 l)\ r\n at Tamir.SharpSsh.jsch.jce.HMACMD5.update(Int32 i)\r\n at Tamir.SharpSsh.jsch.Session.read(Buffer buf)\r\n at Tamir.SharpSsh.jsch.UserAuth. start(Session session)\r\n at Tamir.SharpSsh.jsch.UserAuthNone.start(Session session)\r\n at Tamir.SharpSsh.jsch.Session.connect(Int32 connectTimeout)"}
FIPS 準拠のアルゴリズムが無効になっていることを確認しました。
次に、Tamir.SharpSSH への DLL 参照をプロジェクトから削除し、ソース コード プロジェクトを追加しました。これにより、コードにステップインして、SharpSSH ライブラリで障害が発生している場所をより具体的に特定できるようになりました。
以下に示すように、 update() メソッドの cs.Write(foo, s, l) でエラーが発生しています。
public void update(byte[] foo, int s, int l) { cs.Write( foo, s, l); }
これは、cs オブジェクト参照が NULL であるためです。
cs オブジェクト参照は、HMACMD5.cs の init() メソッド (最終行) で設定されるはずですが、このメソッドが呼び出されているようには見えません。
public void init(byte[] key)
{
if(key.Length>bsize)
{
byte[] tmp=new byte[bsize];
Array.Copy(key, 0, tmp, 0, bsize);
key=tmp;
}
// SecretKeySpec skey=new SecretKeySpec(key, "HmacMD5");
// mac=Mac.getInstance("HmacMD5");
// mac.init(skey);
mentalis_mac = new Org.Mentalis.Security.Cryptography.HMAC(new System.Security.Cryptography.MD5CryptoServiceProvider(), key);
cs = new System.Security.Cryptography.CryptoStream( System.IO.Stream.Null, mentalis_mac, System.Security.Cryptography.CryptoStreamMode.Write);
}
ただし、 init() メソッドが呼び出されない理由は正確にはわかりません。
誰もこのようなことを経験しましたか?
Windows Server 2012 の互換性の問題ではないかと考えています。
前もって感謝します。