【问题标题】:HTTPS with self-signed certificate produces handshake error带有自签名证书的 HTTPS 会产生握手错误
【发布时间】:2011-09-07 20:20:12
【问题描述】:

我正在尝试使用自签名客户端和服务器证书通过 Android 的 HttpClient 连接到 HTTPS 网络服务器。证书和私钥都存储在 PKCS#12 密钥库中。

我使用 this example 与加载密钥库的区别:

KeyStore trustStore = KeyStore.getInstance("PKCS12");
trustStore.load(new FileInputStream(keystoreFile), "mypass".toCharArray());

密钥库正确加载,因为我能够列出其中的所有证书。

但是,当执行 GET 请求时,我得到:

09-07 22:01:05.197: ERROR/TTT(3716): IOException: java.io.IOException: 
SSL handshake failure: Failure in SSL library, usually a protocol error
error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure 
(external/openssl/ssl/s3_pkt.c:1127 0x2e3b40:0x00000003)

我正在使用 OS 2.3.4 的 Nexus S 和使用 OS 2.2 的 HTC Desire 以及使用 OS 2.1 的模拟器上对此进行测试。它们都产生相同的错误。我查看了s3_pkt.c:1053,但无法理解问题所在。

有什么想法吗?

【问题讨论】:

    标签: android ssl https certificate


    【解决方案1】:
    trustStore.load(new FileInputStream(keystoreFile), "mypass".toCharArray());
    

    您似乎混淆了您的密钥库和信任库。密钥库包含您的私钥和证书。信任库包含其他人的证书。

    【讨论】:

    • 我不是这方面的专家,但似乎 java.security.Keystore 可以包含所有证书和私钥:download.oracle.com/javase/6/docs/api/java/security/…
    • 我从 PKCS#12 文件 (.p12) 加载的密钥库确实可以。我列出了所有条目,它们是:私钥、CA 证书和用户证书。 “信任库”只是原始示例中的变量名称。
    • +1 你是对的:我需要设置密钥库和单独的信任库。它们是同一个文件,但您必须设置两次。
    • @Peter Knego 从技术上讲,它们是同一种文件,但从安全的角度来看,它们应该是两个独立的文件。这就是为什么它都是这样指定的。密钥库包含您的私钥,并且应该受到非常高的安全性,因为它是您的身份。信任库只包含其他人的公共证书,它们没有任何安全性。在大型组织中,有权修改密钥库的人员与有权修改信任库的人员不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 2020-04-24
    相关资源
    最近更新 更多