akaDuality / Sber3dsWithCustomCert

2 stars 0 forks source link

Открытие ссылки на оплату #2

Open VisualDeceit opened 1 year ago

VisualDeceit commented 1 year ago

Здравствуйте.

Столкнулся с такой проблемой после реализации данного решения в проекте - на физическом устройстве не отрывается ссылка на оплату, которая приходит с платежного шлюза в виде https://3dsec.sberbank.ru/payment/merchants/sbersafe_sberid/payment_ru.html?mdOrder=....

Причем, если подставить https://3dsecmt.sberbank.ru/payment/se/keys.do, то все работает.

Сертификаты "прожёвывает". Пробовал и готовые и сам генерировал. А самое интересное в том, что при подстановке ссылки от шлюза в ваше приложение все работает! С примером от Сбера такая же ситуация. Настройки NSAppTransportSecurity какие только не пробовал. И NSAllowsArbitraryLoads и кастомный на домен Сбера:

<key>NSExceptionDomains</key>
        <dict>
            <key>sberbank.ru</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSExceptionMinimumTLSVersion</key>
                <string>TLSv1.2</string>
                <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
                <true/>
                <key>NSThirdPartyExceptionMinimumTLSVersion</key>
                <string>TLSv1.2</string>
                <key>NSRequiresCertificateTransparency</key>
                <true/>
            </dict>
        </dict>

Разницы нет. Грешу на то, что в проекте какие-то настройки перебивают NSAllowsArbitraryLoads. Больше мыслей нет.

Ошибку выдает следующую.

Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." 
UserInfo={NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _WKRecoveryAttempterErrorKey=<WKReloadFrameErrorRecoveryAttempter: 0x283da99e0>, networkTaskDescription=LocalDataTask <606449F7-14C4-40D1-B148-A62A4B1A8413>.<2>, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, NSErrorPeerCertificateChainKey=(
    "<cert(0x11c508800) s: 3dsec.sberbank.ru i: Russian Trusted Sub CA>",
    "<cert(0x11c514960) s: Russian Trusted Sub CA i: Russian Trusted Root CA>",
    "<cert(0x11c521160) s: Russian Trusted Root CA i: Russian Trusted Root CA>"
), NSErrorFailingURLStringKey=https://3dsec.sberbank.ru/payment/merchants/sbersafe_sberid/payment_ru.html?mdOrder=6f552a21-abf4-78db-a31d-4c8f28084cc4, NSUnderlyingError=0x283317840 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802}}, NSErrorClientCertificateStateKey=0, NSErrorFailingURLKey=https://3dsec.sberbank.ru/payment/merchants/sbersafe_sberid/payment_ru.html?mdOrder=6f552a21-abf4-78db-a31d-4c8f28084cc4, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <606449F7-14C4-40D1-B148-A62A4B1A8413>.<2>, NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x280dd8280>, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made.}

Может быть что-то посоветуете, куда копать?

akaDuality commented 1 year ago

Если убрать проверку из кода совсем и всегда разрешать подключение, то проблема останется?

VisualDeceit commented 1 year ago

Если убрать проверку из кода совсем и всегда разрешать подключение, то проблема останется?

Да, поведение аналогичное

Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _WKRecoveryAttempterErrorKey=<WKReloadFrameErrorRecoveryAttempter: 0x2827692a0>, networkTaskDescription=LocalDataTask <3D89ECBF-AEDE-4577-95C1-5F46AA07D744>.<2>, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, 
NSErrorPeerCertificateChainKey=(
    "<cert(0x135fe7270) s: 3dsec.sberbank.ru i: Russian Trusted Sub CA>",
    "<cert(0x13b1e6fd0) s: Russian Trusted Sub CA i: Russian Trusted Root CA>",
    "<cert(0x13b16dd50) s: Russian Trusted Root CA i: Russian Trusted Root CA>"
), NSErrorFailingURLStringKey=https://3dsec.sberbank.ru/payment/merchants/sbersafe_sberid/payment_ru.html?mdOrder=81de6ec1-f8d6-75fe-b080-b26b28084cc4, 
NSUnderlyingError=0x2828fc690 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802}}, NSErrorClientCertificateStateKey=0, NSErrorFailingURLKey=https://3dsec.sberbank.ru/payment/merchants/sbersafe_sberid/payment_ru.html?mdOrder=81de6ec1-f8d6-75fe-b080-b26b28084cc4, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <3D89ECBF-AEDE-4577-95C1-5F46AA07D744>.<2>, NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x2816f5360>, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made.}
akaDuality commented 1 year ago

Выглядит так, что дело не в коде, а в конфиге каком-то.

Можно попробовать разрешить все загрузки в Info.plist. Вы вроде бы это сделали, но уточню, что оно должно быть без деления на домены, в семпле вот так выглядит:

<key>NSAppTransportSecurity</key>
<dict>
   <key>NSAllowsArbitraryLoadsInWebContent</key>
   <true/>
</dict>
akaDuality commented 1 year ago

Если это сработает, то похоже на то, что маска sberbank.ru в таком виде не работает. В целом я бы не ограничивался по банкам, потому что это же касается и ВТБ и другие заденет когда-нибудь.

VisualDeceit commented 1 year ago

Выглядит так, что дело не в коде, а в конфиге каком-то.

Можно попробовать разрешить все загрузки в Info.plist. Вы вроде бы это сделали, но уточню, что оно должно быть без деления на домены, в семпле вот так выглядит:

<key>NSAppTransportSecurity</key>
<dict>
   <key>NSAllowsArbitraryLoadsInWebContent</key>
   <true/>
</dict>

К сожалению, ситуация не изменилась. Могут ли pods влиять на info.plist?

akaDuality commented 1 year ago

@VisualDeceit поды не влияют на него