4

このことは、数日間私を悩ませています。この問題全体に関する他の多くの質問を読みましたが、まだ先に進むことができません。

Android で SSL をテストするためだけに、簡単なテスト アプリケーションを作成しました。アプリケーションにはボタンが 1 つしかなく、クリックすると、アプリケーションは SSL 暗号化接続を介して「Hello World」をテスト サーバーに送信しようとし、テスト サーバーはまったく同じフレーズで応答します。

最初に、openssl を使用してサーバーのテスト キーとテスト証明書を作成しました。それから、 Crazy Bob のブログに示されている指示に従っています。Bouncy Castle のサイトから直接 Bouncy Castle プロバイダーを取得し、Crazy Bob のブログに示されているように信頼できるキーストアを作成し、その時点ですべてが正しく行われていると信じています。

コードを実行しようとすると、「IOException: キー ストアのバージョンが違います」という例外が発生しました。次に、StackOverflowでこの質問を見つけました。そこでは、最新の bcprov-jdk15on-147.jarではなく、古い Bouncy Castle Provider を使用するように勧められました。私はこれを念頭に置き、実際に jdk13-146 から jdk16-146 までのすべての bcprovider を試してみました。それでも、同じ「IOExcpetion: キー ストアのバージョンが間違っています」というメッセージが表示されるたびに。例外。

次に、StackOverflow で同様の問題に関する別の質問を見つけました。誰かが、1024 サイズのキーの代わりに 512 ビット サイズのキーを使用して、その例外を取り除くことに成功しました。まあ、私はそれを試してみましたが、何も達成しませんでしたが、同じ例外がありました.

だから私は今ここにいて、次に何をすべきか考えています。私はアイデアとグーグル検索結果をほとんど使い果たしています。

私の Web コードは、クレイジーなボブのコードの 1 対 1 のコピーであり、アプリケーションにはボタンのみを処理するアクティビティ クラスしかありません。これを API レベル 7 で実装しようとしています。

どんな助けでも大歓迎です。ありがとう。

4

3 に答える 3

2

2 つの選択肢:

  1. あなたがしていることを実行して、独自のキー ストアを作成することができます。私はそれを実行しました。ここに、私が保存したコードからの指示を示します (機能させるのに非常に時間がかかるため)。

    PKS を生成するには:

    1. IIS7 で証明書を作成し、pfx としてエクスポートしました。SelfSSL の指示に従ってください: http://www.robbagby.com/iis/self-signed-certificates-on-iis-7-the-easy-way-and-the-most-effective-way/ 1a. ダウンロード ツール: http://cid-3c8d41bb553e84f5.skydrive.live.com/browse.aspx/SelfSSL 1b. 実行: SelfSSL /N:CN=mydomainname /V:1000 /S:1 /P:8081 サーバー 1c でポート 8181 を使用します。IIS マネージャーから cert.pfx へのエクスポート
    2. SSL でコマンド ラインを実行して、ファイルを X.509 に変換します: openssl pkcs12 -in C:\cert.pfx -out C:\cert.cer -nodes
    3. ファイルを編集し、-----BEGIN.... END CERTIFICATE----- を除くすべてを削除します。適切な(5)量のダッシュを取得し、タグとデータを別々の行に配置すると機能しました
    4. キーツールを使用します。C:\Java\JDK\bcprov.jar は個別にダウンロードされました C:\Users>keytool -import -v -trustcacerts -alias key_alias -file C:\cert.cer -keystore C:\mystore.bks -storetype BKS -provider org .bouncycastle.jce.provider.BouncyCastleProvider -providerpath C:\Java\JDK\bcprov.jar -storepass 123456
  2. TRUST ALL KeyStore を作成し、これらすべてを忘れてください。基本的に、エラーなしで任意の SSL を使用できます。本当に気にする場合は、本番環境で無効にしてください。SSLクライアントを準備するために使用するコードは次のとおりです(Apache HTTPクライアントを使用すると仮定)

    private HttpClient getHttpClient()
    {
        HttpParams params = new BasicHttpParams();
    
        //Set main protocol parameters
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
        HttpProtocolParams.setUseExpectContinue(params, true);
    
        // Turn off stale checking.  Our connections break all the time anyway, and it's not worth it to pay the penalty of checking every time.
        HttpConnectionParams.setStaleCheckingEnabled(params, false);
        // FIX v2.2.1+ - Set timeout to 30 seconds, seems like 5 seconds was not enough for good communication
        HttpConnectionParams.setConnectionTimeout(params, 30 * 1000);
        HttpConnectionParams.setSoTimeout(params, 30 * 1000);
        HttpConnectionParams.setSocketBufferSize(params, 8192);
    
        // Don't handle redirects -- return them to the caller.  Our code often wants to re-POST after a redirect, which we must do ourselves.
        HttpClientParams.setRedirecting(params, false);
    
        // Register our own "trust-all" SSL scheme
        SchemeRegistry schReg = new SchemeRegistry();
        try
        {
            KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
            trustStore.load(null, null);
    
            TrustAllSSLSocketFactory sslSocketFactory = new TrustAllSSLSocketFactory(trustStore);
            sslSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
    
            Scheme sslTrustAllScheme = new Scheme("https", sslSocketFactory, 443);
            schReg.register(sslTrustAllScheme);
        }
        catch (Exception ex)
        {
            LogData.e(LOG_TAG, ex, LogData.Priority.None);
        }
    
        ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params,schReg);
        return new DefaultHttpClient(conMgr, params);
    }
    
于 2012-06-12T03:02:39.067 に答える
0

さて、私もこの同じ状況に直面し、それを解決するために、 R4jによって参照された同じブログ投稿( http://nelenkov.blogspot.in/2011/12/using-custom-certificate-trust-store-on.html)から助けを借りました。関連する手順は次のとおりです。

  1. カスタムトラストを作成する:Portecleを使用してキーストアを作成し、サーバーから公開鍵証明書をインポートしました。
  2. キーペアを使用してカスタムキーストアを作成します。keytool-genkeypair-aliassample -keyalg RSA -sigalg SHA1withRSA -dname "CN = Nazgul、OU = Assault、O = Sauron Enterprises、L = Mordor、ST = Middle Earth、C = ME" -keypass welcome123 -validity 365 -storetype pkcs12 -keystore g:\ Mordor_key_store.pfx -storepass welcome123 -keysize 2048
  3. 次に、 nelkovのブログに記載されているようにそれらを使用します。また、abc.comに対して証明書が発行され、Verifierがwww.abc.comを拒否する状況に陥った場合に備えて、独自のカスタムAbstractVerifierを作成する必要がある場合があります。
  4. 最後に、安全なHTTPClientを作成するには、次のようにします。

            public static DefaultHttpClient getSecureHttpClient(){
        SchemeRegistry schemeRegistry = new SchemeRegistry();
        SSLContext sslContext = null;
        try {
            sslContext = createSslContext(true);
        } catch (GeneralSecurityException e) {
            e.printStackTrace();
        }
        final X509HostnameVerifier delegate = new BrowserCompatHostnameVerifier();
        MySSLSocketFactory socketFactory = new MySSLSocketFactory(sslContext, delegate);
        schemeRegistry.register(new Scheme("https", socketFactory, 443));
    
        DefaultHttpClient client = new DefaultHttpClient();
        HttpParams params = client.getParams();
        client = new DefaultHttpClient(new ThreadSafeClientConnManager(params,
                schemeRegistry), params){
            protected HttpParams determineParams(HttpRequest req) {
                HttpParams params = req.getParams(); // req is an HttpRequest object
                HttpConnectionParams.setSoTimeout(params, 60000);
                HttpConnectionParams.setConnectionTimeout(params, 60000);
                return params;
            }
        };
    
        return client;
    }
    

私の選択の詳細な理由については、この投稿http://fuking-android.quora.com/Implement-HTTPS-for-android-apps-a-novices-taleを参照してください。

于 2013-02-06T11:19:25.153 に答える
0

EWSにリクエストしようとしたときの私の質問に似ています。このリンクを参照してサンプル ソース コードをダウンロードし、私の回答のように変更できます。お役に立てれば!

更新
次のコマンドが機能しました(約2か月前に試しました):

  C:\OpenSSL-Win32\bin>keytool -importcert -v -trustcacerts -file "d:/cer.cer" 
  -alias parkgroup_restful -keystore "D:/parkgroup-ws-client.bks" 
  -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath 
 "D:/bcprov-jdk16-145.jar" -storetype BKS -storepass 1234567

  .... /**It should show the result here**/

   Trust this certificate? [no]:  yes
   Certificate was added to keystore
   [Storing D:/parkgroup-ws-client.bks]

   C:\OpenSSL-Win32\bin>keytool -list -keystore "D:/parkgroup-ws-client.bks" -provi
   der org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "D:/bcprov-
   jdk16-145.jar" -storetype BKS -storepass 1234567

   Keystore type: BKS
   Keystore provider: BC

   Your keystore contains 1 entry

   parkgroup_restful, Apr 10, 2012, trustedCertEntry,
   Certificate fingerprint (MD5): 36:47:88:62:23:1C:F3:52:17:BE:7A:A9:94:56:19:18

ご覧のとおり、私はbcprov-jdk16-145.jarと openssl lib を使用しています。あなたはそれを試すことができます。
キーストアを作成する別のツール: http://portecle.sourceforge.net/

于 2012-06-01T14:46:32.357 に答える