Новичок в 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 тоже подойдет.
Заметка:
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я пишу это изо всех сил, так как я лично не владею Mac и больше не могу это проверить.
У нас была эта проблема примерно год или два назад на моей последней работе.
Все сводится к тому, что Apple отказывается от поддержки OpenSSL.
Из-за этого Qt переключился с бэкэнда OpenSSL на бэкэнд Secure Transport на Mac с Qt5.6. В настоящее время в реализации безопасного транспорта отсутствуют некоторые функции. Например, мы не смогли загрузить pem-файлы с закрытым ключом. Я думаю, что переключение с PKCS # 8 на PKCS # 1 помогло, которое может быть сохранено в .pem
файлы и выглядят практически одинаково, так что понадобилось время, чтобы разобраться.
Мы также заметили, что успешно загруженный закрытый ключ будет храниться в хранилище ключей Mac и может быть просмотрен и экспортирован оттуда пользователем, чего мы также не хотели.
Наконец мы перекомпилировали модуль QtNetwork для использования OpenSSL вместо Secure Transport. Для этого вам нужно будет предоставить OpenSSL, поскольку OSX больше не включает заголовки. Доморощенной установки было достаточно, я думаю. Кроме того, компиляция была на удивление безболезненной и быстрой, поскольку вам нужно просто скомпилировать один маленький модуль, а не весь Qt.
Самый простой способ сделать это:
./configure
это использовать OpenSSL ( -openssl
Переключатель я считаю)cd
в network
папкаmake
QtNetwork.framework
внутри вашей Qt-Installation и замените существующую.С этим все работало как положено.
Других решений пока нет …