я получил следующее исключение на ткани:Лучший способ извлечения общего имени из SSLPeerUnverifiedException?
Non-fatal Exception: javax.net.ssl.SSLPeerUnverifiedException: Hostname assets.domain.com not verified:
certificate: sha256/6NEXAaHJ2CAMKUOkWhMCwH9biv2QtAFsYMl0WqkocgM=
DN: CN=apc.aptilo.com,OU=Domain Control Validated - RapidSSL(R),OU=See www.rapidssl.com/resources/cps (c)13,OU=GT19785026,2.5.4.5=#13204456444273427335456d62337a6151706e6e6d356744615556354b6a63696c44
subjectAltNames: [apc.aptilo.com]
at okhttp3.internal.connection.RealConnection.connectTls(SourceFile:250)
at okhttp3.internal.connection.RealConnection.establishProtocol(SourceFile:198)
at okhttp3.internal.connection.RealConnection.buildConnection(SourceFile:174)
at okhttp3.internal.connection.RealConnection.connect(SourceFile:114)
at okhttp3.internal.connection.StreamAllocation.findConnection(SourceFile:193)
at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(SourceFile:129)
at okhttp3.internal.connection.StreamAllocation.newStream(SourceFile:98)
at okhttp3.internal.connection.ConnectInterceptor.intercept(SourceFile:42)
at okhttp3.internal.http.RealInterceptorChain.proceed(SourceFile:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(SourceFile:67)
at okhttp3.internal.cache.CacheInterceptor.intercept(SourceFile:109)
at okhttp3.internal.http.RealInterceptorChain.proceed(SourceFile:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(SourceFile:67)
at okhttp3.internal.http.BridgeInterceptor.intercept(SourceFile:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(SourceFile:92)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(SourceFile:124)
at okhttp3.internal.http.RealInterceptorChain.proceed(SourceFile:92)
at okhttp3.internal.http.RealInterceptorChain.proceed(SourceFile:67)
at okhttp3.RealCall.getResponseWithInterceptorChain(SourceFile:170)
at okhttp3.RealCall.access$100(SourceFile:33)
at okhttp3.RealCall$AsyncCall.execute(SourceFile:120)
at okhttp3.internal.NamedRunnable.run(SourceFile:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
И вместе с командой безопасности, мы поняли, что это, вероятно, случай, когда пользователь открывает наше приложение, связанные с каким-то отелем Wi-Fi и заклеймен эти надоедливые страницы входа. До сих пор только 2 пользователя были затронуты, и у нас есть еще много пользователей, так что это не так, как real человек в середине атаки.
Таким образом, я хочу проверить общее имя исключения. Если он соответствует нашему хосту, assets.domain.com
, то это потенциальная атака, и я хочу зарегистрировать это событие. Если CN отличается, я просто хочу подавить ошибку.
Какие у меня варианты? Я могу только подумать о разборе строки причины исключения и с выделением регулярного выражения части CN=value
. Но есть ли более менее подверженное ошибкам решение?
tl; dr;
Я хочу извлечь значение CN из SSLPeerUnverifiedException
и сравнить его с нашим действительным именем хоста. Каков наилучший способ достичь этого?
Не уверен, что вы имеете в виду с «ограниченной выборкой», но это все ткани дают мне, извините. Спасибо за регулярное выражение. Я надеялся, что есть некоторые функции утилиты, которые могли бы проанализировать «SSLPeerUnverifiedException» и преобразовать в «Сертификат», а затем я мог бы безопасно проверить CN. Но я думаю, что ничего подобного не существует. Это нужно сделать. –
Извините, не смог сузить это. Единственный способ вытащить часть этого (или любого) исключения - посмотреть исходный код, чтобы увидеть, как он создается. Но, очевидно, если они не публикуют его, они оставляют за собой право изменять поколение без хлопот в отношении к некоторому формату. Удачи ~ – sln