Как подписать профиль конфигурации iOS, сгенерированный программно? - PullRequest
0 голосов
/ 22 ноября 2018

Context

У меня есть веб-приложение (внешний JS / backend PHP), которое генерирует некоторые MDM-профили конфигурации iOS (* .mobileconfig) программно.

Пользователи веб-сайта вводятнекоторые сведения, называем мой PHP API, а мой PHP-бэкэнд генерирует профиль конфигурации «на лету» с пользовательскими данными, сохраняет их на сервере и возвращает URL-адрес сгенерированногопрофиль, чтобы пользователь мог щелкнуть эту ссылку и установить ее на своем устройстве iOS.

Короче говоря: этот профиль содержит в своей полезной информации только веб-клип (ярлык safari).

Все работает нормально,ссылка на профиль конфигурации открывает приложение «Настройки iOS», в котором пользователю предлагается установить этот профиль на свое устройство.

Моя проблема заключается в том, что этот программно сгенерированный профиль не подписан .Таким образом, iOS предупреждает пользователя , что профиль не подписан, и он должен выполнить несколько дополнительных действий для подтверждения установки профиля.

Я бы хотел, чтобы сгенерированные профили были подписаны, чтобы пользователь мог установить их проще и быстрее.

Вопросы

  • возможно ли это?
  • если да, возможно ли это с помощью PHP?
  • если да, как я могу это сделать?

Я прочитал некоторые ресурсы о подписании профилей конфигурации, поскольку я не все понимаю, у меня нет никаких навыков в отношенииподписи, сертификаты и т. д.

Мне не ясно!

Любая помощь приветствуется, заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 16 апреля 2019

Я могу подтвердить, что это работает, используя ответ @ zvi .Спасибо!

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

1.Получить сертификат

Я использовал бесплатный сертификат от Let's Encrypt через ZeroSSL , чтобы легко получить 2 необходимых файла (сертификат и закрытый ключ).

Вам нужно будет доказать, что домен принадлежит вам (с использованием метода FTP или DNS)

Я сохранил сертификат как "certificate.crt" и закрытый ключ как " private-key.pem ".Загрузите их куда-нибудь на свой сервер.

2.Получите файл цепочки центра сертификации

Если вы просто используете 2 вышеупомянутых файла, ваш профиль будет подписан, но не будет «проверен» в iOS (зеленый флажок, который я искал)

Загрузите «Сеть доверия» с этой страницы .

Я использовал «Let's Encrypt Authority X3 (IdenTrust перекрестная подпись)» и сохранил его в «ca-chain.pem» .Загрузите его на свой сервер вместе с двумя другими.

3.Создание метода входа PHP

Чтобы подписать его с помощью сценария PHP, я разработал метод для этого, взяв файл входного профиля (без подписи) и записав его в файл выходного профиля (подписанный).

Я использовал метод, описанный здесь , чтобы вызвать команду openssl из PHP, используя shell_exec

<?php
function sslSignProfileToFile($inputFile, $outputFile)
{
    $sslPath = '/absolute/path/to/your/cert/files';
    shell_exec("openssl smime -sign -signer ".$sslPath."/certificate.crt -inkey ".$sslPath."/private-key.pem -certfile ".$sslPath."/ca-chain.pem -nodetach -outform der -in ".$inputFile." -out ".$outputFile);
}
?>

4.Создайте свой профиль и подпишите его

Создайте его по своему усмотрению, а затем вызовите указанный выше метод, чтобы сделать его подписанную копию.

<?php
sslSignProfileToFile( "/path/to/your/unsigned-profile.mobileconfig", "/path/to/your/signed-profile.mobileconfig");
?>

5.НАСЛАЖДАЙТЕСЬ!

Тогда вам решать:

  • если вы находитесь в таком запросе AJAX, как я, вы можете вернуть в теле URL-адресподписанный профиль для загрузки

  • , если вы использовали POST-действие классической формы, вы можете просто выполнить перенаправление заголовка , как описано здесь (не проверено мной)

0 голосов
/ 06 июля 2019

Если только из-за проблемы со знаком, я уже отвечал на один вопрос, см .: https://stackoverflow.com/a/56917093/9297400

/**
 * Sign MobileConfig
 *
 * @return string
 */
function signMobileConfig (
    string $file_full_pathname,
    string $certificate_pathname,
    string $private_key_pathname,
    bool $remove_file = true
) {
    openssl_pkcs7_sign(
        $file_full_pathname,
        $file_full_pathname.'.sig',
        file_get_contents($certificate_pathname),
        file_get_contents($private_key_pathname),
        [], 0
    );

    $signed = file_get_contents($file_full_pathname.'.sig');

    if ($remove_file) {
        unlink($file_full_pathname.'.sig');
        unlink($file_full_pathname);
    }

    $trimmed = preg_replace('/(.+\n)+\n/', '', $signed, 1);
    return base64_decode($trimmed);
}

результат подписанного файла конфигурации (<10 репутации, поэтому нажмите, чтобы увидетьрезультат) </p>

Не стесняйтесь изменять код выше, чтобы удовлетворить ваши требования.

0 голосов
/ 29 ноября 2018

Да, вы можете.Также с PHP.

Как?

  1. Сохраните профиль, который хотите подписать, во временный файл:

    file_put_contents ($ tmp_file_name, $ profile_data);

  2. Подпишите файл, который вы только что создали:

    $ data = shell_exec ("openssl smime -sign -in $ tmp_file_name {добавьте сюда другой файлпараметры вам нужны ...} ");

  3. Отправьте данные клиенту:

    echo $ data;

  4. Удалить файл tmp ...

    unlink ($ tmp_file_name);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...