Как выполнить успешное шифрование SSL с помощью pkcs12 / pfx в Qt на Mac OSX?

Новичок в Qt и разработка кроссплатформенного приложения, требующего SSL-аутентификации как с сервера, так и со стороны клиента. Шифрование на основе .pem работает на Linux, Android, Windows. Однако есть проблемы с Mac OSX. Наш код выглядит следующим образом:

QFile privateKeyFile(":/Certificate.pem");  // --> has certificate + key
privateKeyFile.open(QIODevice::ReadOnly | QIODevice::Text);
setLocalCertificateChain(QSslCertificate::fromPath(":/Certificate.pem", QSsl::Pem));
setPrivateKey(QSslKey(privateKeyFile.readAll(), QSsl::Rsa));

В приведенном выше коде privateKey().isNull() возвращается true для Mac. Когда мы ссылались эта почта, в нем говорится, что Mac не поддерживает шифрование на основе .pem.

Бэкэнд Secure Transport to curl поддерживает только идентификаторы клиентов в формате PKCS # 12 (P12); он не поддерживает идентификаторы клиентов в формате PEM, поскольку Apple не позволяет нам создавать идентификаторы безопасности из файла идентификаторов в формате PEM без использования частного API. И мы не можем использовать частный API, потому что приложения, которые используют частный API, не разрешены ни в одном из магазинов приложений Apple.

С моим ограниченным пониманием я понял, что .pem не очень хорошая идея для связи SSL с сервером. Пожалуйста, остановите меня, если это не так!

Поэтому мы решили перейти на .pfx для всех платформ. У нас уже был файл .pfx с парольной фразой. Мы преобразовали приведенный выше код для совместимости с .pfx (т.е. «Certificate.pfx», у нас был этот старый файл вместе с «Certificate.pem»). Вместо QSsl::Pem, мы попытались QSsl::Der, Но, как и ожидалось, это не сработало. Однако ошибки шифрования тоже не было, но мы уверены, что делаем что-то не так. 🙂

Мы сослались на этот пост и пытаемся восстановить .pfx из .pem, но это также не помогло.
QSslCertificate :: importPkcs12 не может проанализировать файл PFX
В приведенном выше случае QSslCertificate::importPkcs12() возвращает false для исходного файла .pfx. Даже если мы сгенерируем новый .pfx из командной строки, это также не сработает для вышеуказанной функции.

Вопрос: Кто-нибудь может помочь с точным способом выполнения шифрования .pfx с сервером?
.аутентификация pem тоже подойдет.

Заметка:

  • Сервер поддерживает оба .pfx & .pem. Это мы подтвердили с помощью обычных библиотек OpenSSL. Но мы хотим добиться этого с помощью Qt.
  • Мы открыты для форматов, отличных от .pfx, если они работают на всех платформах

8

Решение

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я пишу это изо всех сил, так как я лично не владею Mac и больше не могу это проверить.

У нас была эта проблема примерно год или два назад на моей последней работе.
Все сводится к тому, что Apple отказывается от поддержки OpenSSL.

Из-за этого Qt переключился с бэкэнда OpenSSL на бэкэнд Secure Transport на Mac с Qt5.6. В настоящее время в реализации безопасного транспорта отсутствуют некоторые функции. Например, мы не смогли загрузить pem-файлы с закрытым ключом. Я думаю, что переключение с PKCS # 8 на PKCS # 1 помогло, которое может быть сохранено в .pem файлы и выглядят практически одинаково, так что понадобилось время, чтобы разобраться.

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

Наконец мы перекомпилировали модуль QtNetwork для использования OpenSSL вместо Secure Transport. Для этого вам нужно будет предоставить OpenSSL, поскольку OSX больше не включает заголовки. Доморощенной установки было достаточно, я думаю. Кроме того, компиляция была на удивление безболезненной и быстрой, поскольку вам нужно просто скомпилировать один маленький модуль, а не весь Qt.

Самый простой способ сделать это:

  1. скачайте исходный дистрибутив используемой версии Qt
  2. ./configure это использовать OpenSSL ( -openssl Переключатель я считаю)
  3. cdв network папка
  4. make
  5. скопировать сгенерированный QtNetwork.framework внутри вашей Qt-Installation и замените существующую.

С этим все работало как положено.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]