私のコンピュータにlocalyをApache 2サーバーとしてインストールしました。まず、一方向SSLで設定し、Androidから接続しようとしました。私の独自の一方向SSL Apache 2サーバーを設定するためには、サーバー証明書を作成する必要がありました。私は、次のcommmandsでそれをやった:Androidでの双方向SSL:クライアント認証が動作しない
opensslのgenrsa -out server.keyの2048
のopenssl reqを-config ./openssl.cnf -new -key server.keyの-out server.req
のOpenSSL X509 -req -in server.req -CA ca.cer -CAkey ca.key -set_serial 100 -extfile openssl.cnfを-extensionsサーバ-days 365 -outform PEM アウトserver.cer
その後、server.cerファイルを取り出しましたjava keytoolを使用してBKSに変換します。 Androidからの認証が成功しました。 その後、私はApache 2サーバ の双方向SSL設定を続け、Androidとのコミュニケーションを図りました。
のopenssl reqを-config ./openssl.cnf -newkey RSA:私はクライアント証明書を作成するには、以下のコマンドを使用 ...それを動作させるために管理していなかった2048 -nodes -keyform PEM を - KEYOUT ca.key -x509 -days 3650 -extensions certauthは-outform PEM -out ca.cer
opensslのgenrsa -out client.key 2048
のopenssl reqを-config ./openssl.cnf -new -key client.key-out client.req
ope NSSL X509 -req -in client.req -CA ca.cer -CAkey ca.key -set_serial 101 -extfile openssl.cnfを-extensionsクライアント-days 365 -outform PEM -out client.cer
のopenssl PKCS12 - 輸出-inkey client.key -in client.cer -out client.p12
それはclient.p12ファイルをインポートした後、PCのブラウザから動作します。 Androidの場合、(Portecleツールを使用して)client.p12ファイルをBKS形式に変換しましたが、動作していないようです。変換が正しく行われていない可能性があります。私はいつもjavax.net.ssl.SSLPeerUnverifiedExceptionを取得します:ピア証明書例外はありません。誰にも何が問題なのか考えている人はいますか? ここでは、Androidのコードです:
public class SslTestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
// load truststore certificate
InputStream clientTruststoreIs = getResources().openRawResource(
R.raw.server);
KeyStore trustStore = KeyStore.getInstance("BKS");
trustStore.load(clientTruststoreIs, "mypassword".toCharArray());
System.out.println("---- Loaded server certificates: "
+ trustStore.size());
// load client certificate
InputStream keyStoreStream = getResources().openRawResource(
R.raw.clientt);
KeyStore keyStore = KeyStore.getInstance("BKS");
keyStore.load(keyStoreStream, "password".toCharArray());
System.out
.println("-------Loaded client certificates: " + keyStore.size());
// initialize SSLSocketFactory to use the certificate
SSLSocketFactory socketFactory = new SSLSocketFactory(SSLSocketFactory.TLS,
keyStore, "password", trustStore, null, null);
// Set basic data
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF-8");
// Register http/s shemas!
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory
.getSocketFactory(), 80));
schReg.register(new Scheme("https", socketFactory, 443));
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(
params, schReg);
DefaultHttpClient sClient = new DefaultHttpClient(conMgr, params);
try {
String res = executeHttpGet(sClient, "https://10.41.0.102/");
System.out.println("------- SSL RESULT IS = " + res);
} catch (Exception e) {
System.out.println("---- ex " + e.getMessage());
e.printStackTrace();
}
} catch (Exception e) {
System.out.println("------Exception " + e.getMessage());
e.printStackTrace();
}
}
public String executeHttpGet(DefaultHttpClient client, String url) throws Exception {
BufferedReader in = null;
try {
HttpGet request = new HttpGet();
request.setURI(new URI(url));
HttpResponse response = client.execute(request);
in = new BufferedReader(new InputStreamReader(response
.getEntity().getContent()));
StringBuffer sb = new StringBuffer("");
String line = "";
String NL = System.getProperty("line.separator");
while ((line = in.readLine()) != null) {
sb.append(line + NL);
}
in.close();
String result = sb.toString();
return result;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}}
は