什么是.NET(C#)对应的JSSE?

4
我正在使用 EntireX Broker 9.5.1 开发一个应用程序,我试图将tpcip连接转换为使用ssl。 我已成功升级我的 代码以执行相同的操作,这要感谢Java / Software AG使用来处理SSL /证书验证。 然而,当在 下连接到同一服务器/端口时,我收到以下错误消息:
02150403:证书过期或无效

错误消息听起来像是在传达信息。那么,我该如何使 .Net 成功验证证书?

PS: 该证书由Verisign签名。

更新:
https://server.domain:port下,IE和Firefox都成功连接而没有抛出证书错误。我的应用程序实际上是连接到ssl://server:port?verify_server=y
verify_server=n会抛出相同的证书错误。

证书未过期。异常堆栈跟踪在Broker.Logon();处停止。

在SoftwareAG.EntireX.NETWrapper.Runtime.Broker.Logon(String password)处:
在C:\ Users \ tfburton \ Documents \ Visual Studio 2010 \ Projects \ NEW FADCOM \ FAServer \ EntireXDotNetClasses \ EntireXWrapper.cs的FAServer.EntireXDotNetClasses.EntireXWrapper.CreateBroker(),第1302行

更新:
以下是我创建Broker对象的方法。

try
{
  Broker mybroker;
  try { mybroker = new Broker(BrokerName, BrokerUser); }
  catch (Exception e)
  {
     Utilities.LogEntry("Error Creating broker instance -- BEFORE LOGON. ", e, true);

     throw new WrapperException("Error Creating broker instance -- BEFORE LOGON. "
                               + Environment.NewLine + e.Message);
  }
  try //{ mybroker.Logon(BrokerPass); }
  {
     mybroker.Password = BrokerPass;
     mybroker.Logon();  //<-- stracktrace points here
  }
  catch (AccessViolationException ave)
  {
     Utilities.LogEntry("Error During Broker Logon.", ave, 
                        EventLogEntryType.Error);

     throw new WrapperException(ave); //wrap and duck
  }
}
catch ( Exception e )
{   
   Utilities.LogEntry("Error Creating broker instance. ", e, true);

   XException be = e as XException; 
   if ( null != be  ) //<-- resolves to true
   {
      String msg = "Certificate error connecting to: " + BrokerName;

      throw new WrapperException(msg, e);
   }
   throw new WrapperException( "Error Creating broker instance. " 
                             + Environment.NewLine + e.Message);  //<-- error caught and re-thrown here

}

1
“证书已过期或无效”表示服务器上的证书存在问题。不知道您在成功尝试使用JSSE时是否涉及任何自定义信任管理器(忽略错误类型的管理器)?另一种调查方法是检查服务器是否使用服务器名称指示(SNI),以及两个客户端是否同样支持它(或不支持),这可能导致客户端使用不同的证书。(Java 7客户端通常支持SNI。) - Bruno
默认的信任管理器已经成功验证了。无需自定义。(一旦我修复了一个单独的错误,即为信任存储设置了不正确的密码。) - Raystorm
2
当使用Verisign颁发的证书时,通常应该使用默认的信任存储(即不需要指定任何内容)来进行信任。因此,需要调整信任存储密码似乎有些奇怪。请确认您的服务器证书是否受IE信任。可以使用Wireshark检查是否使用了SNI(在ClientHello消息中查找“server_name”扩展),以及是否使用相同的服务器证书与两个客户端通信。 - Bruno
我有一个Java应用程序连接到一个单独的HTTPS Web服务,使用第二个/单独的密钥库来存储一些自签名的证书。我错误地在该应用程序中设置了全局属性而不是本地属性。如果我没有那样做,我就不需要在Java中进行任何调整。明天我会在工作中检查IE是否出现任何证书错误。 - Raystorm
1
你有应用程序失败的代码片段可以展示吗? - Bruno
显示剩余2条评论
1个回答

2

结果发现我在错误的方向上努力。

我不确定.NET是否有JSSE的等效物。

我的解决方案变得更加简单,将根证书连接成一个文本文件并添加。

trust_store=path\to\file\myrrootcerts.pem

作为URL的参数,也就是说
BROKER-ID

只是一点观察...您不应该需要添加整个根证书集来验证一个证书。通常,一个证书由一个CA签名。也许再加上一个CA的计数签名。 - jww
2
如果我没记错的话,该文件中大约有5个证书。根证书和几个中间证书。 - Raystorm
2
啊,终端实体或证书应该包括构建有效链所需的所有中间证书(不包括链的根)。这是PKI中众所周知的“哪个目录”问题(你刚刚经历了它)。有关更多信息,例如添加中间证书和创建PFXPKCS12文件,请参见Unable to load certificates when trying to generate pfx file - jww

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接