2016-11-02 3 views
7

Я разрабатываю приложение на C++ (кросс-платформенный, Windows, Mac и Linux), который должен безопасно связываться с серверами с использованием протокола https с libcurl (построенный с помощью winssl/darwinssl/openssl на Windows/Mac/Linux соответственно). Я изменил параметр curl, CURLOPT_SSL_VERIFYPEER от 0 до 1, который должен помочь предотвратить проблемы MitM.Безопасная связь сервера с помощью приложения с использованием C++/libcurl/openssl

Это вызвало проблемы, что первоначальный поиск указывает на превращение этого опцию, но после того, как копать глубже я нашел:

Get a CA certificate that can verify the remote server and use the proper option to point out this CA cert for verification when connecting. For libcurl hackers: curl_easy_setopt(curl, CURLOPT_CAPATH, capath); from curl docs

и

Get a better/different/newer CA cert bundle! One option is to extract the one a recent Firefox browser uses by running 'make ca-bundle' in the curl build tree root, or possibly download a version that was generated this way for you. from curl docs

Я использую CURLOPT_CAINFO к расслоению, как я видел некоторые проблемы с использованием CURLOPT_CAPATH на Windows; curl docs. Я загрузил и установил этот комплект вместе с приложением в Windows и Mac, и я хотел бы знать, правильно ли это это сделать или если есть более эффективная практика.

Первоначально это вызвало проблемы для пользователей приложения, работающих за некоторыми корпоративными сетями или прокси-серверами, которые, как выяснилось, были исправлены путем создания libcurl против winssl вместо openssl в Windows; хотя потенциально маскируясь как проблема брандмауэра, все еще неясна, хотя кажется вероятной.

Извините за длину.

Есть ли что-нибудь глупое относительно установки ca-cert-bundle.crt вместе с приложением, и есть ли что-нибудь, что нужно сделать по-другому, чтобы безопасно общаться с сервером из этого установленного приложения?

Немного отдельно, но все еще очень связаны между собой, вопрос у меня есть CURLOPT_CAINFO на Linux дает ошибку:

error setting certificate verify locations: CAfile: ../share/my_application/curl-ca-bundle.crt CApath: none

Хотя попытка открыть файл для чтения в приложение не работает успешно. Редактировать: Эта проблема была решена путем установки поля CURLOPT_CAINFO на Linux (оставив его пустым) и добавив в пакет приложений пакет зависимостей ca-certificates. Путь по умолчанию правильный /etc/ssl/certs/ca-certificates.crt и, кажется, работает. К me это немного лучше, чем установка пакета с приложением.

Edit2: Хотя решена она появляется пакет CA-сертификаты иногда не устанавливать CA-certificates.crt и вместо ча-bundle.crt и местоположения изменяются на различных дистрибутивах, как this source, happyassassin.net показывает, что различные системы Linux хранить CA связывает в разных местах. Кажется, у него не было четкого ответа на вопрос КАК обращаться с этим. Должен ли я использовать значение в файле конфигурации, которое пользователь может затем изменить, или любые другие мысли по этому вопросу?

Редактировать3: Некоторые пользователи указали, что мое имя существует в одном из путей, который ищет завитки, я не совсем уверен, как это возможно, поскольку единственное, что я указал для завитки, - это то место, где я построил openssl/заботится о библиотеках ...

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

Спасибо.

ответ

0

На мой взгляд, лучше использовать системный сертификат, а затем сертификаты пакетов с приложением (если вы не используете какие-либо специальные сертификаты). Для Linux это должно быть легко в соответствии с https://serverfault.com/questions/394815/how-to-update-curl-ca-bundle-on-redhat А для окон вы можете использовать winssl или создать файл из системы https://superuser.com/questions/442793/why-cant-curl-properly-verify-a-certificate-on-windowsConfigure cURL to use default system cert store

+0

Я в настоящее время использую WinSSL на Windows, однако мой первоначальный подход был идентичен ссылкой суперпользователя вы при условии доставки пакета СА с приложением, что-то, что я чувствовал/было немного странным, - это также приводило к ошибкам в корпоративных сетях; похоже, что они ушли или изменились на DNS/Firewall, поскольку изменение WinSSL. В Linux ссылка, которую вы указали, показывает конкретное место для Redhat и аналогичных дистрибутивов, но в Debian/Ubuntu пакет ca-сертификатов, по-видимому, размещает их в другом месте, поэтому установка CAPATH на один будет отсутствовать. –

+0

Возможно, вы должны оставить его пустым, и он должен использовать путь CA по умолчанию. Но для некоторых дистрибутивов это не сработает (в сети есть некоторые сообщения об ошибках). Поэтому вам нужно будет провести некоторое тестирование на разных выпусках и использовать путь соответственно ... – Anardael

+0

На самом деле я не указываю CA PATH на linux, так что это должно произойти, я вижу, как мой последний комментарий казался мне похожим Я установил его, извините, я просто хотел сказать, что использование этого варианта может работать в одном месте, но не в другом. –

Смежные вопросы