我目前正在使用Android Studio开发Android应用程序,用于基于硬件的相互SSL身份验证。
客户端身份验证是基于硬件的,因此我无权访问客户端证书的私钥。我能做的是
据我所知,唯一的方法是使用自定义JCE提供程序,KeyStore和签名类获取KeyStore。
我找到了来自Nikolay Elenkov的博客,特别是这篇文章真的帮助我理解了智能卡通信。感谢那。 http://nelenkov.blogspot.de/2013/10/signing-email-with-nfc-smart-card.html
我尝试实现自定义JCE提供程序和自定义KeyStore和签名类来编写自定义身份验证。 我的提供商基于文档(http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/HowToImplAProvider.html),但在Android上我得到了这个例外:
SSL Context Exceptionjava.security.NoSuchAlgorithmException: KeyStore mypkcs11 implementation not found
这是我的自定义提供商:
public class PKCS11_Custom_Provider extends AuthProvider {
public PKCS11_Custom_Provider(){
super("Custom_p", 1.0, "Custom_p");
AccessController.doPrivileged(new java.security.PrivilegedAction() {
public Object run() {
put("KeyStore.mypkcs11",
"Pathtomyclass.P11KeyStore");
put("Signature.mypkcs11",
"Pathtomyclass.P11Signature");
return null;
}
});
}...
这是我的KeyStore实现:
PKCS11_Custom_Provider myProvider = new PKCS11_Custom_Provider();
Security.insertProviderAt(myProvider, 2);
KeyStore ks = KeyStore.getInstance("myPKCS11", myProvider);
在使用NetBeans的JDK 1.7上,代码工作正常,但在Android上我总是遇到此异常。
我该如何解决这个问题?