1

より大きなキーを許可するために jce を既にインストールしていますが、KeytoolUIU と Portecle の両方でjava.IO.Exception: Error initialising store of key store: java.security.InvalidKeyException: Illegal Key Size のようなエラーが発生しています。キーは 1024 しかないので、なぜ不平を言っているのかわかりません。

キー ファイルをロードし、安全な Web サイトにアクセスするための現在のコードを次に示します。

package com.g4apps.secure.android.sslclient;

import java.io.InputStream;
import java.security.KeyStore;
import java.security.Security;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import android.content.Context;

/**
 * This example demonstrates how to create secure connections with a custom SSL
 * context.
 */
public class SSLclient {


    public final static String authenticate(Context context) throws Exception {
        DefaultHttpClient httpclient = new DefaultHttpClient();
        String output=null;

        Security.addProvider(new BouncyCastleProvider());
        try {
            KeyStore trustStore  = KeyStore.getInstance("BKS");
            InputStream instream = context.getResources().getAssets().open("my.truststore");
            try {
                trustStore.load(instream, "dysan100".toCharArray());
            } finally {
                try { instream.close(); } catch (Exception ignore) {}
            }
            KeyStore keystore = KeyStore.getInstance("BKS");
            InputStream keystream = context.getResources().getAssets().open("my.keystore.bks");
            try {
                keystore.load(keystream, "dysan100".toCharArray());
            } finally {
                try { keystream.close(); } catch (Exception ignore) {}
            }

            SSLSocketFactory socketFactory = new SSLSocketFactory(keystore,"dysan100",trustStore);
            socketFactory.setHostnameVerifier(new AllowAllHostnameVerifier());
            Scheme sch = new Scheme("https", socketFactory, 443);
            httpclient.getConnectionManager().getSchemeRegistry().register(sch);

            HttpGet httpget = new HttpGet("https://192.168.1.123/test.php");

            System.out.println("executing request" + httpget.getRequestLine());

            HttpResponse response = httpclient.execute(httpget);
            HttpEntity entity = response.getEntity();

            System.out.println("----------------------------------------");
            System.out.println(response.getStatusLine());
            if (entity != null) {
                System.out.println("Response content length: " + entity.getContentLength());
                output=EntityUtils.toString(entity);
                System.out.println(output);
                return output;

            }


        } finally {
            // When HttpClient instance is no longer needed,
            // shut down the connection manager to ensure
            // immediate deallocation of all system resources
            httpclient.getConnectionManager().shutdown();
        }

        return null;
    }

}

現在、キーストアは次のように構成されています

my.truststore.bks には CA 証明書
があります my.keystore.bks には、サーバー証明書、クライアント証明書、およびクライアントの秘密鍵があると想定されています。

これは、PC バージョンのプログラムでセットアップしたのと同じ方法です (代わりに JKS ストアを使用します)。

このようにストアをセットアップできないので、別の方法がありますか?

4

1 に答える 1

1

bks キーストアを作成できない理由はわかりませんが、PKCS12 キーストアで動作させることはできました。だから私は代替案を持っています。

        KeyStore keystore = KeyStore.getInstance("PKCS12");
        InputStream keystream = context.getResources().getAssets().open("client.p12");
        try {
            keystore.load(keystream, "dysan100".toCharArray());
        } finally {
            try { keystream.close(); } catch (Exception ignore) {}
        }
于 2012-08-14T00:06:15.820 に答える