1C: Подпись произвольного текста в 1С

Задача: получить и выполнить подпись произвольного текста.

Решение: воспользуемся стандартным функционалом 1С. Предварительно на сервер необходимо установить в контейнер собственно сам сертификат. Так-же должен соответственно быть установлен крипто про.

&НаСервере
Функция ВыполнитьПодписьНаСервере(СтрокаДляПодписи,ИдентификаторПОдписи)
	answer = Новый Структура("error,result,", Истина, "Не удалось подписать строку");
		
	МенеджерКриптографии = Новый МенеджерКриптографии("Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", "", 80);
	Хранилище = МенеджерКриптографии.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты);
	СертификатыВХранилище = Хранилище.ПолучитьВсе();

	для каждого сертификат из СертификатыВХранилище цикл
		если сертификат.субъект.CN=ИдентификаторПОдписи тогда		
			ИмяВремФайла = ПолучитьИмяВременногоФайла();
		    Текст = Новый ЗаписьТекста(ИмяВремФайла, "CESU-8");
		    Текст.Записать(СтрокаДляПодписи);
		    Текст.Закрыть();					
			Попытка
		        Результат =  МенеджерКриптографии.Подписать(ИмяВремФайла,неопределено,Сертификат);
				answer.error=false;
				answer.result=Результат;
				возврат answer;
			Исключение
				answer.result=ОписаниеОшибки();
		        сообщить(answer.result);
				УдалитьФайлы(ИмяВремФайла);
				возврат answer;
		    КонецПопытки;	
			
	        УдалитьФайлы(ИмяВремФайла);
			
		конецесли;
	конеццикла;	
	
	answer.result="Не найден сертификат для подписи";	
	возврат answer;
	
КонецФункции

&НаКлиенте
Процедура ВыполнитьПодпись(Команда)
	ВыполнитьПодписьНаСервере("SignRTP","!!!");
КонецПроцедуры

НСПК: Подпись файла тестовым сертификатом для подписи

Для начала нужно получить закрытый ключ в формате, который может прочитать openssl. Для этого из утилиты xca, экспортируем ключ в формате p12:

Далее извлекаем закрытый ключ:

openssl pkcs12 -in SignRTP.p12 -nocerts -nodes -out p1.pem

Подписывать можно командой вида:

openssl dgst -engine gost -md_gost12_256 -binary -sign p1.pem 1.txt | base64

НСПК: Создание заявки на тестовый сертификат

Для того чтобы его оформить, нужно загрузить файл заявки. Теоретически можно создать её при помощи Крипто-АРМ, но под рукой его не оказалось, за сим создавал его при помощи графической утилиты xca, входящей в состав Astra Linux. Из особенностей:

Алгоритм подписи должен быть ГОСТ Р 34.11 2012 356

Закрытый ключ должен быть таким:

Водительская комиссия Вологде

Обзавелся давече мечтой — мотоциклом. Соответственно нужно открыть категорию А. Мотошколы просят прежде пройти водительскую комиссию. А это как было 10 лет назад квестом, так и осталось. Вот текущий порядок действий:

  1. Взять бланк для прохождения комиссии в любом учреждении оказывающей эту услугу
  2. Пройти врача-психиатра. Предварительная запись 29-06-29. Очередь примерно 8 дней. Стоимость 900р. При записи дадут код который нужно будет ввести в и получить талончик в терминале. Залинейная-29. Ставит запись в бланке
  3. Пройти врача-психиатра-нарколога. Набережная 6 армии, 139. Без записи. Стоимость 500р. Ставит запись в бланке.
  4. С бланками вернутся в п.1, где брали бланк и пройти оставшихся специалистов.

Map API Yandex 3: Подсказки при наведении на полигон

Нет, всё таки версия 3 еще сыровата для внедрения в прод. Ну или «лыжи не едут». Для решения простой задачи — отображение подсказки над полигоном, пришлось переписываться с тех поддержкой яндекса (и они даже ответили!, чем я безмерно удивлён). В результате родился скрипт, в котором требуется переопределение вызовов класса. Хм.. это определенно не то что хочется видеть для получения базовых вещей, которые в версии 2.1 работают «из коробки».

async function main() {
    await ymaps3.ready;
    ymaps3.import.registerCdn('https://cdn.jsdelivr.net/npm/{package}',['@yandex/ymaps3-hint@0.0.1']);
    const {YMap,YMapDefaultSchemeLayer,YMapFeature,YMapDefaultFeaturesLayer,YMapFeatureSource,YMapFeatureDataSource,YMapEntity} = ymaps3;
    const {YMapHint,YMapHintContext} = await ymaps3.import('@yandex/ymaps3-hint');


    map = new ymaps3.YMap(
        document.getElementById('app'),
        {location: 
            {
                center: [39.8491648, 59.2084992], 
                zoom: 9 
            },
            showScaleInCopyrights: false  //шкала масштаба рядом в логотипом
        }        
    );  
    

    const defaultScheme = new YMapDefaultSchemeLayer({});    // Добавляем рисованное изображение карты
    map.addChild(defaultScheme);

    const features = new YMapDefaultFeaturesLayer();
    map.addChild(features);

       
   //получаем список районов
    common.AjaxPost("index.php?r=site2/get-areas","").then(async areas_list=>{
        console.log("-прочитал список районов ",areas_list);
        if (areas_list.error==false){
            for (var i = 0; i < areas_list.result.length; i++) {                        
                await common.AjaxPost("areas/"+areas_list.result[i].poly_filename,"aa").then(res2=>{
                    console.log(areas_list.result[i].name);                    
                    res2=common.ReverseCoors(res2);
                    console.log(areas_list.result[i].poly_fill_color);
                    const polygon = new ymaps3.YMapFeature({
                        geometry: {
                            type: 'Polygon',
                            coordinates: res2
                        },
                        properties: {
                          hint: areas_list.result[i].name+" район"
                        },                        
                        style: {
                                stroke: [
                                    {
                                        color: '#196DFF99',
                                        dash: [5, 10],
                                        width: 3
                                        
                                    }
                                ],
                                fillOpacity: 0.2,
                                fill: "#"+areas_list.result[i].poly_fill_color
                            }
                    });
                    features.addChild(polygon);
                });                 
            };        
        };
    });    
    
      const hint = new YMapHint({
        layers: [features.layer],
        hint: object => object?.properties?.hint
      });
      map.addChild(hint);

      hint.addChild(
        new(
          class MyHint extends YMapEntity {
            _onAttach() {
                this._element =document.createElement('div');
                this._element.className ='hint';
                this._detachDom =ymaps3.useDomContext(this,this._element);
                this._watchContext(
                YMapHintContext,
                    () => {
                      const context =this._consumeContext(YMapHintContext);
                      this._element.textContent =(context?.hint || '');
                      console.log(this._element);
                    }, {
                      immediate: true
                    }
                  );
                }
            _onDetach() {this._detachDom();}
          }
        )()
      );

};    

window.map = null;            
main();
1 2 3 311