0

サーバーに安全に接続するために内部で cURL 呼び出しを行うアプリケーションを移植しています。サーバーに要求を行う前に、ダウンロードした証明書と秘密鍵ファイルを使用します。

RSA秘密鍵を含む「My_Private_key.pem」ファイル、送信された証明書サーバーを含む「My_Certificate.pem」ファイル、および「My_Private_key.pem」を暗号化するパスワードがあります。現在、cURL には SSLKey、SSLCertificate、および Password を設定するためのオプションがあります。例

curl_easy_setopt(curl, CURLOPT_SSLCERT, credentials->certfile);
curl_easy_setopt(curl, CURLOPT_SSLKEY, credentials->keyfile);
curl_easy_setopt(curl, CURLOPT_KEYPASSWD, credentials->passwd);

次に、cURL はこの情報を使用してサーバーに要求します。Androidでも同様のことをしたいです。EasySSLSocketFactory、EasyX509TrustManager を使用する独自の HttpClient を作成するのに役立つ多くのリンクを調べましたが、Android でこれらのオプションを設定する方法が見つかりませんでした。

Android で行う同等の方法は何ですか?

私はSSLに非常に慣れていないので、私の質問は少し素朴かもしれませんので、ご容赦ください:)

4

2 に答える 2

2

キーと証明書から PKCS#12 ファイルを作成し、それをキーストアとしてロードして、HttpClient (または HttpsURLConnection) を初期化する必要があります。HttpClient の場合、SSLSocketFactoryクラスを使用して、キーと証明書でクライアントを初期化できます。

次のようなものを使用して、PKCS#12 ファイルを作成できます。

$ openssl pkcs12 -export -in mycert.pem -inkey mykey.key -out mystore.pfx

于 2012-04-20T12:57:19.073 に答える
0

これが私にとって完璧に機能したものです。stackoverflow リンクから取得しましたが、今は見つかりません。だからコードを投稿する

public void setHttpsClient(String password) {

        try {
            KeyStore mycert = KeyStore.getInstance("pkcs12");

            byte[] pkcs12;

            //Load the PKCS file from database or file.
            pkcs12 = DataManager.getAuthP12Data();
            ByteArrayInputStream pkcs12BAIS = new ByteArrayInputStream(pkcs12);
            mycert.load(pkcs12BAIS, password.toCharArray());

            SSLSocketFactory sockfact = new SSLSocketFactory(mycert, null, null);

             sockfact.setHostnameVerifier(new StrictHostnameVerifier());

            // Done temporarily to accept all hosts
            //sockfact.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

            SchemeRegistry registry = new SchemeRegistry();
            registry.register(new Scheme("https", sockfact, 443));

            BasicHttpParams httpParameters = new BasicHttpParams();
            HttpProtocolParams.setUseExpectContinue(httpParameters, false);
            HttpProtocolParams.setVersion(httpParameters, HttpVersion.HTTP_1_1);

            HttpConnectionParams.setConnectionTimeout(httpParameters, _TIMEOUT);
            HttpConnectionParams.setSoTimeout(httpParameters, _TIMEOUT);

            ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(
                    httpParameters, registry);
            cm.closeExpiredConnections();
            cm.closeIdleConnections(3000, TimeUnit.MILLISECONDS);

            _httpClient = new MyHttpClient(cm, httpParameters);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

HTTPS 呼び出しを開始する前に、上記のメソッドを呼び出します

于 2012-06-19T06:43:27.903 に答える