Есть ли способ проверить и очистить кэш списка отзыва сертификатов для приложения ASP.NET Core, которое докеризовано и работает под Linux? - PullRequest
2 голосов
/ 12 апреля 2019

Нам необходимо реализовать проверку достоверности клиентских сертификатов в нашем приложении ASP.NET Core 2.X, которое докеризовано и работает под Linux.В частности, нас интересует статус отзыва сертификатов.Такая проверка была реализована с использованием X509Chain , и она работает, как и ожидалось.

var chain = new X509Chain();
var chainPolicy = new X509ChainPolicy
{
    RevocationMode = X509RevocationMode.Online,
    RevocationFlag = X509RevocationFlag.EntireChain
};
chain.ChainPolicy = chainPolicy;
...

Dockerfile

FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
....

Однако у нас есть требования, касающиеся срока действия кэша CRLдля нашего приложения.Похоже, Linux (я предполагаю, что debian для mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim image) кэширует CRL по умолчанию - первый запрос длится ~ 150 мс, а следующие запросы обрабатываются почти мгновенно (к сожалению, я не могу найти доступную информацию для подтверждения этого наблюдения.)

Какое время по умолчанию для кэша CRL в Linux (debian)?Можно ли это изменить?Есть ли способ проверить список кэшированных CRL?

Можно ли очистить кэш CRL, как в Windows?

certutil -urlcache * delete

Утилита Linux сертификат dirmngr , кажется, не является частьюmcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim базовый образ для приложений ASP.NET Core 2.2.

1 Ответ

1 голос
/ 17 апреля 2019

Поскольку это .net Core с открытым исходным кодом, вы посмотрели источники на github . Там вы можете найти вызов CrlCache , который показывает, где хранятся данные:

namespace Internal.Cryptography.Pal
{
    internal static class CrlCache
    {
        private static readonly string s_crlDir =
            PersistedFiles.GetUserFeatureDirectory(
                X509Persistence.CryptographyFeatureName,
X509Persistence.CrlsSubFeatureName);

    internal static class X509Persistence
    {
        internal const string CryptographyFeatureName = "cryptography";
        internal const string X509StoresSubFeatureName = "x509stores";
        internal const string CrlsSubFeatureName = "crls";
        internal const string OcspSubFeatureName = "ocsp";
    }
...
        internal const string TopLevelDirectory = "dotnet";
        internal const string TopLevelHiddenDirectory = "." + TopLevelDirectory;
        internal const string SecondLevelDirectory = "corefx";
...
        internal static string GetUserFeatureDirectory(params string[] featurePathParts)
        {
            Debug.Assert(featurePathParts != null);
            Debug.Assert(featurePathParts.Length > 0);

            if (s_userProductDirectory == null)
            {
                EnsureUserDirectories();
            }

            return Path.Combine(s_userProductDirectory, Path.Combine(featurePathParts));
        }

        private static void EnsureUserDirectories()
        {
            string userHomeDirectory = GetHomeDirectory();

            if (string.IsNullOrEmpty(userHomeDirectory))
            {
                throw new InvalidOperationException(SR.PersistedFiles_NoHomeDirectory);
            }

            s_userProductDirectory = Path.Combine(
                userHomeDirectory,
                TopLevelHiddenDirectory,
                SecondLevelDirectory);
}

        internal static string GetHomeDirectory()
        {
            // First try to get the user's home directory from the HOME environment variable.
            // This should work in most cases.
string userHomeDirectory = Environment.GetEnvironmentVariable("HOME");

Так что путь должен быть $HOME/.dotnet/corefx/cryptography/crls

...