【问题标题】:TLS/SSL client authentication using a client certificate which comes available at runtime Android/JavaTLS/SSL 客户端身份验证使用在运行时提供的客户端证书 Android/Java
【发布时间】:2011-08-18 09:00:25
【问题描述】:

假设我有一个应用程序,它以某种方式在运行时通过安全通道检索客户端证书(私钥/公钥对)(因此我在构建时没有此客户端证书)。

如何在不使用 keytool 和不使用持久/ondisk 密钥库的情况下使用此客户端证书进行客户端身份验证。所以我不想(实际上我不能)使用命令行 keytool 导入它?

其实我想复制 libcurl 中的功能。您只需设置客户端证书(使用私钥)并完成。它不涉及密钥库。

所有这些都必须在 Java/Android 中完成。

【问题讨论】:

    标签: java android https ssl


    【解决方案1】:

    您可以在 Java 中通过定义您自己的 KeyManager 来完成此操作,如 JSSE Reference Guide 中所述。我不会为 Android 说话。

    【讨论】:

    • 用包含我的客户端证书和私钥的 KeyStore 对象来初始化(初始化)一个 KeyManager 就足够了吗?我假设我可以使用 setCertificateEntry 和 setKeyEntry 将我的客户端证书和私钥推送到其中。
    【解决方案2】:

    我刚刚完成了这项工作,我认为您不会对我的回答感到非常满意,但它确实有效:)

    因此,困难的部分是获取执行客户端身份验证所需的 pkcs12 证书,如果您的证书已经在 pkcs12 中,那么您已经解决了所有困难,您可以参考@上的第二个答案987654321@ 了解如何使用该证书。

    如果您只有一对公钥私钥而不是 pkcs12 证书,那么您需要制作一个。据我所知,java/android 无法创建此证书,因此您需要使用 android NDK 和 openssl。

    如果您从https://github.com/guardianproject/openssl-android 下载 openssl-android 项目,您可以使用它来构建 openssl。默认情况下,它编译为 .so 共享对象,但只有一些我尝试运行此代码的 android 设备能够链接到 libcrypto,因此,尽管我确信有更好的方法进入 Android.mk 文件和在一些地方用 include $(BUILD_STATIC_LIBRARY) 替换了 include $(BUILD_SHARED_LIBRARY),这样我就可以编译一个 .a 静态库。

    然后我使用来自 Android NDK: Link using a pre-compiled static library 的信息将我编译的 libcrypto.a 链接到我的本机代码。

    本机代码使用 openssl 首先创建一个 X509 证书,然后使用它创建一个 PKCS12 文件,该文件可以按照我之前提到的方式使用,位于 SSL client authentication in Android

    首先,您需要将您的公钥和私钥作为 EVP_PKEY 指针放入本地,这可以根据您的密钥格式以多种方式发生,然后您可以使用以下代码创建 X509 证书

    X509 *public_key_cert = X509_new();
    
    X509_gmtime_adj(X509_get_notBefore(public_key_cert),0);
    X509_gmtime_adj(X509_get_notAfter(public_key_cert), (long) 60*60*24*365);
    
    X509_set_pubkey(public_key_cert,evp_pub_key);
    

    这将创建有效期为 1 年的最低有效 X509 证书。如果您要运行自己的证书颁发机构,您可能需要执行其他操作,例如签署证书,或者设置包含各种信息的大量标头中的任何一个。

    接下来您需要使用 X509 证书创建 pkcs12 证书,如下所示:

    PKCS12 *pkcs12 = PKCS12_create(password, "Some Sort of Friendly Name", evp_priv_key, public_key_cert, NULL, 0, 0, 0, 0, 0);
    

    password 是一个 char*,包含将用于使用三重 DES 加密私钥的密码

    现在您拥有 pkcs12 证书,您可以转到 SSL client authentication in Android 并进行客户端身份验证。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 2014-04-04
      • 2014-01-29
      相关资源
      最近更新 更多