【发布时间】: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