【问题标题】:SSL with certificates working in Java but not in C#带有证书的 SSL 可以在 Java 中使用,但不能在 C# 中使用
【发布时间】:2012-11-05 03:42:26
【问题描述】:

我必须调用需要 SSL 和客户端身份验证的服务。 我有一个 p12 客户端证书(私有和公共)和一个公共远程服务器证书。

Java 客户端: 远程证书在 jks 中,服务工作正常。

c#: 我尝试使用相同的 p12 进行身份验证并将 pem(使用 keytool 从 jks 导出)加载到 LocalComputer Personal 文件夹中,但出现异常:

 The remote certificate is invalid according to the validation procedure.

我查看了服务器证书的详细信息,发现无法完成上链;我认为是因为证书颁发者的范围不包含签名权。

如果这是正确的,为什么 java 可以工作?
如果这不正确,为什么 C# 不起作用?
如何强制 C# 将来自服务器的证书视为有效?
在 Windows 中,我必须始终通过证书管理单元和 LocalComputer 等,否则我可以将信任嵌入到我的客户端应用程序中?

更新:

我更改了标题并删除了 web-services 标记,因为这不是特定于 Web 服务的问题,而是 SSL;所以:
标题是:WS 调用,客户端证书在 Java 中工作,但在 C# 中不工作
现在标题:SSL 证书在 Java 中工作,但不在C#

现在我的 C# 系统通过调用 java 应用程序来工作,但我不太喜欢它。
我在不同环境下使用同一系统上的相同证书集测试了应用程序,并声明违反信任链不允许我的 c# 客户端通过 SSL 连接,但 java 忽略它。

所以我的最后一个问题是:java 在建立 SSL 连接时是否会忽略整个信任链的完整性?

【问题讨论】:

  • 我认为 java 和 C# 中的可信证书不同。 Java 使用它自己的证书存储,它可能有需要的证书。而 C# 可能会错过它。
  • 除非 Java 代码本身禁用了信任管理(它不应该这样做),否则 Java 应该以与 C# 相同的方式验证远程证书。请注意,JRE 使用自己的信任存储,这可能与 C# 使用的 Windows 存储不同。您也可以验证服务器是否配置良好。此外,Java 7 也可能使用 SNI,而您的 C# 客户端可能不使用(在这种情况下,它将返回不同的证书):例如,您可以通过查看与 Wireshark 的握手来检查这一点。

标签: c# java ssl certificate


【解决方案1】:

这通常是因为以下任一情况为真:

  • 证书是自签名的,没有添加为可信证书。
  • 证书已过期。
  • 证书由您的计算机上未安装的根证书签名。
  • 已探查吊销列表,但无法找到/使​​用。

尝试获取有关服务器证书的一些信息,看看是否需要在客户端上安装任何特定证书才能使其正常工作。

【讨论】:

  • 证书由根证书签署,但该根证书不是 CA。我怎么能告诉 C# 接受它呢?为什么java可以避免这个检查?
猜你喜欢
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
相关资源
最近更新 更多