2016-09-20 4 views
0

証明書の生成中に問題があります。 以下は関連コードです。Androidが証明書を生成できません

@SuppressLint("SdCardPath") 
public HttpsURLConnection setUpHttpsConnection(String urlString) 
{ 
    try 
    { 
     CertificateFactory cf = CertificateFactory.getInstance("X.509","BC"); 

     AssetManager assManager = context.getAssets(); 
     InputStream caInput = assManager.open("testCert.pfx"); 

     KeyStore keyStore = KeyStore.getInstance("PKCS12"); 

     Certificate ca = cf.generateCertificate(caInput); 

     System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN()); 

     keyStore.load(null, null); 
     keyStore.setCertificateEntry("ca", ca); 

     String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); 
     TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); 
     tmf.init(keyStore); 

     SSLContext context = SSLContext.getInstance("TLS"); 
     context.init(null, tmf.getTrustManagers(), null); 

     URL url = new URL(urlString); 
     HttpsURLConnection urlConnection = (HttpsURLConnection)url.openConnection(); 
     urlConnection.setSSLSocketFactory(context.getSocketFactory()); 

     return urlConnection; 
    } 
    catch (Exception ex) 
    { 
     Log.e("fff", "Failed to establish SSL connection to server: " + ex.toString()); 
     ex.printStackTrace(); 
     return null; 
    } 

} 

次のようなエラーが表示されます。

CertificateFactory cf = CertificateFactory.getInstance("X.509","BC"); 

エラートレース;

com.android.org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory$ExCertificateException 
rer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 
at com.android.org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory.engineGenerateCertificate(CertificateFactory.java:220) 
at java.security.cert.CertificateFactory.generateCertificate(CertificateFactory.java:196) 
at com.example.hilalinan.cert.ServiceCall.setUpHttpsConnection(ServiceCall.java:125) 
at com.example.hilalinan.cert.ServiceCall.doInBackground(ServiceCall.java:58) 
at android.os.AsyncTask$2.call(AsyncTask.java:295) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.IllegalArgumentException: unknown object in getInstance: com.android.org.bouncycastle.asn1.ASN1Integer 
at com.android.org.bouncycastle.asn1.ASN1Sequence.getInstance(ASN1Sequence.java:98) 
at com.android.org.bouncycastle.asn1.x509.TBSCertificate.getInstance(TBSCertificate.java:64) 
at com.android.org.bouncycastle.asn1.x509.Certificate.<init>(Certificate.java:61) 
at com.android.org.bouncycastle.asn1.x509.Certificate.getInstance(Certificate.java:45) 
at com.android.org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory.readDERCertificate(CertificateFactory.java:68) 
at com.android.org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory.engineGenerateCertificate(CertificateFactory.java:215) 
... 9 more 

この問題を検索したところ、this questionが見つかりました。私は私の電話は信頼できる資格情報のBCプロバイダを持っていないことを理解しました。質問のOPは私は私の電話にBCプロバイダを追加することを提案した。しかし、私がインストールしても、私のプログラムを使用している人を他のユーザーにインストールする方法を教えてください。 また、私は私のリストに紀元を追加する方法をgoogled 私は何も役に立たない見つけることができませんでした。

問題の解決方法はありますか?

ありがとうございます。

+2

'pfx'ファイルに複数の証明書とキーが含まれていてもよいPKCS#12ファイルです。したがって、PKCS12キーストアとして直接ロードし、そこから証明書オブジェクトを生成しないでください! – Robert

+0

私はこの話題に慣れていないと私は理解できませんでした。より具体的になりますか?証明書を生成できない場合、どのようにhttpsサービスにアクセスできますか? 'crt'ファイルを使うべきですか? – Hilal

答えて

1

pfxファイルは、ファイル拡張子を変更しない限り、複数の証明書とキーを含むPKCS#12ファイルです。

使用するコードには、簡易証明書(.cer,.crtまたは.der)が必要です。

したがって、あなたは、PKCS12キーストアとして直接それをロードする必要があり、そこから証明書オブジェクトを生成しようとしない。

InputStream caInput = assManager.open("testCert.pfx"); 
String pfxPassword = "password"; // change it to the correct password 
keyStore.load(caInput, pfxpassword.toCharArray()); 
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); 
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); 
tmf.init(keyStore); 
+0

この問題を回避していただきありがとうございます。しかし、今私はもう一つの例外があります。 javax.net.ssl.SSLPeerUnverifiedException:ホスト名10.0.0.35が確認されていません – Hilal

+0

Webサーバーで使用する証明書に正しいホスト名(この場合は「10.0.0.35」)が含まれていないようです。 Androidでホスト名の検証を無効にする可能性がありますが、これによりアプリが攻撃に対して脆弱になります。正しいホスト名でWebサーバーの証明書を再作成する方がよいでしょう。 – Robert

+0

ありがとうございました!証明書に正しいホスト名がない可能性があります。それを修正した後に修正されることを願っています。再度、感謝します – Hilal

関連する問題