Подписывание сборок .NET. Sn.exe и рутокен

Коллеги, добрый день!

Не смог найти информацию, как сделать отложенную подпись .NET сборки с помощью Рутокен.
Есть такая возможность?

Re: Подписывание сборок .NET. Sn.exe и рутокен

kiselev, добрый день! Через какое ПО вы планируете подписывать - signtool?

Re: Подписывание сборок .NET. Sn.exe и рутокен

Павел Анфимов пишет:

kiselev, добрый день! Через какое ПО вы планируете подписывать - signtool?

Sn.exe (https://learn.microsoft.com/ru-ru/dotne … -name-tool), в сборке указана отложенная подпись или публичная, в разных случаях разная.
Раньше подписывали SNK в pipeline Gitlab.
PFX для signtool экспортировали из хранилища.

Re: Подписывание сборок .NET. Sn.exe и рутокен

kiselev, расскажите, пожалуйста, с какими именно сложностями вы столкнулись?

С Рутокен ЭЦП 3.0 возможно работать с использованием "Microsoft Base Smart Card Crypto Provider" по аналогии с https://stackoverflow.com/questions/997 … cate-store

Re: Подписывание сборок .NET. Sn.exe и рутокен

Павел Анфимов пишет:

kiselev, расскажите, пожалуйста, с какими именно сложностями вы столкнулись?

С Рутокен ЭЦП 3.0 возможно работать с использованием "Microsoft Base Smart Card Crypto Provider" по аналогии с https://stackoverflow.com/questions/997 … cate-store

В примере

then post-build, sign using sn.exe -Rc "your-container-name" "key.snk"

Как указать сертификат на ruToken вместо "key.snk"?

Re: Подписывание сборок .NET. Sn.exe и рутокен

kiselev, мы не разработчики sn.exe, но насколько мы понимаем инструкцию:
1.1) В Панели Управления Рутокен вы регистрируете сертификат
1.2) Там же вы получаете "your-container-name". Обычно это GUID. Скопировать его можно через меню по клику правой кнопкой мыши.
2) Затем указываете:

sn.exe -c "Microsoft Base Smart Card Crypto Provider"

3) Вам нужно получить открытый ключ:

There are two options from here: you tell sn.exe to create a key that contains only the public key and delay sign with that key (check the box at the bottom of the "Signing" tab in the project properties)

4) Используя открытый ключ (key.snk) вызвать:

sn.exe -Rc "your-container-name" "key.snk"

Также можно воспользоваться более подробным руководством: http://matthewdippel.blogspot.com/2017/ … embly.html

Re: Подписывание сборок .NET. Sn.exe и рутокен

Павел Анфимов пишет:

kiselev, мы не разработчики sn.exe, но насколько мы понимаем инструкцию:
1.1) В Панели Управления Рутокен вы регистрируете сертификат
1.2) Там же вы получаете "your-container-name". Обычно это GUID. Скопировать его можно через меню по клику правой кнопкой мыши.
2) Затем указываете:

sn.exe -c "Microsoft Base Smart Card Crypto Provider"

3) Вам нужно получить открытый ключ:

There are two options from here: you tell sn.exe to create a key that contains only the public key and delay sign with that key (check the box at the bottom of the "Signing" tab in the project properties)

4) Используя открытый ключ (key.snk) вызвать:

sn.exe -Rc "your-container-name" "key.snk"

Также можно воспользоваться более подробным руководством: http://matthewdippel.blogspot.com/2017/ … embly.html

Вы уверенны?
https://forum.rutoken.ru/uploads/images/2024/02/375aff17a9797b4323bf2d923912a520.png

Re: Подписывание сборок .NET. Sn.exe и рутокен

kiselev, покажите, пожалуйста, скриншот вкладки Сертификаты из Панели управления Рутокен

Re: Подписывание сборок .NET. Sn.exe и рутокен

Павел Анфимов пишет:

kiselev, покажите, пожалуйста, скриншот вкладки Сертификаты из Панели управления Рутокен

https://forum.rutoken.ru/uploads/images/2024/02/7834989bf43fdb9f34791e9cc1f849f0.png

С провайдером "Active ruToken CSP v1.0" тоже самое.

Re: Подписывание сборок .NET. Sn.exe и рутокен

kiselev, попробуйте передать имя контейнера 1:1 без дефисов, как на скриншоте.

Re: Подписывание сборок .NET. Sn.exe и рутокен

Павел Анфимов пишет:

kiselev, попробуйте передать имя контейнера 1:1 без дефисов, как на скриншоте.

Без дефисов нельзя, не находит контейнер.

Да и дело не в этом, посмотрите внимательно, "Сертификат с неизвлекаемоей ключевой парой".
Экспортировать даже публичный ключ нельзя.

Собственно, давайте перестанем гуглить и вернемся к первоначальному вопросу - "Есть возможность подписать сборки хотя бы публичным ключом используя руТокен?".

Может ваши разработчики знают?

Re: Подписывание сборок .NET. Sn.exe и рутокен

kiselev,
Согласно документации на sn.exe:
https://learn.microsoft.com/ru-ru/dotne … -name-tool

Средство строгих имен поддерживает пары открытого и закрытого ключей, созданные с помощью идентификатора алгоритма AT_SIGNATURE. При использовании пар открытого и закрытого ключей, созданных с помощью алгоритма AT_KEYEXCHANGE, возникает ошибка.

При том, что AT_KEYEXCHANGE более универсальна - ей возможно подписывать и шифровать - поэтому большинством Удостоверяющих центров выпускаются именно такие пары.

Убедиться какая у вас можно вызвав и посмотрев в выводе на поле KeySpec

certutil -store -v My 

Re: Подписывание сборок .NET. Sn.exe и рутокен

Павел Анфимов пишет:

kiselev,
Согласно документации на sn.exe:
https://learn.microsoft.com/ru-ru/dotne … -name-tool

Средство строгих имен поддерживает пары открытого и закрытого ключей, созданные с помощью идентификатора алгоритма AT_SIGNATURE. При использовании пар открытого и закрытого ключей, созданных с помощью алгоритма AT_KEYEXCHANGE, возникает ошибка.

При том, что AT_KEYEXCHANGE более универсальна - ей возможно подписывать и шифровать - поэтому большинством Удостоверяющих центров выпускаются именно такие пары.

Убедиться какая у вас можно вызвав и посмотрев в выводе на поле KeySpec

certutil -store -v My 

Вы опять гуглите не думая. Сертификат на токене а не в хранилище.
Правильная команда

certutil -SCInfo
================ Сертификат 0 ================
--- Устройство чтения: Aktiv Rutoken ECP 0
---   Карта: Rutoken ECP
Поставщик = Aktiv ruToken CSP v1.0
Контейнер ключа = 1e75e1ce7e8147c58c7afa2c9ceda962

Отсутствует ключ AT_SIGNATURE для устройства чтения: Aktiv Rutoken ECP 0
Серийный номер: 26c3c43ad5f9769b527515f2
Поставщик: CN=GlobalSign GCC R45 CodeSigning CA 2020, O=GlobalSign nv-sa, C=BE
 NotBefore: 21.02.2024 14:57
 NotAfter: 21.02.2027 14:57
Субъект: E=info@ascon.ru, CN=LLC ASCON-BUSINESS-SOLUTIONS, O=LLC ASCON-BUSINESS-SOLUTIONS, L=Kolomna, S=Moscow Oblast, C=RU
Не корневой сертификат
Хеш сертификата(sha1): 4f 18 d5 42 b0 2c 4d 7f 1d 63 38 3c 0a aa b2 eb 1a 3f d9 75

Выполнение теста сопоставления открытого ключа AT_KEYEXCHANGE...
Тест сопоставления открытого ключа выполнен успешно
  Контейнер ключа = 1e75e1ce7e8147c58c7afa2c9ceda962
  Поставщик = Aktiv ruToken CSP v1.0
  ProviderType = 1
  Флаги = 1
    0x1 (1)
  KeySpec = 1 -- AT_KEYEXCHANGE
Закрытый ключ удостоверяет подлинность

Выполнение проверки цепочки сертификатов...
Цепочка проверена
Вход со смарт-картой: Недопустимая цепочка на смарт-карте
dwFlags = CA_VERIFY_FLAGS_CONSOLE_TRACE (0x20000000)
dwFlags = CA_VERIFY_FLAGS_DUMP_CHAIN (0x40000000)
ChainFlags = CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT (0x40000000)
HCCE_LOCAL_MACHINE
CERT_CHAIN_POLICY_BASE
-------- CERT_CHAIN_CONTEXT --------
ChainContext.dwInfoStatus = CERT_TRUST_HAS_PREFERRED_ISSUER (0x100)
ChainContext.dwRevocationFreshnessTime: 51 Minutes, 37 Seconds

SimpleChain.dwInfoStatus = CERT_TRUST_HAS_PREFERRED_ISSUER (0x100)
SimpleChain.dwRevocationFreshnessTime: 51 Minutes, 37 Seconds

CertContext[0][0]: dwInfoStatus=102 dwErrorStatus=0
  Issuer: CN=GlobalSign GCC R45 CodeSigning CA 2020, O=GlobalSign nv-sa, C=BE
  NotBefore: 21.02.2024 14:57
  NotAfter: 21.02.2027 14:57
  Subject: E=info@ascon.ru, CN=LLC ASCON-BUSINESS-SOLUTIONS, O=LLC ASCON-BUSINESS-SOLUTIONS, L=Kolomna, S=Moscow Oblast, C=RU
  Serial: 26c3c43ad5f9769b527515f2
  75d93f1aebb2aa0a3c38631d7f4d2cb042d5184f
  Element.dwInfoStatus = CERT_TRUST_HAS_KEY_MATCH_ISSUER (0x2)
  Element.dwInfoStatus = CERT_TRUST_HAS_PREFERRED_ISSUER (0x100)
    CRL (null):
    Issuer: CN=gsgccr45codesignca2020CA OCSP Responder, O=GlobalSign nv-sa, C=BE
    ThisUpdate: 01.03.2024 10:47
    NextUpdate: 05.03.2024 10:47
    751cee963c52cfd9384b85ec9d13b79e4f6f2526
  Issuance[0] = 1.3.6.1.4.1.4146.1.50 
  Issuance[1] = 2.23.140.1.4.1 
  Application[0] = 1.3.6.1.5.5.7.3.3 Подписывание кода

CertContext[0][1]: dwInfoStatus=102 dwErrorStatus=0
  Issuer: CN=GlobalSign Code Signing Root R45, O=GlobalSign nv-sa, C=BE
  NotBefore: 28.07.2020 3:00
  NotAfter: 28.07.2030 3:00
  Subject: CN=GlobalSign GCC R45 CodeSigning CA 2020, O=GlobalSign nv-sa, C=BE
  Serial: 77bd0e03a1b708f854ab067210d90447
  327a435d08b6d0ea7cbeaf64ad2e9eb2ed46217a
  Element.dwInfoStatus = CERT_TRUST_HAS_KEY_MATCH_ISSUER (0x2)
  Element.dwInfoStatus = CERT_TRUST_HAS_PREFERRED_ISSUER (0x100)
    CRL (null):
    Issuer: CN=GlobalSign Code Signing Root R45 - OCSP 1.2 20240207, O=GlobalSign nv-sa, C=BE
    ThisUpdate: 01.03.2024 10:04
    NextUpdate: 05.03.2024 10:04
    637f31ac89b95480f0472b428c3b0a43a9fa5e1a
  Issuance[0] = 1.3.6.1.4.1.4146.1.50 
  Issuance[1] = 2.23.140.1.4.1 
  Application[0] = 1.3.6.1.5.5.7.3.3 Подписывание кода

CertContext[0][2]: dwInfoStatus=10c dwErrorStatus=0
  Issuer: CN=GlobalSign Code Signing Root R45, O=GlobalSign nv-sa, C=BE
  NotBefore: 18.03.2020 3:00
  NotAfter: 18.03.2045 3:00
  Subject: CN=GlobalSign Code Signing Root R45, O=GlobalSign nv-sa, C=BE
  Serial: 7653feac75464893f5e5d74a483a4ef8
  b8844cd93680002cce1b9ce5ca9e610c4631fc4e
  Element.dwInfoStatus = CERT_TRUST_HAS_NAME_MATCH_ISSUER (0x4)
  Element.dwInfoStatus = CERT_TRUST_IS_SELF_SIGNED (0x8)
  Element.dwInfoStatus = CERT_TRUST_HAS_PREFERRED_ISSUER (0x100)
  Application[0] = 1.3.6.1.5.5.7.3.3 Подписывание кода

Exclude leaf cert:
  d7158137d43d86f75c93d576520384669446feb6
Full chain:
  4cbb63754674a76f20234a5f35dc6844bd92c6c2
------------------------------------
Проверенные политики выдачи:
    1.3.6.1.4.1.4146.1.50
    2.23.140.1.4.1
Проверенные политики применения:
    1.3.6.1.5.5.7.3.3 Подписывание кода
Отображен сертификат AT_KEYEXCHANGE для устройства чтения: Aktiv Rutoken ECP 0
SCardGetCardTypeProviderName: Не удается найти указанный файл. 0x2 (WIN32: 2 ERROR_FILE_NOT_FOUND)
Не удается получить имя поставщика для Rutoken ECP
--------------===========================--------------

Re: Подписывание сборок .NET. Sn.exe и рутокен

kiselev, вам необходима ключевая пара AT_SIGNATURE, которой сейчас у вас нет на устройстве.

Re: Подписывание сборок .NET. Sn.exe и рутокен

Павел Анфимов пишет:

kiselev, вам необходима ключевая пара AT_SIGNATURE, которой сейчас у вас нет на устройстве.

ОК. Закрывайте.