Предоставление стандартной библиотеки (crypto/tls)

Я хочу внести некоторые изменения в стандартную библиотеку Go crypto/tls.

Является ли создание копии crypto/tls в папке поставщика хорошим способом сделать это?

Это почти работает, кажется, что поставщик - это копия, используемая при компиляции приложения (веб-сервер Caddy). Кроме одной ошибки я получаю:

go/src/github.com/user/caddy/caddytls/httphandler.go:40: нельзя использовать литерал "vendor/crypto/tls".Config (тип *"vendor/crypto/tls".Config) как тип *"crypto /tls".Конфигурация в значении поля

Есть ли способ приведения, чтобы обойти эту ошибку? Хотя мне это не кажется хорошей практикой.

Я бы подумал, что вендорная копия всегда будет использоваться, но, похоже, что-то все еще использует стандартную библиотеку crypto/tls? (Я думаю, что «net/http». Должен ли я продавать это тоже?)


person user3340499    schedule 17.05.2017    source источник
comment
Я хочу внести некоторые изменения в стандартную библиотеку Go crypto/tls. Надеюсь, вы этого не сделаете.   -  person Volker    schedule 17.05.2017
comment
Вы не сможете получить типы, совпадающие со всем кодом, который использует встроенный crypto/tls, потому что с точки зрения Go это другой пакет. Это может сработать, если вы также продаете тележку. Если вам действительно нужно изменить crypto/tls (я также надеюсь, что вы этого не сделаете), я думаю, было бы проще справиться с этим, например. сборка контейнера с пропатченной версией go (думаю, это можно назвать продавцом стандартной библиотеки?)   -  person nothingmuch    schedule 17.05.2017
comment
Это будет «все или ничего» — если вы хотите использовать модифицированную версию stdlib (любую ее часть), вы должны разветвить Go; вот что делает ее стандартной библиотекой. Также третье голосование за то, чтобы не изменять crypto/tls.   -  person Adrian    schedule 17.05.2017


Ответы (2)


Я действительно должен был это сделать. Самый практичный способ — скопировать и изменить пакет (а также его внутренние зависимости) — сюда входят некоторые пути импорта. И на самом деле это не вендор (вендор в основном использует немодифицированные пакеты, иначе инструменты вендоринга не будут работать), это форк под другим именем. Я предполагаю, что Caddy не нуждается в модифицированной версии - если это необходимо, вам также нужно разветвить и изменить Caddy.

Само собой разумеется, но будьте предельно осторожны при изменении пакета crypto/tls - я, например, должен внести минимальное изменение, которое на самом деле не изменяет работу TLS (мне нужно было получить ключевой материал из главного секрета сеанса и случайных чисел) .

Кроме того, вы должны полностью осознавать, что это требует значительных затрат — когда выходит новая версия go, которая потенциально имеет обновления для пакета crypto/tls или его зависимостей, вам придется снова применять свои изменения вручную. Выполнение различий между ванильной версией и вашей версией помогает. Я не думаю, что это вообще практично для нетривиальных изменений (мои были довольно ограничены - новое публичное поле в Config, несколько строк кода в рукопожатиях, новый интерфейс).

person Petar Donchev    schedule 18.05.2017

Мне нужен такой же функционал. Похоже, что пакет crypto/tls не позволяет читать пользовательские расширения TLS, добавленные со стороны клиента в полезной нагрузке ClientHello. Было бы здорово иметь возможность проверять любые пользовательские расширения, а затем распределять их соответствующим образом.

Жаль, что это не отдельный пакет, так как в нашем файле go.mod мы могли бы использовать замену для указания пользовательского пакета TLS.

e.g

replace golang.org/x/crypto/tls => ./tls

Затем запустите go mod vendor.

Где ./tls — моя локальная версия с внесенными изменениями.

person Craig Newton    schedule 06.05.2021
comment
Итак, я создал форк кодовой базы и очень успешно модифицировал пакет TLS. Затем я приступил к созданию файлов исправлений для внесенных изменений, чтобы я мог запускать их для любых будущих версий. Затем я скомпилировал двоичный файл, и все работает отлично. Спасибо, что указали мне правильное направление. - person Craig Newton; 06.05.2021