Я работаю над реализацией SSL как для REST (использую модификацию для Android), так и для Socket. Но меня просят использовать только самоподписанный сертификат p12 для реализации. Я должен реализовать формат "X.509 v3". Если я непосредственно реализую .p12 в следующем коде, я получаю строку «generateCertificate»
java.security.cert.CertificateException: com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
, код выглядит следующим образом.
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
CertificateFactory cf = CertificateFactory.getInstance("X.509");
fileInputStream = new FileInputStream(filePathFromStorage);
InputStream inputStream = new BufferedInputStream(fileInputStream);
Certificate ca = cf.generateCertificate(inputStream);
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
SSLContext sslContext;
sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, tmf.getTrustManagers(), null);
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
return sslSocketFactory;
Насколько я исследовал, он должен не будет отличаться с точки зрения безопасности и шифрования, если мы используем p12 или cer, если мы используем формат X.509v3. Нужна помощь, чтобы понять это. И что я здесь делаю неправильно, что приводит к приведенному выше исключению? Насколько я искал на Android веб-сайте , Android до сих пор не поддерживает версию V3.