Ответ 1
Попробуйте использовать Qt < 5.6, как Qt 5.5.
В Qt 5.6 брандмауэр SSL по умолчанию был изменен с OpenSSL на Secure Transport на платформе Mac OS.
Эта проблема уже заполнена как ошибка: https://bugreports.qt.io/browse/QTBUG-56596
Я пытаюсь распаковать файл pkcs12 в моем приложении Qt, но не повезло. Я создаю приложение Qt Console (графический интерфейс отключен).
(Я следил за этим руководством: https://github.com/trueos/sysadm-ui-qt/blob/master/src-qt5/gui_client/SSLNotes.txt)
Команды создания Pkcs12:
"openssl req -newkey rsa:2048 -nodes -keyout test_key.pem"
"openssl req -key test_key -new -x509 -out test_crt.crt"
"openssl pkcs12 -inkey test_key.pem -in test_crt.crt -export -passout stdin -out new.pfx"
Код Qt:
QString password="1234";
QFile pkcs("/Users/test/Desktop/certs/new.pfx");
pkcs.open(QFile::ReadOnly);
QSslKey key;
QSslCertificate cert;
QList<QSslCertificate> imported_certs;
static bool import=QSslCertificate::importPkcs12(&pkcs,&key,&cert,&imported_certs,QByteArray::fromStdString(password.toStdString()));
pkcs.close();
qDebug()<<import;
Вручную извлечение ключа и файла работало с помощью команд openssl.
Сообщение об ошибке:
"Unimplemented Code."
Любые идеи?
Попробуйте использовать Qt < 5.6, как Qt 5.5.
В Qt 5.6 брандмауэр SSL по умолчанию был изменен с OpenSSL на Secure Transport на платформе Mac OS.
Эта проблема уже заполнена как ошибка: https://bugreports.qt.io/browse/QTBUG-56596
После того, как несколько раз ударился головой о стену с помощью такого рода вещей, я нашел хороший ярлык.
Я импортирую сертификат на компьютер Windows (убедитесь, что закрытый ключ отмечен как экспортируемый) и убедитесь, что путь сертификата действителен в диспетчере сертификатов. Если мне нужно импортировать сертификаты, я делаю это здесь, пока выданный путь сертификата не будет хорош. Как только это будет сделано, я повторно экспортирую сертификат и закрытый ключ в новый файл PKCS12, включая корневые и промежуточные сертификаты. Это создает один файл, который может быть импортирован в маршрутизатор ASA или IOS и работает безупречно, потому что все, что требуется единице, присутствует в одном файле.
Обязательно удалите сертификат с компьютера Windows, когда вы закончите экспорт набора сертификатов.
Возможно, эта ссылка вам поможет:
QSslCertificate :: importPkcs12() вернет "Не реализованный код". на платформах macOS или iOS, поскольку эти комплекты Qt были настроены для использования безопасного транспорта вместо OpenSSL.
Чтобы получить лучшее из обоих миров, я обнаружил, что можно сохранить их комплекты Qt сконфигурированными для безопасного транспорта, но, в то же время, связать их с OpenSSL для реализации специфичной для OpenSSL реализации importPkcs12.
Ниже приведен фрагмент, в котором мы включаем нашу пользовательскую реализацию для macOS и iOS:
#ifdef Q_OS_IOS
#define IMPORTPKCS12_OPENSSL
#endif
#ifdef Q_OS_MACOS
#define IMPORTPKCS12_OPENSSL
#endif
bool ImportPkcs12Patch::importPkcs12(QIODevice *device, QSslKey *key, QSslCertificate *certificate, QList<QSslCertificate> *caCertificates, const QByteArray &passPhrase)
{
#ifdef IMPORTPKCS12_OPENSSL
return importPkcs12_openssl(device, key, certificate, caCertificates, passPhrase );
#else
return QSslCertificate::importPkcs12(device, key, certificate, caCertificates, passPhrase );
#endif
}
Полный рабочий пример приведен здесь:
https://github.com/stephenquan/QtImportPKCS12
Чтобы создать необходимые компоненты OpenSSL для iOS и macOS, обратитесь сюда: