1

このコマンドを使用して、EC2 インスタンスで実行されている nginx サーバーの自己署名証明書を作成しました

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/selfsigned.key -out /etc/ssl/certs/selfsigned.crt

一般的な名前 (サーバーの FQDN やあなたの名前など) として、ec2-somenumber.region.compute.amazonaws.com のような EC2 インスタンスのパブリック DNS を使用しました。

このコードを使用して信頼の問題を解決し、selfsigned.crt をアプリケーションの raw フォルダーにコピーして、次のように使用しました。

CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream caInput = getResources().openRawResource(R.raw.selfsigned);
Certificate ca = cf.generateCertificate(caInput);

// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);

// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);

// Create an SSLContext that uses our TrustManager
SSLContext _sslContext = SSLContext.getInstance("TLS");
_sslContext.init(null, tmf.getTrustManagers(), null);

URL url = new URL("https://ec2-somenumber.region.compute.amazonaws.com");
HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();
connection.setSSLSocketFactory(_sslContext.getSocketFactory());

現在、エミュレーターで完全に動作していますが、実際のデバイスでデバッグしようとすると、次のエラーが表示されます。

 javax.net.ssl.SSLPeerUnverifiedException: Hostname ec2-somenumber.region.compute.amazonaws.com not verified

ここでstackoverlowに関する多くの質問を読みましたが、エミュレータでは機能するが実際のデバイスでは機能しない理由を理解するまで、実際にはhostnameVerifierをオーバーライドしたくありません。

何か提案はありますか?

ありがとう

4

1 に答える 1

0

同じ問題がある場合は、このリンクを参照して証明書を生成してください。

自己署名証明書を実際のデバイスで機能させるには、証明書の作成に使用した ssl.conf ファイルで、このようなサブジェクト代替名を指定する必要がありました

[alt_names]
DNS.1   = ec2-somenumber.region.compute.amazonaws.com
于 2020-03-25T12:36:53.320 に答える