2016-09-02 4 views
0

я получил следующее исключение на ткани:Лучший способ извлечения общего имени из 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 и сравнить его с нашим действительным именем хоста. Каков наилучший способ достичь этого?

ответ

1

С ограниченной выборки вы предоставляете, это что-то вроде этого

"(?s)SSLPeerUnverifiedException:.*?(?<!\\S)CN=([^\\s,]+)(?=,)"

где группа захвата 1 содержит значение CN.

Выход:

** Grp 0 - (pos 35 , len 165) 
SSLPeerUnverifiedException: Hostname assets.domain.com not verified: 
    certificate: sha256/6NEXAaHJ2CAMKUOkWhMCwH9biv2QtAFsYMl0WqkocgM= 
    DN: CN=apc.aptilo.com 
** Grp 1 - (pos 186 , len 14) 
apc.aptilo.com 
+0

Не уверен, что вы имеете в виду с «ограниченной выборкой», но это все ткани дают мне, извините. Спасибо за регулярное выражение. Я надеялся, что есть некоторые функции утилиты, которые могли бы проанализировать «SSLPeerUnverifiedException» и преобразовать в «Сертификат», а затем я мог бы безопасно проверить CN. Но я думаю, что ничего подобного не существует. Это нужно сделать. –

+0

Извините, не смог сузить это. Единственный способ вытащить часть этого (или любого) исключения - посмотреть исходный код, чтобы увидеть, как он создается. Но, очевидно, если они не публикуют его, они оставляют за собой право изменять поколение без хлопот в отношении к некоторому формату. Удачи ~ – sln