iOS - Как подписать SOAP-сообщение сертификатом x509 - PullRequest
1 голос
/ 30 декабря 2010

Я работаю на клиенте iPhone, используя сообщение SOAP с сертификатом x509.И я не знаю, как подписать сообщение с помощью сертификата x509 (client.cert).

Есть обсуждение потока об использовании openssl, но я не знаю, как использовать openssl, поэтому я смотрю на AppleДокументация: http://developer.apple.com/library/mac/#documentation/Security/Conceptual/CertKeyTrustProgGuide/iPhone_Tasks/iPhone_Tasks.html В вышеприведенной документации приведен пример кода для получения объекта ссылки на политику и оценки доверия:

    NSString *thePath = [[NSBundle mainBundle]

                      pathForResource:@"Romeo Montegue" ofType:@"cer"];

NSData *certData = [[NSData alloc]

                     initWithContentsOfFile:thePath];

CFDataRef myCertData = (CFDataRef)certData;                 // 1



SecCertificateRef myCert;

myCert = SecCertificateCreateWithData(NULL, myCertData);    // 2



SecPolicyRef myPolicy = SecPolicyCreateBasicX509();         // 3



SecCertificateRef certArray[1] = { myCert };

CFArrayRef myCerts = CFArrayCreate(

                                   NULL, (void *)certArray,

                                   1, NULL);

SecTrustRef myTrust;

OSStatus status = SecTrustCreateWithCertificates(

                                                myCerts,

                                                myPolicy,

                                                &myTrust);  // 4



SecTrustResultType trustResult;

if (status == noErr) {

    status = SecTrustEvaluate(myTrust, &trustResult);       // 5

}
                                                    // 6

if (trustResult == kSecTrustResultRecoverableTrustFailure) {

    ...;

}


if (myPolicy)

    CFRelease(myPolicy);                                    

Но нет примера использования объекта политики для подписания сообщения.Есть ли у вас какие-либо подсказки?Пожалуйста, помогите мне, если у вас есть идеи или опыт в этом.Я очень ценю вашу помощь.

Заранее спасибо.

1 Ответ

2 голосов
/ 05 января 2011

Я просканировал API-интерфейс Security Framework на сайте, который вы разместили, и я ничего не могу найти, чтобы дать вам вызов API, который позволит вам подписать сообщение SOAP. Платформа безопасности документирована здесь:

http://developer.apple.com/library/mac/#documentation/Security/Reference/SecurityFrameworkReference/_index.html#//apple_ref/doc/uid/TP40004330

Позволит вам проверять сертификаты, а также загружать сертификаты и пары ключей. Это позволит вам настроить некоторые SSL-компоненты и различные виды авторизации.

Но он даже не кивает на выполнение цифровых подписей и не находит места рядом с подписями SOAP - которые являются их собственным особым видом подписей, которые должны быть правильно отформатированы, чтобы быть приемлемыми для службы, на которую вы отправляете.

Существует довольно много API, которые позволят вам подписывать SOAP-сообщения: - открыть SSL - Надувной Замок - различные решения Java EE - Axis2, JAX-WS - почти наверняка что-то в .NET

Я бы подумал, что для приложения для iPhone будет что-то , но я ничего не копаю и нашел хотя бы один сайт, на котором написано, что ничего не существует, и несколько других делают серьезные раскопки на способность iPhone обрабатывать SOAP в целом. Если анализ XML в этой среде сложен, то создание подписи SOAP будет чем-то более или менее обязательным с нуля.

Если вы отчаянно хотите сделать это в контексте Apple, я бы порекомендовал:

  1. убедитесь, что у вас под рукой есть пара сертификатов и ключей - "client.cer" предполагает, что у вас есть только сертификат X509, вам понадобится что-то вроде PKCS12 (часто называемое * .p12, * .pfx, * .pem или * .der где * - имя файла без суффикса). Вам нужен закрытый ключ для подписи, поэтому одного сертификата будет недостаточно.
  2. Получить библиотеку, которая позволит вам получить низкий уровень. Есть три основные части, чтобы сделать подпись:
    • объединить исходные данные для создания хеша
    • выполнить криптографию для шифрования хэша с помощью вашего личного ключа
    • поместите исходные данные, зашифрованный хеш (т. Е. Подпись) и информацию, необходимую для проверки подписи, вместе в правильном формате.

Для подписи SOAP стандарт для надлежащего формата определяется стандартом XMLDSIG, поддерживаемым W3C. Существует множество способов хэширования данных, поэтому лучшим способом обычно является поиск потребностей службы, которую вы пытаетесь использовать. Большинство веб-сервисов определяют политику, которая сообщит вам, каковы приемлемые способы создания подписи SOAP. Есть даже стандарт для определения этой политики (WS-Policy от OASIS), но это не универсально реализованное решение.

Существуют предположения, что модуль AppleCSP будет выполнять ту криптографию (и, возможно, даже базовое хеширование), которая вам нужна, но похоже, что в итоге вы получите необработанный вывод и переформатируете его в стандарт подписи SOAP, потому что Я получил четкое указание на то, что в этой области может быть очень мало готовых API.

...