2011-08-18 6 views
3

런타임에 보안 채널을 통해 클라이언트 인증서 (개인/공개 키 쌍)를 어떤 방식으로 검색하는 응용 프로그램이 있다고 가정합니다. 빌드시이 클라이언트 인증서가없는 경우).런타임에 제공되는 클라이언트 인증서를 사용하는 TLS/SSL 클라이언트 인증

keytool을 사용하지 않고 persistent/ondisk 키 스토어에서 일부만 사용하지 않고 클라이언트 인증에이 클라이언트 인증서를 사용하려면 어떻게해야합니까? 그래서 커맨드 라인 keytool을 사용하여 가져 오기를 원하지 않습니다.

사실 저는 libcurl에서 수행 된 기능을 복제하려고합니다. 방금 클라이언트 인증서를 개인 키로 설정하고 완료했습니다. 이것은 키 스토어를 포함하지 않습니다.

모든 것은 Java/Android에서 수행되어야합니다.

답변

1

JSSE Reference Guide에서 설명한대로 자체 KeyManager를 정의하여 Java에서 수행 할 수 있습니다. 나는 안드로이드에 대해 말할 수 없다.

+0

내 클라이언트 인증서 및 개인 키가 들어있는 KeyStore 개체로 KeyManager를 초기화 (init)하는 것으로 충분합니까? 나는 내 클라이언트 인증서와 개인 키를 setCertificateEntry와 setKeyEntry를 사용하여 push 할 수 있다고 가정한다. – Bjorn

0

난 그냥이 작업 있고 난 당신이 내 대답에 매우 행복 할 것 같아요하지만 경우, 작업 :

그래서 어려운 부분은 당신이 클라이언트 인증을 수행하는 데 필요한 PKCS12 인증서를 얻을 수 있습니다 않습니다 귀하의 인증서가 이미 pkcs12에 있다면 당신은 모든 어려운 일들을 빠져 나갔고, SSL client authentication in Android에 대한 두번째 대답을 참조하여 그 인증서를 어떻게 사용하는지보십시오.

방금 ​​공개 개인 키 쌍이 있고 pkcs12 인증서가없는 경우 하나를 만들어야합니다. 당신이 안드로이드 NDK와 openssl을 사용할 필요가 있도록이 인증서를 생성하는 방법은 java/android에 없다.

openssl-android 프로젝트를 https://github.com/guardianproject/openssl-android에서 다운로드하면이 프로젝트를 사용하여 openssl을 빌드 할 수 있습니다. 기본적으로 그것은 .so 공유 객체로 컴파일되지만이 코드를 실행하려고 시도한 일부 안드로이드 장치 만 libcrypto와 연결할 수 있었으므로 Android.mk 파일에 들어가서 더 나은 방법이 있는지 확인합니다. 대체되었습니다. 정적 라이브러리를 컴파일 할 수 있도록 include $ (BUILD_STATIC_LIBRARY)와 함께 $ (BUILD_SHARED_LIBRARY)를 몇 군데에 포함 시켰습니다.

그런 다음 Android NDK: Link using a pre-compiled static library의 정보를 사용하여 내 기본 코드에 컴파일 된 libcrypto.a를 연결합니다.

이 네이티브 코드는 SSL client authentication in Android

먼저 당신이 공공 및 민간 얻을 필요가 먼저 X509 인증서를 만들 수있는 OpenSSL을 사용하고 내가 전에에 위치한 언급 한 방식으로 사용할 수있는 PKCS12 파일을 생성하는 데 사용 열쇠는 당신이 X509 인증서를 만들려면 다음 코드를 사용할 수 있습니다에 어떤 형식에 따라 다양한 방법으로 일어날 수 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 년입니다. 자신의 인증 기관을 운영하려는 경우 인증서에 서명하는 것과 같은 다른 작업을 수행하거나 다양한 정보 비트가 포함 된 많은 헤더 집합을 설정할 수 있습니다.

다음 당신은 사용하여 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를 사용하여 개인 키를 암호화하는 데 사용되는 암호를 포함하는 문자의 *입니다

이제 pkcs12 인증서를 가지고 SSL client authentication in Android으로 이동하여 클라이언트 인증을받을 수 있습니다.

행운을 빌어 요!

관련 문제