Проверка подлинности сертификата клиента управления API завершается неудачно, если значения не заданы жестко - PullRequest
0 голосов
/ 13 мая 2019

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

Согласно Microsoft, я могу это сделать (https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-mutual-certificates-for-clients). Однако, когда я пытаюсь проверить отпечаток моего сертификата по всем доверенным сертификатам, которые я загрузил, происходит сбой из-за недействительного сертификата клиента. Я использовал тот же Код политики, предоставляемый Microsoft:

<choose>
    <when condition="@(context.Request.Certificate == null || !context.Deployment.Certificates.Any(c => c.Value.Thumbprint == context.Request.Certificate.Thumbprint))" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>

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

<choose>
    <when condition="@(context.Request.Certificate == null || context.Request.Certificate.Thumbprint != "desired-thumbprint")" >
        <return-response>
            <set-status code="403" reason="Invalid client certificate" />
        </return-response>
    </when>
</choose>

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

Я думаю, что политика проверки всех сертификатов может быть неправильной, и она может проверять только сертификаты из моих клиентских сертификатов. Это правильно? И если да, можно ли проверить все сертификаты CA, которые я загрузил в управление API?

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Это работает, только если вы загружаете его в клиентские сертификаты. context.Deployment.Certificates - это коллекция клиентских сертификатов. Я знаю, что это может показаться нелогичным, и это потому, что context.Deployment.Certificates не должен был использоваться именно так. Он содержит сертификаты, которые APIM использует для аутентификации в бэкэнде, поэтому необходимо предоставить закрытый ключ.

Если у вас нет доступа к закрытым ключам клиентских сертификатов, и все они выданы несколькими сертификатами CA / Root, рассмотрите возможность загрузки сертификатов CA / root и используйте context.Request.Certificate.Verify для проверки цепочки.

0 голосов
/ 14 мая 2019

Проверка предмета сертификата или отпечатка пальца для проверки пользователя не является хорошей политикой для использования PKI для аутентификации пользователя.Вместо этого вы можете рассмотреть шифрование AuthToken или UserID-Password или определенных значений заголовка с использованием закрытого ключа пользователя, а затем на сервере, уточняя его после расшифровки с использованием открытого ключа клиента / пользователя, уже зарегистрированного на сервере, как часть процесса проверки.

Также просмотрите раздел обратной связи на приведенной вами ссылке docs.microsoft ... есть некоторые опасения или опасения.

Пожалуйста, обратитесь к моему ответу в сообщении: https://stackoverflow.com/a/55757349/9659885это даст вам подсказку об одном из возможных способов или, по крайней мере, о том, как подписывать / шифровать контент на стороне клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...