Lollipop & Pie требуют разные переменные HostnameVerifier - PullRequest
0 голосов
/ 15 мая 2019

У меня есть общий веб-хостинг.Давайте назовем это "hostingPlatform.com" .У меня есть мой домен, и мы будем называть это "myDomain.com" .

В моем приложении для Android я использую HostnameVerifier для проверки хоста.Для Lollipop я получаю сокет к своему домену и проверяю его на платформе хостинга.

SocketFactory sf = SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) sf.createSocket("myDomain.com", 443);
HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
SSLSession s = socket.getSession();

    if (!hv.verify("hostingPlatform.com", s)) {
        throw new SSLHandshakeException("found " + s.getPeerPrincipal() + " " +s.getProtocol() +" "+s.getPeerHost());
    }

Теперь этот пример работает в Android Lollipop, но не в новых выпусках, таких как Pie.Если я запускаю его в Pie, я получаю следующую ошибку.

javax.net.ssl.SSLHandshakeException: ERROR found CN=myDomain.com, OU=PositiveSSL, OU=Domain Control Validated TLSv1.2 myDomain.com

Для Pie мне нужно получить сокет для моего домена и проверить его с моим доменом, как показано ниже.

SocketFactory sf = SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) sf.createSocket("myDomain.com", 443);
HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
SSLSession s = socket.getSession();

    if (!hv.verify("myDomain.com", s)) {
        throw new SSLHandshakeException("found " + s.getPeerPrincipal() + " " +s.getProtocol() +" "+s.getPeerHost());
    }

Это прекрасно работает для Pie, но не с Lollipop.Когда я запускаю его в Lollipop, я получаю следующее:

javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
    at com.android.org.conscrypt.SSLNullSession.getPeerCertificates(SSLNullSession.java:104
    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:93)
    at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:389)

javax.net.ssl.SSLHandshakeException: ERROR found CN=*.hostingPlatform.com, OU=PositiveSSL Wildcard, OU=Domain Control Validated TLSv1.2 myDomain.com

Мое решение для этого - поместить их обоих во вложенный оператор if, чтобы удовлетворить оба, но я чувствую, что это не должно быть так.

SocketFactory sf = SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) sf.createSocket("myDomain.com", 443);
HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
SSLSession s = socket.getSession();

    if (!hv.verify("hostingPlatform.com", s))
    {
        if (!hv.verify("myDomain.com", s)) {
            throw new SSLHandshakeException("ERROR found " + s.getPeerPrincipal() + " " +s.getProtocol() +" "+s.getPeerHost());
        }
    }

У кого-нибудь есть идеи, почему это происходит?Любая помощь очень ценится!

...