【问题标题】:Paypal certificate upgrade to sha256Paypal证书升级到sha256
【发布时间】:2016-04-27 06:10:21
【问题描述】:

Paypal 已更新其沙盒 API 端点和证书以使用 sha256 而不是 sha1。 要将我的应用程序(连接到贝宝以进行快速结帐)迁移到使用 sha256,

a) 从我的贝宝帐户中删除并下载新证书并转换 它为 .p12 格式 使用 openssl 确认证书使用的是 sha256withRsa

b) 确认 /etc/ssl/certs/ca-certs.crt 具有链接中给出的威瑞信 G5 CA 证书 https://gist.github.com/robglas/3ef9582c6292470a1743

仍然无法从我使用 HttpClient 的 java 代码连接到 paypal 沙箱。握手失败

在java代码中 - 使用 SSLContext.getInstance("SSL")

使用自定义信任库

Class CustomTrustManager implements X509TrustManager {

public boolean checkClientTrusted(java.security.cert.X509Certificate[] chain) {
    return true;
}

public boolean isServerTrusted(java.security.cert.X509Certificate[] chain) {
    return true;
}

public java.security.cert.X509Certificate[] getAcceptedIssuers() {
    return null;
}

public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
}

public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
}

}

我正在使用实例 SunX509 的 KeyManagerFactory 并将其初始化为 pkcs12 密钥库。

我有什么遗漏吗?请帮忙!

【问题讨论】:

  • 你不需要一个自定义的 TrustManager 来做这个,而且这个也没什么用,但是你经常会看到它被发布为一个“解决方案”。不要使用此代码。 getAcceptedIssuers() 不能返回 null,整个事情是 100% 不安全的。你也可以像这样使用明文。

标签: java ssl paypal certificate rsa-sha256


【解决方案1】:

问题在于 open-jdk 7 版本。默认情况下,open jdk 似乎具有 JCE 无限强度策略文件(需要支持 256 位密码)。但是,某些版本禁用了密码(可能是错误)。将 open jdk 升级到 1.7.0_91 版本解决了这个问题。

【讨论】:

    【解决方案2】:

    这个比较适合评论,但是我的声望不够。 我过去在其他服务中遇到过类似的问题,问题是 java 7 默认使用旧的 ssl 算法,如果可以,请尝试使用 java 8。如果您必须坚持使用当前的 java 版本,请尝试使用不同的算法或查看是否可以从 paypal 获取有关 ssl 配置的一些信息。这个link 可能会有所帮助

    【讨论】:

    • 非常感谢您的链接。 Paypal 下载的 API 证书的签名算法为“sha256WithRsa”。 “提供者”SunRsaSign 支持 sha256WithRsa,而 SunJSSE 不支持。现在 SunRSASign 似乎不支持 pkcs12。 KeyStore.getInstance("PKCS12", "SunRsaSign");抛出错误。 SunRsaSign 提供签名类,不提供 jks/pkcs12 的实现。签名类如何用于ssl ssl连接?
    • 我认为 this 应该会有所帮助。在页面底部(由于某种原因我无法链接它滚动),有“导入和导出 PKCS#12 密钥库”。希望对您有所帮助。
    • 这不是关于 SSL 算法,而是关于证书签名算法。