2011-08-18 112 views
3

假设我有一个应用程序以某种方式在运行时通过安全通道检索客户端证书(私钥/公钥对)(所以我不用在构建时没有这个客户端证书)。使用客户端证书的TLS/SSL客户端身份验证在运行时可用Android/Java

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

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

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

回答

1

通过定义您自己的KeyManager,您可以在Java中完成,如JSSE Reference Guide中所述。我无法为Android发言。

+0

使用包含我的客户端证书和私钥的KeyStore对象初始化(初始化)KeyManager是否足够?我假设我可以使用setCertificateEntry和setKeyEntry将我的客户端证书和私钥推送到那里。 – Bjorn

0

我刚刚得到这个工作,我不认为你会很高兴我的答案,但它的工作:)

那么难的是得到你需要执行客户端身份验证PKCS12证书,如果您的证书已经在pkcs12中,那么您已将所有困难的东西排除在外,并且您可以参考SSL client authentication in Android上的第二个答案以了解如何使用该证书。

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

如果您从https://github.com/guardianproject/openssl-android下载openssl-android项目,您可以使用它来构建openssl。默认情况下,它编译为一个.so共享对象,但只有一些我尝试运行此代码的Android设备能够链接到libcrypto,所以,虽然我确定有更好的方式进入Android.mk文件,并且在几个地方替换include $(BUILD_SHARED_LIBRARY)并包含$(BUILD_STATIC_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); 

这就造成了最微创有效X509证书有效期为1年。如果要运行自己的证书颁发机构,或者设置包含各种信息位的大型头部集合,您可能需要执行其他操作,如签署证书。

接下来,你需要使用创建PKCS12证书X509证书是这样的:

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

密码是包含将用于使用三重DES

加密私钥的密码一个char *

既然你有一个pkcs12证书,你可以转到SSL client authentication in Android并获得客户端认证。

祝你好运!

相关问题