Проблема с закреплением SSL с ионным + конденсатором

Как упоминалось в официальных документах [1], я пытался реализовать SSL-закрепление в проекте Ionic + Angular + Capacitor, используя плагин Cordova Advanced HTTP [2].

Однако каждый раз, когда я открываю приложение iOS с помощью Xcode, оно регистрирует ошибку [3] о том, что сертификат недействителен, что, по моему мнению, неверно.

2019-07-02 09:20:13.211085+0530 App[481:58424] TIC SSL Trust Error [1:0x280002100]: 3:0
2019-07-02 09:20:13.228677+0530 App[481:58424] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
2019-07-02 09:20:13.228721+0530 App[481:58424] Task <46E01436-B71E-421D-B8F0-584EBEBEDD56>.<1> HTTP load failed (error code: -1202 [3:-9813])
2019-07-02 09:20:13.228908+0530 App[481:58418] Task <46E01436-B71E-421D-B8F0-584EBEBEDD56>.<1> finished with error - code: -1202
2019-07-02 09:20:13.231665+0530 App[481:58415] Task <46E01436-B71E-421D-B8F0-584EBEBEDD56>.<1> load failed with error Error Domain=NSURLErrorDomain Code=-1202 "The certificate for this server is invalid. You might be connecting to a server that is pretending to be “reqres.in” which could put your confidential information at risk." UserInfo={NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, NSErrorPeerCertificateChainKey=(
    "<cert(0x10408e200) s: sni96286.cloudflaressl.com i: COMODO ECC Domain Validation Secure Server CA 2>",
    "<cert(0x104067800) s: COMODO ECC Domain Validation Secure Server CA 2 i: COMODO ECC Certification Authority>",
    "<cert(0x10408ee00) s: COMODO ECC Certification Authority i: AddTrust External CA Root>"
), NSErrorClientCertificateStateKey=0, NSErrorFailingURLKey=https://reqres.in/api/users/2, NSErrorFailingURLStringKey=https://reqres.in/api/users/2, NSUnderlyingError=0x283b578d0 {Error Domain=kCFErrorDomainCFNetwork Code=-1202 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x28070d4d0>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9813, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9813, kCFStreamPropertySSLPeerCertificates=(
    "<cert(0x10408e200) s: sni96286.cloudflaressl.com i: COMODO ECC Domain Validation Secure Server CA 2>",
    "<cert(0x104067800) s: COMODO ECC Domain Validation Secure Server CA 2 i: COMODO ECC Certification Authority>",
    "<cert(0x10408ee00) s: COMODO ECC Certification Authority i: AddTrust External CA Root>"
)}}, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <46E01436-B71E-421D-B8F0-584EBEBEDD56>.<1>"
), _kCFStreamErrorCodeKey=-9813, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <46E01436-B71E-421D-B8F0-584EBEBEDD56>.<1>, NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x28070d4d0>, NSLocalizedDescription=The certificate for this server is invalid. You might be connecting to a server that is pretending to be “reqres.in” which could put your confidential information at risk.} [-1202]
⚡️  [log] - -2   
⚡️  [log] - The certificate for this server is invalid. You might be connecting to a server that is pretending to be “reqres.in” which could put your confidential information at risk.   
⚡️  [log] - undefined

Мое примерное приложение с описанными мною шагами доступно на GitHub [4], и я хотел бы знать, как правильно интегрировать SSL-пиннинг в мое приложение. В идеале для всех было бы удобно, если бы вы могли разветвить / клонировать мой проект и попробовать в нем свои обходные пути.

[1] https://ionicframework.com/docs/native/http

[2] https://github.com/silkimen/cordova-plugin-advanced-http < / а>

[3] https://github.com/ashenwgt/ionic-capacitor-ssl-pinning/blob/master/logs/xcode-log.backup

[4] https://github.com/ashenwgt/ionic-capacitor-ssl-pinning < / а>

Любая помощь будет высоко ценится.


person Thilina Ashen Gamage    schedule 02.07.2019    source источник
comment
Удалось ли вам когда-нибудь решить эту проблему?   -  person TIER 0011    schedule 01.10.2020
comment
@ TIER0011 Нам не удалось заставить его работать описанным выше способом. Но нам удалось создать плагины на родных языках для интеграции с нашим Ionic-приложением и заставить работать SSL-закрепление. В любом случае, что касается нашего исследования, я могу гарантировать, что нет простого способа добиться этого, если вы не создадите все с нуля самостоятельно.   -  person Thilina Ashen Gamage    schedule 03.11.2020


Ответы (1)


Эта проблема возникает из-за того, что конфигурация ionic webpack стирает папку www IOS при запуске операции сборки.

Чтобы гарантировать, что ваши сертификаты не будут удалены, вы должны скопировать его, используя настраиваемую копию конфигурации для webpack вместо файла ресурсов config.xml.

Вот как я это решил:

1. Создайте папку сертификаты / в корне вашего проекта, содержащую файлы * .cer.

2 - Создайте файл copy.config.js в корне вашего проекта со следующим содержанием

// provide a name for an entry, it can be anything such as 'copyAssets' or 'copyFonts'
// then provide an object with a `src` array of globs and a `dest` string
module.exports = {
    copyAssets: {
        src: ['{{SRC}}/assets/**/*'],
        dest: '{{WWW}}/assets'
    },
    copyIndexContent: {
        src: ['{{SRC}}/index.html', '{{SRC}}/manifest.json', '{{SRC}}/service-worker.js'],
        dest: '{{WWW}}'
    },
    copyFonts: {
        src: ['{{ROOT}}/node_modules/ionicons/dist/fonts/**/*', '{{ROOT}}/node_modules/ionic-angular/fonts/**/*'],
        dest: '{{WWW}}/assets/fonts'
    },
    copyPolyfills: {
        src: [`{{ROOT}}/node_modules/ionic-angular/polyfills/${process.env.IONIC_POLYFILL_FILE_NAME}`],
        dest: '{{BUILD}}'
    },
    copySwToolbox: {
        src: ['{{ROOT}}/node_modules/sw-toolbox/sw-toolbox.js'],
        dest: '{{BUILD}}'
    },
    copyCertificates: {
        src: ['certificates/**/*'],
        dest: '{{WWW}}/certificates'
    }
}

3 - Добавьте следующую конфигурацию в файл package.json.

"config": {
    "ionic_copy": "copy.config.js"
}

Удачи ! ????

person Junior Klaus Mombo-Nzahou    schedule 31.01.2021