Sto tentando di connettermi a un server Web SSL. Al momento disponiamo di un file pkcs12 e ci colleghiamo, ovvero la nostra chiave privata e il certificato. È possibile connettersi utilizzando il codice Java con una chiave pubblica e un certificato. Immagina di avere un file (è digitale ma qui è l'uscita pem).
> Myfile.pk12 / Myfile.pem
>
> -----BEGIN CERTIFICATE----- ...
> -----END CERTIFICATE-----
>
> -----BEGIN ENCRYPTED PRIVATE KEY----- ...
> -----END ENCRYPTED PRIVATE KEY-----
E possiamo connetterci al server con questo:
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.conn.ssl.X509HostnameVerifier;
import org.apache.http.impl.client.DefaultHttpClient;
KeyStore keyStore = generateKeyStore();
System.out.println("==>" + keyStore);
SSLSocketFactory socketFactory = new SSLSocketFactory(
SSLSocketFactory.TLS,
keyStore,
KEYSTORE_PASSCODE,
null,
null,
(X509HostnameVerifier) SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
Funziona, ma diciamo che ci connettiamo con il certificato e la chiave pubblica. Java non creerebbe internamente una chiave privata basata sul keystore che forniamo e che ci permetterebbe di connetterci? Per es.
> MyfileNEW.pk12 / MyfileNEW.pem
>
> -----BEGIN CERTIFICATE----- ...
> -----END CERTIFICATE-----
>
> -----BEGIN PUBLIC KEY----- ...
> -----END PUBLIC KEY-----
Se la chiave pubblica è incorporata nel certificato? Posso usare Java per inviare una richiesta al server senza pre-creare una chiave privata?