2011-10-17 23 views
5

特定のWebリクエストに対してSSL認証を必要とするAndroidアプリケーションを作成しています。証明書ファイルを使用してキーストアファイルを作成する方法についてオンラインで参照するオプションとは異なり、私はjsonレスポンスの文字列として証明書を返す初期Webリクエストを作成する必要があります。Android - pkcs12証明書文字列をbksキーストアのx509証明書オブジェクトに変換する

JSONデータが...次のようにフォーマットされます。私は、この値をデコードしています

"result":{ 
    "pkcs12": "Ulv6GtdFbjzLeqlkelqwewlq822OrEPdH+zxKUkKGX/eN...9801asds3BCfu52dm7JHzPAOqWKaEwIgymlk=" 
}, 

(注次の証明書が短縮されるが、「...」実際の応答には存在しません) Base64.deocodeを使用すると、バイトとして保存するには、[]次に

ssl.setPkcs12(Base64.decode(jsonObject.optString("pkcs12"))); 

私はバイトを使用してのX509Certificateを作成しようとしています[]

CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 
InputStream in = new ByteArrayInputStream(ssl.getPkcs12()); 
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(in); 

私のコードは、私はまったく運を持つ単純な問題と思われるものを修正しようと多くの時間を費やしている

"java.security.cert.CertificateException: org.apache.harmony.security.asn1.ASN1Exception: ASN.1 Sequence: mandatory value is missing at [4]". 

でgenerateCertificate()メソッドに失敗しています。どんな助けも素晴らしいだろう!誰が答えを必要とする場合には

+0

ここに証明書を含むJSON応答を貼り付けることはできますか? – emboss

+0

"結果":{ "PKCS12": "Ulv6GtdFbjzLeqlkelqwewlq822OrEPdH + zxKUkKGX/EN ... 9801asds3BCfu52dm7JHzPAOqWKaEwIgymlk =" } – calebisstupid

答えて

8

...

は、私は完全にはBouncyCastleライブラリを除去し、代わりにBKSのPKCS12ストアを使用することによってこの問題を回避することができました。次のスニペットが解決策です。私はもはや証明書オブジェクトを生成する必要はありませんでした。代わりに、json証明書ストリングを環境設定に保存し、それをつかんでキーストアを生成するために使用しています。 base64デコーダはBouncyCastleデコーダではなく、カスタム標準デコーダです。

KeyStore keyStore = KeyStore.getInstance("PKCS12"); 
String pkcs12 = UserSession.getCertificate(context); 
InputStream sslInputStream = new ByteArrayInputStream(MyBase64Decoder.decode(pkcs12.getBytes())); 
keyStore.load(sslInputStream, "password".toCharArray()); 
関連する問題