Подтвердить что ты не робот

QSslCertificate:: importPkcs12 не удается проанализировать файл PFX

Я пытаюсь распаковать файл 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."

Любые идеи?

4b9b3361

Ответ 1

Попробуйте использовать Qt < 5.6, как Qt 5.5.

В Qt 5.6 брандмауэр SSL по умолчанию был изменен с OpenSSL на Secure Transport на платформе Mac OS.

Эта проблема уже заполнена как ошибка: https://bugreports.qt.io/browse/QTBUG-56596

Ответ 2

После того, как несколько раз ударился головой о стену с помощью такого рода вещей, я нашел хороший ярлык.

Я импортирую сертификат на компьютер Windows (убедитесь, что закрытый ключ отмечен как экспортируемый) и убедитесь, что путь сертификата действителен в диспетчере сертификатов. Если мне нужно импортировать сертификаты, я делаю это здесь, пока выданный путь сертификата не будет хорош. Как только это будет сделано, я повторно экспортирую сертификат и закрытый ключ в новый файл PKCS12, включая корневые и промежуточные сертификаты. Это создает один файл, который может быть импортирован в маршрутизатор ASA или IOS и работает безупречно, потому что все, что требуется единице, присутствует в одном файле.

Обязательно удалите сертификат с компьютера Windows, когда вы закончите экспорт набора сертификатов.

Возможно, эта ссылка вам поможет:

ОТКЛЮЧЕН: https://supportforums.cisco.com/discussion/12347971/failed-parse-or-verify-imported-certifiate-asa-5505-831

Ответ 3

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, обратитесь сюда:

https://github.com/stephenquan/build_openssl