Библиотека привязки Xamarin.iOS не может использовать SecKey API из Security framework

#ios #security #xamarin #xamarin.ios #xamarin-binding

#iOS #Безопасность #xamarin #xamarin.ios #xamarin-привязка

Вопрос:

Я создал библиотеку привязки из среды objective-c. Он работает, но он не может использовать SecKey encryption api в Security framework. Библиотека использовала его для запроса api. Платформа безопасности не полностью поддерживается в Xamarin.iOS? Или он не работает, когда библиотека привязки использовала его?

Примечание: Кстати, я добавил эту строку в native framework для зависимостей:

  <Frameworks>Foundation CFNetwork CoreFoundation Security</Frameworks>
  

Обновление 1:

Это журнал устройства:

 Trust evaluate failure: [leaf AnchorTrusted]
DemoX[10647]/1#-1 LF=22 add Error Domain=NSOSStatusErrorDomain Code=-34018 "Client has neither application-identifier nor keychain-access-groups entitlements" UserInfo={NSDescription=Client has neither application-identifier nor keychain-access-groups entitlements}
SecTaskLoadEntitlements failed error=22 cs_flags=200, pid=10438
SecTaskCopyDebugDescription: DemoX[10039]/0#-1 LF=0
nw_protocol_boringssl_signal_connected(728) [C13.1:2][0x7fbe21309f80] TLS connected [version(0x0303) ciphersuite(TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) group(0x001d) signature_alg(0x0601) alpn(http/1.1) resumed(0) offered_ticket(0) false_started(0) ocsp_received(0) sct_received(0) connect_time(1811ms) flight_time(144ms) rtt(72ms) write_stalls(0) read_stalls(5)]    
Trust evaluate failure: [leaf AnchorTrusted]
Trust evaluate failure: [leaf AnchorTrusted TemporalValidity]
  

Обновление 2:

Когда я запускаю фреймворк с XCode, появляются строки, приведенные ниже, но не в приложении my Xamarin.iOS

 inserted <keys,kcls=0,klbl=,atag=5253415574696C5F5075624B6579,
crtr=0,type=42,bsiz=0,esiz=0,sdat=2001-01-01 00:00:00  0000,
edat=2001-01-01 00:00:00 0000,agrp=A7PT8PDBPQ.com.test.app,sync=0,
musr=,|otherAttr,tomb=0,rowid=9,cdat=2020-11-07 11:02:34  0000,mdat=2020-11-07 11:02:34 0000,pdmn=ak,
sha1=24BB5BBEE125D6A051E08EA2CB72469A0C62042F,v_Data=<?>,
UUID=********-****-****-****-************,
persistref=,clip=0> from <SecDbConnection rw open>
  

и

 deleted 
<keys,kcls=0,klbl=,atag=5253415574696C5F5075624B6579,crtr=0,type=42,
bsi=,esiz=0,sdat=2001-01-01 00:00:00  0000,edat=2001-01-01 00:00:00
 0000,agrp=A7PT8PDBPQ.com.test.app,sync=0,musr=,
|otherAttr,tomb=0,rowid=7,cdat=2020-11-07 11:01:55 
 0000,mdat=2020-11-07 11:01:55  0000,pdmn=ak,
sha1=F1A9A4EC0C5AC67D354C9D7602E118B8DF5EFAF5,
v_Data=<?>,accc=310C300A0C0470726F740C02616B,
UUID=********-****-****-****-************,
persistref=,clip=0> from <SecDbConnection rw open>
  

Комментарии:

1. Какие именно методы Security Framework вы пытаетесь вызвать?

2. В библиотеке они получают открытый ключ с сервера и делают его SecKeyRef, после чего шифруют его следующим образом developer.apple.com/documentation/security /…

3. SecKeyRef находятся только IntPtr в Xamarin.iOS, а SecKeyCreateEncryptedData точка входа определяется как a DllImport , поскольку это C вызов ( github.com/xamarin/xamarin-macios/blob /… ) Xamarin создал методы-оболочки CreateEncryptedData , CreateDecryptedData , и т. Д., Чтобы упростить использование этих собственных вызовов C (все они определены в Security/Certificate.cs файле, который я связал.

4. Хорошо, но почему библиотека не может его использовать?

5. Вы прочитали сообщение об ошибке? В нем явно указано, что вам не хватает прав.

Ответ №1:

Поэтому я отвечу на свои собственные вопросы, поскольку я нашел решение. Причиной проблемы является SecKeyRef, использующий доступ к цепочке ключей для чтения и записи ключа, как указано в официальной документации:

Экземпляр SecKeyRef, представляющий ключ, хранящийся в цепочке ключей, может быть безопасно передан в SecKeychainItemRef для манипулирования в качестве элемента цепочки ключей. С другой стороны, если ключ не хранится в связке ключей, приведение объекта к SecKeychainItemRef и передача его в функции служб Keychain возвращает ошибки.

Наличие профиля подготовки в Xcode для использования SecKeyRef не важно, но в Visual Studio Mac требуется использовать Entitlements.plist для включения доступа к цепочке ключей. Поэтому, если ваша библиотека привязки использовала SecKey API, вам необходимо включить доступ к цепочке ключей в Entitlements.plist и установить учетную запись разработчика Apple в project.

 <key>keychain-access-groups</key>
<array>
    <string>$(AppIdentifierPrefix)com.company.yourapp</string>
</array>