我们最近将使用 Tamir.SharpSSH 的应用程序从 Windows 2003 服务器移至 Windows Server 2012。
在测试我们应用的 SFTP 功能时,我们收到了这个错误:
{"Session.connect: System.NullReferenceException: 对象引用未设置为对象的实例。\r\n 在 Tamir.SharpSsh.jsch.jce.HMACMD5.update(Byte[] foo, Int32 s, Int32 l)\ r\n 在 Tamir.SharpSsh.jsch.jce.HMACMD5.update(Int32 i)\r\n 在 Tamir.SharpSsh.jsch.Session.read(Buffer buf)\r\n 在 Tamir.SharpSsh.jsch.UserAuth。开始(会话会话)\r\n 在 Tamir.SharpSsh.jsch.UserAuthNone.start(会话会话)\r\n 在 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 兼容性问题。
提前致谢。