Что такое ошибка маркера доступа

Перейти к контенту

Pages 1

You must login or register to post a reply

1 2015.02.03 16:43

  • PunBB
  • Admin
  • Offline
  • More info

Topic: Невозможно подтвердить маркер доступа. Возможно, прошло некоторое…

Невозможно подтвердить маркер доступа. Возможно, прошло некоторое время после первого входа на страницу и последующей отправкой формы или щелчком по ссылке. Если это так, и вы хотите выполнить своё действие до конца, нажмите кнопку «Подтвердить». Для возврата на исходную страницу нужно нажать кнопку «Отменить».

Как подтвердить маркер доступа и что это такое? Маркер доступа позволяет проверить зашифрованную ссылку сравнивая откуда пришел пользователь и куда. Эта система была внедрена в качестве безопасности от атак хакеров и взломщиков.

Почему иногда на форуме может возникать следующее предупреждение?

На форуме PunBB у каждого посетителя имеется свой SCRF TOKEN который периодически меняется, когда посетитель некоторое время отсутствовал на форуме. Ну например, вы писали сообщение час, два, три… и при этом не открывали другие страницы во вкладках. Простыми словами страница ответа висела долгое время. И вот, спустя часов 6 вы все таки написали поэму и решили отправить ее на форум. Что происходит?

В форме уже имеется токен (можно посмотреть исходник страницы)

<input type="hidden" name="csrf_token" value="0b6ae337a22d083dde13057ce2ddf0528">

Но когда вы отправили страницу, то за то время пока вы писали сообщение токен поменялся и сравнив хеши функция обнаружила отличие токенов, что вызвало подозрение и предупреждение:

Невозможно подтвердить маркер доступа. Возможно, прошло некоторое время после первого входа на страницу и последующей отправкой формы или щелчком по ссылке. Если это так, и вы хотите выполнить своё действие до конца, нажмите кнопку «Подтвердить». Для возврата на исходную страницу нужно нажать кнопку «Отменить».

В этом случае система предлагает подтвердить отправку формы, то есть попытается обновить токен и не потеряв данные формы отправить написанное большими усилиями сообщение. Если все верно, сообщение будет отправлено, иначе система будет бесконечно выдавать предупреждение.

2 Reply by PunBB 2015.02.03 17:21

  • PunBB
  • Admin
  • Offline
  • More info

Re: Невозможно подтвердить маркер доступа. Возможно, прошло некоторое…

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

<input type="hidden" name="csrf_token" value="<?php echo generate_form_token(forum_link($forum_url['file_to'])) ?>" />

В данном случае переменная $forum_url[‘file_to’] должна быть равна абсолютной ссылке на файл куда отправляется $_POST или $_GET запрос.

Например, если вы отправляете форму скрипту файла settings.php находящегося по пути вот ссылка то

$forum_url['file_to'] = 'https://punbb.swiftmanage.com/settings.php';

или же непосредственно так:

<input type="hidden" name="csrf_token" value="<?php echo generate_form_token(forum_link('https://punbb.swiftmanage.com/settings.php')) ?>" />

3 Reply by PunBB 2015.02.03 17:28

  • PunBB
  • Admin
  • Offline
  • More info

Re: Невозможно подтвердить маркер доступа. Возможно, прошло некоторое…

Токен, или маркер доступа можно отключить либо на всех страницах либо только на требуемых.

На всех страницах отключить можно в файле config.php раскоментировав строку

// Disable forum CSRF checking by removing // from the following line
define('FORUM_DISABLE_CSRF_CONFIRM', 1);

Этого я вам крайне не рекомендую делать навсегда, а только лишь для того чтобы настроить скрипты или выявить неисправности.

Отключить в определенном файле токен можно прописав в самый вверх сразу после интерпретатора php тот же код:

define('FORUM_DISABLE_CSRF_CONFIRM', 1);

Но даже в этом случае будьте осторожны чтобы не забыть об этой определенной константе. Токен это безопасность вашего форума.

4 Reply by vladimir-timoshenko 2019.03.29 09:50

  • vladimir-timoshenko
  • Member
  • Offline
  • More info

Re: Невозможно подтвердить маркер доступа. Возможно, прошло некоторое…

форум 1.4.5
При регистрации или входе через смартфон, постоянно пишет «Невозможно подтвердить маркер доступа».
Новички при регистрации пугаются, думают, что что-то сделали не так…
Отключить токен в файле login.php?
А как же безопасность от хакеров?

5 Reply by PunBB 2019.03.29 10:44

  • PunBB
  • Admin
  • Offline
  • More info

Re: Невозможно подтвердить маркер доступа. Возможно, прошло некоторое…

vladimir-timoshenko wrote:

Отключить токен в файле login.php?
А как же безопасность от хакеров?

Если проект небольшой, то для хакеров вряд ли он будет интересным. Делайте бекапы, пока данная проблема не решена. Слышу об этом не в первый раз, возможно где то уже и есть решение, но самому некогда исследовать. Обычно это из за разных токенов генерируемых из урл, например в пост запрос поступает один урл, а на выходе другой. Вот оно сравнивая и выдает ошибку.

6 Reply by vladimir-timoshenko 2019.03.29 13:42

  • vladimir-timoshenko
  • Member
  • Offline
  • More info

Re: Невозможно подтвердить маркер доступа. Возможно, прошло некоторое…

Т.е., это проблема не у меня, а «вообще»  PunBB_INFO_ICQ/smile
Понятно, спасибо! Бум надеяться на решение

7 Reply by PunBB 2019.03.29 14:21

  • PunBB
  • Admin
  • Offline
  • More info

Re: Невозможно подтвердить маркер доступа. Возможно, прошло некоторое…

Если немного есть навыки в php, то можно попробовать через print_r(); вывести получаемый урл после отправки пост запросом и сравнить что уходит и что получаем. Смотрите функцию csrf_token или что то вроде этого…

8 Reply by vladimir-timoshenko 2019.03.29 15:31

  • vladimir-timoshenko
  • Member
  • Offline
  • More info

Re: Невозможно подтвердить маркер доступа. Возможно, прошло некоторое…

увы, пока навыки только в «чуть чуть подредактировать»  PunBB_INFO_ICQ/blush

Pages 1

You must login or register to post a reply

Я пытаюсь создать метод, который проверяет мои токены. Я получаю свои токены из Azure Active Directory с помощью потока кода авторизации Open Id Connect. Я получаю токены access_token и id_token. Я использую .NET Core.

Мой код проверки выглядит следующим образом:

string stsDiscoveryEndpoint = "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration";
var handler = new JwtSecurityTokenHandler();
ConfigurationManager<OpenIdConnectConfiguration> configManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint, new OpenIdConnectConfigurationRetriever());
OpenIdConnectConfiguration config = configManager.GetConfigurationAsync().Result;

try
{
  TokenValidationParameters validationParameters = new TokenValidationParameters
  {
     ValidIssuers = new [] { "https://login.microsoftonline.com/tenantid/v2.0" },
     ValidAudiences = new [] { "client-Id" },
     ValidateAudience = true,
     ValidateIssuer = true,
     IssuerSigningKeys = config.SigningKeys,
     ValidateLifetime = true
  };
  var tokenHandler = new JwtSecurityTokenHandler();
  SecurityToken validatedToken = null;
  tokenHandler.ValidateToken(token.AccessToken, validationParameters, out validatedToken);
  return validatedToken != null;
 }
 catch (SecurityTokenInvalidSignatureException ex)
 {
   return false;
 }
 catch(SecurityTokenValidationException)
 {
   return false;
 }

Код ниже работает для id_token, НО не работает для access_token

Сообщение об ошибке, которое я получаю, когда этот метод выполняется для access_token:

IDX10511: Ошибка проверки подписи. Пробовали ключи: «Microsoft.IdentityModel.Tokens.X509SecurityKey, KeyId: CtAAALb-8NsDe333734859crfOc ‘. ребенок: «CtAAALb-8NsDe333734859crfOc». Исключения пойманы: ‘

2 ответа

Заголовок nonce должен быть хеширован SHA2 перед проверкой подписи

Вот пример кода, где вы можете увидеть

jsonToken.Header.Add("nonce", hashedNonce);
        private static bool _hashNonceBeforeValidateToken = true;
        private const string MicrosoftGraphApplicationId = "00000003-0000-0000-c000-000000000000";
        private const string MicrosoftIssuer = "https://sts.windows.net";


    public static bool ValidateTokenSignature(string accessToken, ApplicationConfiguration applicationConfiguration) {
        var tokenHandler = new JwtSecurityTokenHandler();
        var jsonToken = tokenHandler.ReadJwtToken(accessToken);
        string[] parts = accessToken.Split('.');
        string header = parts[0];
        string payload = parts[1];
        string signature = parts[2];

        //hash nonce and update header with the hash before validating
        if (_hashNonceBeforeValidateToken &&
            jsonToken.Header.TryGetValue("nonce", out object nonceAsObject))
        {
            string plainNonce = nonceAsObject.ToString();
            using (SHA256 sha256 = SHA256.Create())
            {
                byte[] hashedNonceAsBytes = sha256.ComputeHash(
                    System.Text.Encoding.UTF8.GetBytes(plainNonce));
                string hashedNonce = Base64Url.Encode(hashedNonceAsBytes);
                jsonToken.Header.Remove("nonce");
                jsonToken.Header.Add("nonce", hashedNonce);
                header = tokenHandler.WriteToken(jsonToken).Split('.')[0];

                accessToken = $"{header}.{payload}.{signature}";
            }
        }

        //get the Microsoft JWT signature public key 
        string stsDiscoveryEndpoint = $"https://login.microsoftonline.com/{applicationConfiguration.TenantId}/v2.0/.well-known/openid-configuration";
        if (jsonToken.Header.TryGetValue("ver", out object version) && version.ToString() == "1.0")
        {
            stsDiscoveryEndpoint = $"https://login.microsoftonline.com/{applicationConfiguration.TenantId}/.well-known/openid-configuration";
        }
        var openidConfigManaged = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint,
            new OpenIdConnectConfigurationRetriever(),
            new HttpDocumentRetriever());
        var configTask = openidConfigManaged.GetConfigurationAsync();
        configTask.Wait();
        var config = configTask.Result;

        var parameteres = new TokenValidationParameters()
        {
            RequireAudience = true,
            ValidateAudience = true,
            ValidAudiences = new[] { applicationConfiguration.ApplicationId, MicrosoftGraphApplicationId },

            ValidateIssuer = true,
            ValidIssuers = new string[] { $"{MicrosoftIssuer}/{applicationConfiguration.TenantId}/", config.Issuer },

            IssuerSigningKeys = config.SigningKeys,
            ValidateIssuerSigningKey = true,

            RequireExpirationTime = true,
            ValidateLifetime = true,
        };

        var claimPrincipal = tokenHandler.ValidateToken(
            accessToken, parameteres, out SecurityToken validatedToken);

        return claimPrincipal.Identity.IsAuthenticated;
    }


1

Spirit_Life
23 Мар 2022 в 16:31

Asked
1 year, 8 months ago

Viewed
862 times

I am using auth0 and trying to validate Signature by invoking Microsoft identity platform but I’m receiving the error below while invoking the verify method. Please also find my code snippet.

Code Snippet:

  try {
        DecodedJWT decodedJWT = JWT.decode(accessToken); // your string
        JwkProvider provider =  new JwkProviderBuilder(new URL("https://login.microsoftonline.com/tid/discovery/v2.0/keys")).build();
        Jwk jwk = provider.get(decodedJWT.getKeyId());
        Algorithm algorithm = Algorithm.RSA256((RSAPublicKey) jwk.getPublicKey(), null);
        JWTVerifier verifier = JWT.require(algorithm)
                                  .withIssuer("auth0")
                                  .build();
       
        
        verifier.verify(decodedJWT);
        

    } catch (JWTVerificationException | JwkException | MalformedURLException e) {
        e.printStackTrace();
    }

Error

com.auth0.jwt.exceptions.SignatureVerificationException: The Token’s Signature resulted invalid when verified using the Algorithm: SHA256withRSA
at com.auth0.jwt.algorithms.RSAAlgorithm.verify(RSAAlgorithm.java:50)
at com.auth0.jwt.JWTVerifier.verify(JWTVerifier.java:299)
at com.identity.telsmsidentity.util.MSTokenValidator.validateMSToken(MSTokenValidator.java:43)
at com.identity.telsmsidentity.controller.TelsPageController.validateToken(TelsPageController.java:98)
at com.identity.telsmsidentity.controller.TelsPageController.getUserInfoFromGraph(TelsPageController.java:59)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)

AverageHomosapien's user avatar

asked May 9, 2021 at 7:48

Aryansh's user avatar

2

The code below works for me, pls make sure your token version and use the corresponding version:

String token = "";
String tenantID = "";
// For Azure AD V1 token
String providerURLV1 = "https://login.microsoftonline.com/" + tenantID + "/discovery/keys";
String issuerV1 = "https://sts.windows.net/" + tenantID + "/";
// For Azure AD V2 token
String providerURLV2 = "https://login.microsoftonline.com/" + tenantID + "/discovery/v2.0/keys";
String issuerV2 = "https://login.microsoftonline.com/" + tenantID + "/v2.0";

try {
    DecodedJWT decodedJWT = JWT.decode(token);
    JwkProvider provider = new JwkProviderBuilder(new URL(providerURLV1)).build();
    Jwk jwk = provider.get(decodedJWT.getKeyId());
    Algorithm algorithm = Algorithm.RSA256((RSAPublicKey) jwk.getPublicKey(), null);
    JWTVerifier verifier = JWT.require(algorithm).withIssuer(issuerV1).build();

    System.out.println(verifier.verify(decodedJWT).getClaims());

} catch (Exception e) {
    e.printStackTrace();
}

Result:

enter image description here

answered May 10, 2021 at 4:50

Stanley Gong's user avatar

Stanley GongStanley Gong

11.1k1 gold badge7 silver badges16 bronze badges

19

Asked
1 year, 8 months ago

Viewed
862 times

I am using auth0 and trying to validate Signature by invoking Microsoft identity platform but I’m receiving the error below while invoking the verify method. Please also find my code snippet.

Code Snippet:

  try {
        DecodedJWT decodedJWT = JWT.decode(accessToken); // your string
        JwkProvider provider =  new JwkProviderBuilder(new URL("https://login.microsoftonline.com/tid/discovery/v2.0/keys")).build();
        Jwk jwk = provider.get(decodedJWT.getKeyId());
        Algorithm algorithm = Algorithm.RSA256((RSAPublicKey) jwk.getPublicKey(), null);
        JWTVerifier verifier = JWT.require(algorithm)
                                  .withIssuer("auth0")
                                  .build();
       
        
        verifier.verify(decodedJWT);
        

    } catch (JWTVerificationException | JwkException | MalformedURLException e) {
        e.printStackTrace();
    }

Error

com.auth0.jwt.exceptions.SignatureVerificationException: The Token’s Signature resulted invalid when verified using the Algorithm: SHA256withRSA
at com.auth0.jwt.algorithms.RSAAlgorithm.verify(RSAAlgorithm.java:50)
at com.auth0.jwt.JWTVerifier.verify(JWTVerifier.java:299)
at com.identity.telsmsidentity.util.MSTokenValidator.validateMSToken(MSTokenValidator.java:43)
at com.identity.telsmsidentity.controller.TelsPageController.validateToken(TelsPageController.java:98)
at com.identity.telsmsidentity.controller.TelsPageController.getUserInfoFromGraph(TelsPageController.java:59)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)

AverageHomosapien's user avatar

asked May 9, 2021 at 7:48

Aryansh's user avatar

2

The code below works for me, pls make sure your token version and use the corresponding version:

String token = "";
String tenantID = "";
// For Azure AD V1 token
String providerURLV1 = "https://login.microsoftonline.com/" + tenantID + "/discovery/keys";
String issuerV1 = "https://sts.windows.net/" + tenantID + "/";
// For Azure AD V2 token
String providerURLV2 = "https://login.microsoftonline.com/" + tenantID + "/discovery/v2.0/keys";
String issuerV2 = "https://login.microsoftonline.com/" + tenantID + "/v2.0";

try {
    DecodedJWT decodedJWT = JWT.decode(token);
    JwkProvider provider = new JwkProviderBuilder(new URL(providerURLV1)).build();
    Jwk jwk = provider.get(decodedJWT.getKeyId());
    Algorithm algorithm = Algorithm.RSA256((RSAPublicKey) jwk.getPublicKey(), null);
    JWTVerifier verifier = JWT.require(algorithm).withIssuer(issuerV1).build();

    System.out.println(verifier.verify(decodedJWT).getClaims());

} catch (Exception e) {
    e.printStackTrace();
}

Result:

enter image description here

answered May 10, 2021 at 4:50

Stanley Gong's user avatar

Stanley GongStanley Gong

11.1k1 gold badge7 silver badges16 bronze badges

19

Я пытаюсь защитить свой веб-API (.net core 2.2) с помощью Azure Ad, используя неявный поток.

Я зарегистрировал свое приложение в Azure AD, используя Портал Azure > Azure Active Directoy > Регистрация приложений > Регистрация нового приложения:

Имя = MyWebApi

Тип приложения = веб-приложение/API

URL-адрес для входа = http://локальный: 55000

После создания этого приложения я открыл его файл манифеста и изменил oauth2AllowImplicitFlow с ложный на истинный.

Это все, что я сделал для регистрации приложения на портале Azure.

Затем я вручную вызвал следующий URL-адрес из браузера Chrome, чтобы получить access_token:

Ответ от вызова вышеуказанного URL-адреса:

Когда я передаю MY-ACCESS-TOKEN в качестве токена носителя в заголовке авторизации в свой веб-API (.net core 2.2), я получаю следующее исключение:

Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: IDX10511: Ошибка проверки подписи. Пробовали ключи: «Microsoft.IdentityModel.Tokens.X509SecurityKey, KeyId: N-lC0n-9DALqwhuHYnHQ63GeCXc».

Затем я попытался вручную проверить подпись:

Когда я вставляю MY-ACCESS-TOKEN в https://jwt.io/, заголовок:

{

  "typ": "JWT",

  "nonce": "AQABAAAAAACEfexXxjamQb3OeGQ4Gugvm6YdOT-bkA0IPllKMt06-J8If5AQ075TVCav94X_ZYcEYKaPneqdJcqYry-Z4XjX0eMN_fiJX_8wXe9D2b6eRiAA",

  "alg": "RS256",

  "x5t": "N-lC0n-9DALqwhuHYnHQ63GeCXc",

  "kid": "N-lC0n-9DALqwhuHYnHQ63GeCXc"

}

Затем я перешел по этому URL-адресу, чтобы получить открытый ключ для ребенка: N-lC0n-9DALqwhuHYnHQ63GeCXc.

Https://login.microsoftonline.com/common/discovery/keys

Затем я вставил следующее в качестве открытого ключа на jwt.io для проверенной подписи токена:

-----BEGIN CERTIFICATE-----

OBTAINED-PUBLIC-KEY-FROM-THE-ABOVE-URL-HERE

-----END CERTIFICATE-----

И я снова получаю Неверная подпись.

Я был в этой теме: https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/609, но я не уверен, почему заголовок моего токена имеет значение одноразовый номер и является ли это проблемой вообще в моем случае или нет.

Любые идеи, что я делаю неправильно здесь?


Offline

PeterPan

 


#1
Оставлено
:

11 августа 2020 г. 13:37:50(UTC)

PeterPan

Статус: Новичок

Группы: Участники

Зарегистрирован: 11.08.2020(UTC)
Сообщений: 4

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 1 постах

Добрый день!

Задача проверить подпись маркера доступа ЕСИА.

Документация говорит:

Цитата:

….
Части маркера разделены точкой, так что он имеет вид: HEADER.PAYLOAD.SIGNATURE
Маркер передается в виде строки в формате Base64url64
….

….
в настоящее время в ЕСИА поддерживается алгоритм электронной подписи ГОСТ Р 34.10-2012 (соответствует значению “GOST3410_2012_512”).
….

….
В общем виде эта процедура включает в себя следующие шаги:
1. Осуществление base64url-декодирования первых двух частей маркера. В header указан алгоритм шифрования (параметр alg).
2. Третья часть маркера доступа представляет собой подпись в кодировке UTF-8 от значений первых двух частей маркера доступа (HEADER.PAYLOAD). Необходимо осуществить проверку данной электронной подписи с использованием сертификата ключа проверки электронной подписи ЕСИА.
3. Проверка времени выдачи, начала и прекращения маркера.
4. Проверка организации, выпустившей маркер, а также адресата маркера.
…..

Реализую проверку по пункту №2 так:

Цитата:

byte[] messageBytes = Encoding.UTF8.GetBytes(Base64UrlEncoder.Decode(message.Split(new[] { ‘.’})[0]) +».»+ Base64UrlEncoder.Decode(message.Split(new[] { ‘.’ })[1]));
byte[] signatureBytes = Base64UrlEncoder.DecodeBytes(signature);

var content = new ContentInfo(messageBytes);
var signedCms = new SignedCms(content, true);

signedCms.Decode(signatureBytes); // здесь получаю ошибку «ASN1 bad tag value met.»
signedCms.CheckSignature(certificates, true);

token.txt (1kb) загружен 21 раз(а).

прикреплен пример токена в текстовом виде.

Пробовал также через csptest утилиту, тоже ничего не вышло.

Capture.PNG (25kb) загружен 25 раз(а).

Коллеги, что делаю не так?


Вверх

Offline

Андрей *

 


#2
Оставлено
:

11 августа 2020 г. 13:47:44(UTC)

Андрей *

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 26.07.2011(UTC)
Сообщений: 11,739
Мужчина
Российская Федерация

Сказал «Спасибо»: 451 раз
Поблагодарили: 1838 раз в 1421 постах

Здравствуйте.

Там не CMS, а RAW подпись (само значение).
Нужно использовать низкоуровневый интерфейс работы с CSP (передавать значение подписиоткрытый ключ).

Техническую поддержку оказываем тут
Наша база знаний


Вверх

WWW


Offline

Андрей *

 


#3
Оставлено
:

11 августа 2020 г. 13:49:32(UTC)

Андрей *

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 26.07.2011(UTC)
Сообщений: 11,739
Мужчина
Российская Федерация

Сказал «Спасибо»: 451 раз
Поблагодарили: 1838 раз в 1421 постах

Создание подписи:

Цитата:

csptest -keys -cont «HDIMAGEКонтейнер» -sign GOST12_256 -keytype exchange -in файл.ext -out файл.ext.rawsign

Проверка подписи:

Цитата:

csptest -keys -verify GOST12_256 -in файл.ext -signature файл.ext.rawsign -cert raw.cer

Техническую поддержку оказываем тут
Наша база знаний


Вверх

WWW


Offline

Андрей *

 


#4
Оставлено
:

11 августа 2020 г. 13:51:25(UTC)

Андрей *

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 26.07.2011(UTC)
Сообщений: 11,739
Мужчина
Российская Федерация

Сказал «Спасибо»: 451 раз
Поблагодарили: 1838 раз в 1421 постах

В КриптоПРО.NET SDK смотреть

C:Program Files (x86)Crypto Pro.NET SDKExamplessimple.zipSigncs

Техническую поддержку оказываем тут
Наша база знаний


Вверх

WWW


Offline

Андрей *

 


#5
Оставлено
:

11 августа 2020 г. 13:54:39(UTC)

Андрей *

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 26.07.2011(UTC)
Сообщений: 11,739
Мужчина
Российская Федерация

Сказал «Спасибо»: 451 раз
Поблагодарили: 1838 раз в 1421 постах

Можете прислать пример токена и сертификат (в ЛС)?

Техническую поддержку оказываем тут
Наша база знаний


Вверх

WWW


Offline

PeterPan

 


#6
Оставлено
:

12 августа 2020 г. 5:40:23(UTC)

PeterPan

Статус: Новичок

Группы: Участники

Зарегистрирован: 11.08.2020(UTC)
Сообщений: 4

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 1 постах

Автор: Андрей * Перейти к цитате

Можете прислать пример токена и сертификат (в ЛС)?

В личку отправить не могу, прикрепляю файлы, а они не прикрепляются.

Ссылка на сервтификат https://esia.gosuslugi.ru/public/esia.zip имя ГОСТ ТЕСИА 2012.cer
Токен я прикреплял выше.

Я пробовал так ранее

Цитата:

private static bool VerifyRawSignString(string message, string signature, X509Certificate2Collection certificates)
{
byte[] messageBytes = Encoding.UTF8.GetBytes(Base64UrlEncoder.Decode(message.Split(new[] { ‘.’ })[0]) + «.» + Base64UrlEncoder.Decode(message.Split(new[] { ‘.’ })[1]));
byte[] signatureBytes = Base64UrlEncoder.DecodeBytes(signature);

Gost3411_2012_256CryptoServiceProvider GostHash = new Gost3411_2012_256CryptoServiceProvider();
var csp = (Gost3410_2012_256CryptoServiceProvider)certificates[0].PublicKey.Key;
var res = csp.VerifyData(messageBytes, GostHash, signatureBytes);
return res;
}

Возвращает false.


Вверх

Offline

Андрей *

 


#7
Оставлено
:

12 августа 2020 г. 11:16:20(UTC)

Андрей *

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 26.07.2011(UTC)
Сообщений: 11,739
Мужчина
Российская Федерация

Сказал «Спасибо»: 451 раз
Поблагодарили: 1838 раз в 1421 постах

Цитата:

2. Третья часть маркера доступа представляет собой подпись в кодировке UTF-8 от значений первых двух частей маркера доступа (HEADER.PAYLOAD).

Варианты:

1. HEADER.PAYLOAD — как 2 строки через точку:

Цитата:

{«ver»:1,»typ»:»JWT»,»sbt»:»access»,»alg»:»GOST3410_2012_256″}.{«текст из PAYLOAD»}

2. HEADER.PAYLOAD — как 2 строки из токена, т.е. base64

Цитата:

Открываю https://jwt.io/
справа написано, как пример:

(
base64UrlEncode(header) + «.» +
base64UrlEncode(payload)
)

т.е. вычисляется от значений (base64.base64) => и проверять тоже нужно также

Техническую поддержку оказываем тут
Наша база знаний


Вверх

WWW


Offline

Андрей *

 


#8
Оставлено
:

12 августа 2020 г. 11:38:36(UTC)

Андрей *

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 26.07.2011(UTC)
Сообщений: 11,739
Мужчина
Российская Федерация

Сказал «Спасибо»: 451 раз
Поблагодарили: 1838 раз в 1421 постах

Автор: PeterPan Перейти к цитате

Автор: Андрей * Перейти к цитате

Можете прислать пример токена и сертификат (в ЛС)?

В личку отправить не могу, прикрепляю файлы, а они не прикрепляются.

Ссылка на сервтификат https://esia.gosuslugi.ru/public/esia.zip имя ГОСТ ТЕСИА 2012.cer
Токен я прикреплял выше.

Я пробовал так ранее

Цитата:

private static bool VerifyRawSignString(string message, string signature, X509Certificate2Collection certificates)
{
byte[] messageBytes = Encoding.UTF8.GetBytes(Base64UrlEncoder.Decode(message.Split(new[] { ‘.’ })[0]) + «.» + Base64UrlEncoder.Decode(message.Split(new[] { ‘.’ })[1]));
byte[] signatureBytes = Base64UrlEncoder.DecodeBytes(signature);

Gost3411_2012_256CryptoServiceProvider GostHash = new Gost3411_2012_256CryptoServiceProvider();
var csp = (Gost3410_2012_256CryptoServiceProvider)certificates[0].PublicKey.Key;
var res = csp.VerifyData(messageBytes, GostHash, signatureBytes);
return res;
}

Возвращает false.

signatureBytes — переверните байты и подпись будет проходить проверку

Техническую поддержку оказываем тут
Наша база знаний


Вверх

WWW


Offline

Андрей *

 


#9
Оставлено
:

12 августа 2020 г. 11:53:41(UTC)

Андрей *

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 26.07.2011(UTC)
Сообщений: 11,739
Мужчина
Российская Федерация

Сказал «Спасибо»: 451 раз
Поблагодарили: 1838 раз в 1421 постах

Ваш токен прошёл проверку

В архиве — перевернутая подпись.

TestESIA.zip (3kb) загружен 21 раз(а).

token.txt.extracted — HEADER.PAYLOAD (две строки в base64 с точкой, как разделитель)
token.txt.extracted.sign.raw.reverse.all — перевернутая подпись

Техническую поддержку оказываем тут
Наша база знаний


Вверх

WWW

thanks 3 пользователей поблагодарили Андрей * за этот пост.

PeterPan

оставлено 12.08.2020(UTC),

lab2

оставлено 12.08.2020(UTC),

ITSec_NSK

оставлено 19.07.2022(UTC)


Offline

PeterPan

 


#10
Оставлено
:

12 августа 2020 г. 13:15:03(UTC)

PeterPan

Статус: Новичок

Группы: Участники

Зарегистрирован: 11.08.2020(UTC)
Сообщений: 4

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 1 постах

Огромное спасибо за наводку!

Делюсь работающим кодом.

Цитата:

/// <summary>
/// Проверка подписи JWT в формате HEADER.PAYLOAD.SIGNATURE.
/// </summary>
/// <param name=»message»>HEADER.PAYLOAD в формате Base64url</param>
/// <param name=»signature»>SIGNATURE в формате Base64url</param>
/// <param name=»certificates»>Сертификаты для проверки</param>
/// <returns></returns>
private static bool VerifyRawSignString(string message, string signature, X509Certificate2Collection certificates)
{
byte[] messageBytes = Encoding.UTF8.GetBytes(message);
byte[] signatureBytes = Base64UrlEncoder.DecodeBytes(signature);
Array.Reverse(signatureBytes, 0, signatureBytes.Length);

using (Gost3411_2012_256CryptoServiceProvider GostHash = new Gost3411_2012_256CryptoServiceProvider())
{
var csp = (Gost3410_2012_256CryptoServiceProvider)certificates[0].PublicKey.Key;
return csp.VerifyData(messageBytes, GostHash, signatureBytes);
}
}


Вверх

thanks 2 пользователей поблагодарили PeterPan за этот пост.

lab2

оставлено 12.08.2020(UTC),

two_oceans

оставлено 13.08.2020(UTC)

Пользователи, просматривающие эту тему

Guest

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

Pages 1

You must login or register to post a reply

1 2015.02.03 16:43

  • PunBB
  • PunBB
  • Admin
  • Offline
  • More info

Topic: Невозможно подтвердить маркер доступа. Возможно, прошло некоторое…

Невозможно подтвердить маркер доступа. Возможно, прошло некоторое время после первого входа на страницу и последующей отправкой формы или щелчком по ссылке. Если это так, и вы хотите выполнить своё действие до конца, нажмите кнопку «Подтвердить». Для возврата на исходную страницу нужно нажать кнопку «Отменить».

Как подтвердить маркер доступа и что это такое? Маркер доступа позволяет проверить зашифрованную ссылку сравнивая откуда пришел пользователь и куда. Эта система была внедрена в качестве безопасности от атак хакеров и взломщиков.

Почему иногда на форуме может возникать следующее предупреждение?

На форуме PunBB у каждого посетителя имеется свой SCRF TOKEN который периодически меняется, когда посетитель некоторое время отсутствовал на форуме. Ну например, вы писали сообщение час, два, три… и при этом не открывали другие страницы во вкладках. Простыми словами страница ответа висела долгое время. И вот, спустя часов 6 вы все таки написали поэму и решили отправить ее на форум. Что происходит?

В форме уже имеется токен (можно посмотреть исходник страницы)

<input type="hidden" name="csrf_token" value="0b6ae337a22d083dde13057ce2ddf0528">

Но когда вы отправили страницу, то за то время пока вы писали сообщение токен поменялся и сравнив хеши функция обнаружила отличие токенов, что вызвало подозрение и предупреждение:

Невозможно подтвердить маркер доступа. Возможно, прошло некоторое время после первого входа на страницу и последующей отправкой формы или щелчком по ссылке. Если это так, и вы хотите выполнить своё действие до конца, нажмите кнопку «Подтвердить». Для возврата на исходную страницу нужно нажать кнопку «Отменить».

В этом случае система предлагает подтвердить отправку формы, то есть попытается обновить токен и не потеряв данные формы отправить написанное большими усилиями сообщение. Если все верно, сообщение будет отправлено, иначе система будет бесконечно выдавать предупреждение.

2 Reply by PunBB 2015.02.03 17:21

  • PunBB
  • PunBB
  • Admin
  • Offline
  • More info

Re: Невозможно подтвердить маркер доступа. Возможно, прошло некоторое…

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

<input type="hidden" name="csrf_token" value="<?php echo generate_form_token(forum_link($forum_url['file_to'])) ?>" />

В данном случае переменная $forum_url[‘file_to’] должна быть равна абсолютной ссылке на файл куда отправляется $_POST или $_GET запрос.

Например, если вы отправляете форму скрипту файла settings.php находящегося по пути вот ссылка то

$forum_url['file_to'] = 'https://punbb.softplaza.net/settings.php';

или же непосредственно так:

<input type="hidden" name="csrf_token" value="<?php echo generate_form_token(forum_link('https://punbb.softplaza.net/settings.php')) ?>" />

3 Reply by PunBB 2015.02.03 17:28

  • PunBB
  • PunBB
  • Admin
  • Offline
  • More info

Re: Невозможно подтвердить маркер доступа. Возможно, прошло некоторое…

Токен, или маркер доступа можно отключить либо на всех страницах либо только на требуемых.

На всех страницах отключить можно в файле config.php раскоментировав строку

// Disable forum CSRF checking by removing // from the following line
define('FORUM_DISABLE_CSRF_CONFIRM', 1);

Этого я вам крайне не рекомендую делать навсегда, а только лишь для того чтобы настроить скрипты или выявить неисправности.

Отключить в определенном файле токен можно прописав в самый вверх сразу после интерпретатора php тот же код:

define('FORUM_DISABLE_CSRF_CONFIRM', 1);

Но даже в этом случае будьте осторожны чтобы не забыть об этой определенной константе. Токен это безопасность вашего форума.

4 Reply by vladimir-timoshenko 2019.03.29 09:50

  • vladimir-timoshenko
  • vladimir-timoshenko
  • Member
  • Offline
  • More info

Re: Невозможно подтвердить маркер доступа. Возможно, прошло некоторое…

форум 1.4.5
При регистрации или входе через смартфон, постоянно пишет «Невозможно подтвердить маркер доступа».
Новички при регистрации пугаются, думают, что что-то сделали не так…
Отключить токен в файле login.php?
А как же безопасность от хакеров?

5 Reply by PunBB 2019.03.29 10:44

  • PunBB
  • PunBB
  • Admin
  • Offline
  • More info

Re: Невозможно подтвердить маркер доступа. Возможно, прошло некоторое…

vladimir-timoshenko wrote:

Отключить токен в файле login.php?
А как же безопасность от хакеров?

Если проект небольшой, то для хакеров вряд ли он будет интересным. Делайте бекапы, пока данная проблема не решена. Слышу об этом не в первый раз, возможно где то уже и есть решение, но самому некогда исследовать. Обычно это из за разных токенов генерируемых из урл, например в пост запрос поступает один урл, а на выходе другой. Вот оно сравнивая и выдает ошибку.

6 Reply by vladimir-timoshenko 2019.03.29 13:42

  • vladimir-timoshenko
  • vladimir-timoshenko
  • Member
  • Offline
  • More info

Re: Невозможно подтвердить маркер доступа. Возможно, прошло некоторое…

Т.е., это проблема не у меня, а «вообще»  PunBB_INFO_ICQ/smile
Понятно, спасибо! Бум надеяться на решение

7 Reply by PunBB 2019.03.29 14:21

  • PunBB
  • PunBB
  • Admin
  • Offline
  • More info

Re: Невозможно подтвердить маркер доступа. Возможно, прошло некоторое…

Если немного есть навыки в php, то можно попробовать через print_r(); вывести получаемый урл после отправки пост запросом и сравнить что уходит и что получаем. Смотрите функцию csrf_token или что то вроде этого…

8 Reply by vladimir-timoshenko 2019.03.29 15:31

  • vladimir-timoshenko
  • vladimir-timoshenko
  • Member
  • Offline
  • More info

Re: Невозможно подтвердить маркер доступа. Возможно, прошло некоторое…

увы, пока навыки только в «чуть чуть подредактировать»  PunBB_INFO_ICQ/blush

Currently view post: 1 guest, 0 registered users

Pages 1

You must login or register to post a reply

При обмене кода на маркер доступа может возникнуть ряд дополнительных ошибок. Формат этих ответов зависит от передаваемого заголовка Accept.

Примечание. В этих примерах показаны только ответы JSON.

Неверные учетные данные клиента

Если передан неверный _идентификатор или секрет клиента_, вы получите этот ответ об ошибке.

{
  "error": "incorrect_client_credentials",
  "error_description": "The client_id and/or client_secret passed are incorrect.",
  "error_uri": "/apps/managing-oauth-apps/troubleshooting-oauth-app-access-token-request-errors/#incorrect-client-credentials"
}

Чтобы устранить ошибку, убедитесь в наличии правильных учетных данных для OAuth App. Тщательно проверьте правильность значений client_id и client_secret и их передачи в GitHub.

Несоответствие URI перенаправления

Если вы указали redirect_uri, который не совпадает с зарегистрированным в OAuth App, вы получите следующее сообщение об ошибке:

{
  "error": "redirect_uri_mismatch",
  "error_description": "The redirect_uri MUST match the registered callback URL for this application.",
  "error_uri": "/apps/managing-oauth-apps/troubleshooting-authorization-request-errors/#redirect-uri-mismatch2"
}

Чтобы исправить эту ошибку, укажите redirect_uri, который соответствует зарегистрированному, или оставьте этот параметр пустым, чтобы использовался зарегистрированный по умолчанию с приложением.

Неверный код проверки

{
  "add_scopes": [
    "repo"
  ],
  "note": "admin script"
}

Если переданный код проверки неверен, просрочен или не соответствует тому, что вы получили в первом запросе на авторизацию, вы получите эту ошибку.

{
  "error": "bad_verification_code",
  "error_description": "The code passed is incorrect or expired.",
  "error_uri": "/apps/managing-oauth-apps/troubleshooting-oauth-app-access-token-request-errors/#bad-verification-code"
}

Чтобы устранить ошибку, запустите процесс авторизации OAuth еще раз и получите новый код.

Как написано в How-To: Handle expired access tokens (ссылка не работает) статье в блоге разработчиков

Токены доступа для пользователей могут стать недействительными по различным причинам. В большинстве случаев они могут истечь, если прошло время, указанное в поле expires (по умолчанию токены доступа имеют срок жизни 2 часа). Многие разработчики не понимают, что срок действия маркера доступа также может истечь, если пользователь сменит пароль, выйдет из системы или деавторизует приложение через App Dashboard. Очень важно, чтобы ваши приложения справлялись с такими ситуациями. Если срок действия маркера доступа истек, вам необходимо заново получить действующий маркер доступа.

Раньше мы могли использовать разрешение offline_access для получения токена, срок действия которого не истекает (если пользователь не подключен к приложению), но теперь это разрешение устарело, смотрите Deprecation of Offline Access Permission, чтобы узнать, как можно получить access_token с более длительным сроком действия.

Обновление:.
С августа 2012 года Facebook PHP-SDK добавили простой способ продления access_token (подробнее см. в Как продлить срок действия токена доступа после отмены offline_access).

Обновление 2:.
Обратите внимание, что оригинальный пост в блоге Facebook об обработке токенов с истекшим сроком действия больше не существует. Однако существует новая документация, которую можно использовать для получения подробной информации.
https://developers.facebook.com/docs/facebook-login/access-tokens/#extending

Проблема

При отправке документа на подпись в SalesForce возникает следующая ошибка:

Ошибка при обновлении маркера доступа: invalid_request: недопустимый маркер доступа

10632

Среда

Причина

Из-за изменений, которые внесены администратором и которые могут повлиять на интеграцию Adobe Sign, выполняется отзыв маркера доступа.

Решение

Администратор SalesForce запускает мастер настройки Adobe Sign, используя учетные данные администратора Adobe Sign.

Необходимо выполнить следующие действия.
1. Выполните вход в учетную запись SalesForce и нажмите вкладку Администратор Adobe Sign.
2. Нажмите Запустить мастер настройки в разделе «Настройки учетной записи».
3. В шаге 1 «Привяжите свою учетную запись Adobe к Salesforce» в мастере настройки выполните вход с учетной записью администратора Adobe Sign.
4. В шаге 2 «Включите автоматические обновления статуса Adobe Sign» введите учетные данные SalesForce и нажмите кнопку Включить.

Дополнительная информация

Для запуска мастера настройки можно использовать только учетные данные администратора Adobe Sign.

Возможно, вам также будет интересно:

  • Что такое ошибка лямбда зонда
  • Что такое ошибка луа вов
  • Что такое ошибка лсу на принтере
  • Что такое ошибка логического контроля 508 фсс
  • Что такое ошибка литературными словами

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии