我刚刚完成了这项工作,我认为您不会对我的回答感到非常满意,但它确实有效:)
因此,困难的部分是获取执行客户端身份验证所需的 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 并进行客户端身份验证。
祝你好运!