0
SSLSocketを使用してサーバーに接続しています。私はssl SNI拡張を使いたい。私はSSLParameter.setServerNames
をjavaで使うことができます。しかし、それはアンドロイドに表示されます。それはsdk 24まで利用できません。私のオプションは何ですか?android sdkレベル23のSSLParameter.setServerNamesの代替手段は何ですか
SSLSocketを使用してサーバーに接続しています。私はssl SNI拡張を使いたい。私はSSLParameter.setServerNames
をjavaで使うことができます。しかし、それはアンドロイドに表示されます。それはsdk 24まで利用できません。私のオプションは何ですか?android sdkレベル23のSSLParameter.setServerNamesの代替手段は何ですか
私は反射を使って同じ問題を解決しました。 は、使用してソケットを接続しますsetSNIHostは次のように宣言されている
SSLSocketFactory sf = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) sf.createSocket(uri.getHost(), 443);
setSNIHost(sf, socket, uri.getHost());
SSLSession s = socket.getSession();
:私は反射のためのコードをコピーしたところ、私は本当に覚えていない
public void setSNIHost(final SSLSocketFactory factory, final SSLSocket socket, final String hostname) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
Log.i(TAG, "Setting SNI via SSLParameters");
SNIHostName sniHostName = new SNIHostName(hostname);
SSLParameters sslParameters = socket.getSSLParameters();
List<SNIServerName> sniHostNameList = new ArrayList<>(1);
sniHostNameList.add(sniHostName);
sslParameters.setServerNames(sniHostNameList);
socket.setSSLParameters(sslParameters);
} else if (factory instanceof android.net.SSLCertificateSocketFactory) {
Log.i(TAG, "Setting SNI via SSLCertificateSocketFactory");
((android.net.SSLCertificateSocketFactory)factory).setHostname(socket, hostname);
} else {
Log.i(TAG, "Setting SNI via reflection");
try {
socket.getClass().getMethod("setHostname", String.class).invoke(socket, hostname);
} catch (Throwable e) {
Log.e(TAG, "Could not call SSLSocket#setHostname(String) method ", e);
}
}
}
は、私は単にAPI 24のサポートを追加しました。