gokalkan

package module
v0.0.0-...-9187f60 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 29, 2025 License: MIT Imports: 15 Imported by: 0

README

gokalkan

pkg-img reportcard-img

Пакет gokalkan является оберткой над нативными методами библиотеки KalkanCrypt.

KalkanCrypt является основной библиотекой для работы с ЭЦП ключами от pki.gov.kz и позволяет подписывать, верифицировать, вытаскивать данные и много чего другого связанного с электронными подписями, цифровыми сертификатами и ключами.

Особенности пакета gokalkan:

  • Поддержка мультипоточности
  • Без зависимостей
  • Чистый код
  • Напрямую вызывает нативные методы KalkanCrypt

Перед использованием

Чтобы использовать библиотеку требуется провести подготовку:

1. Получить SDK

Обратиться в pki.gov.kz чтобы получить SDK. SDK представляет из себя набор библиотек для Java и C.

2. Установить CA сертификаты

Сертификаты лежат по пути SDK/C/Linux/ca-certs/Ubuntu. В папке находятся два типа сертификатов - production и test. Для их установки приготовлены скрипты в той же директории. При запуске понадобятся sudo права.

3. Скопировать .so файлы

Файлы лежат в директории SDK 2.0/C/Linux/C/libs/v2.0.4. Команда для копирования:

sudo cp -f libkalkancryptwr-64.so.2.0.4 /usr/lib/libkalkancryptwr-64.so

Установка

Версия Go 1.17+

go get github.com/gokalkan/gokalkan

Загрузка хранилища PKCS12

Загрузка хранилища с ключом и сертификатом (например ЭЦП ключ, который начинается с RSA...):

package main

import (
	"fmt"
	"log"

	"github.com/gokalkan/gokalkan"
)

var (
	certPath = "test_cert/GOSTKNCA.p12" // путь к хранилищу

	certPassword = "Qwerty12" // пароль
	// P.S. никогда не храните пароли в коде
)

func main() {
	// для теста
	opts := gokalkan.OptsTest

	// для прода
	// opts := gokalkan.OptsProd

	cli, err := gokalkan.NewClient(opts...)
	if err != nil {
		log.Fatal("new kalkan client create error", err)
	}
	// Обязательно закрывайте клиент, иначе приведет к утечкам ресурсов
	defer cli.Close()

	// Подгружаем хранилище с паролем
	err = cli.LoadKeyStore(certPath, certPassword)
	if err != nil {
		log.Fatal("load key store error", err)
	}
}

Следует отметить, что при инициализации gokalkan клиента нужно указывать опцию. Есть две опции - OptsTest и OptsProd. Нужно выбрать одну из них в зависимости от окружения.

Подпись XML документа

Для того чтобы подписать XML документ, нужно передать документ в виде строки:

signedXML, err := cli.SignXML("<root>GoKalkan</root>")

fmt.Println("Подписанный XML", signedXML)
fmt.Println("Ошибка", err)
Проверка подписи на XML документе

Проверка подписи документа вернет ошибку, если документ подписан неверно либо срок у сертификата с которым подписан истёк.

serial, err := cli.VerifyXML(signedXML)

fmt.Println("Серийный номер", serial)
fmt.Println("Ошибка", err)
Подпись XML документа для SmartBridge

Для того чтобы подписать XML документ в формате SignWSSE, нужно передать документ в виде строки и id для SOAP Body. Функция обернет документ в soap:Envelope и запишет внутри soap:Body.

signedXML, err := cli.SignWSSE("<root>gokalkan</root>", "12345")

fmt.Println("Подписанный XML в формате WSSE", signedXML)
fmt.Println("Ошибка", err)
Получение времени когда был подписан документ 2 подписантом
signTime, err := c.GetTimeFromSig(cmsFileBody, 1)

fmt.Println("Время подписи", signTime)
fmt.Println("Ошибка", err)
Получение значение поля из сертификата

Внимание! Сертификат должен быть в формате PEM.

value, err := c.X509CertificateGetInfo(certBody, ckalkan.CertPropSubjectCommonName)

fmt.Println("Значение", value)
fmt.Println("Ошибка", err)
Получение сводной информации о сертификате

Внимание! Сертификат должен быть в формате PEM.

info, err := c.X509CertificateGetSummary(certBody)

fmt.Println("Информация", info)
fmt.Println("Ошибка", err)

Бенчмарки

Команда запуска бенчмарка:

go test -bench SignXML -run=^$ -benchmem

Характеристики хост машины:

  • goos: linux
  • goarch: amd64
  • cpu: Intel(R) Core(TM) i5-8500 CPU @ 3.00GHz
Бенчмарк Кол-во циклов Средн. время выполнения Средн. потребление ОЗУ Средн. кол-во аллокаций
BenchmarkSignXML-6 2809 422310 ns/op 2792 B/op 8 allocs/op

Контрибьютеры ✨


Zulbukharov Abylaikhan

Tlekbai Ali

Kilibayev Azat

Лицензия

The MIT License (MIT) 2021 - Abylaikhan Zulbukharov.

Please have a look at the LICENSE.md for more details.

Documentation

Index

Constants

View Source
const (
	CertTypeIndividual   = "individual"
	CertTypeOrganization = "organization"
)

Variables

View Source
var (
	OptsProd = []Option{
		WithLogger(defaultLogger),
		WithTSP(prodTSP),
		WithOCSP(prodOCSP),
	}
	OptsTest = []Option{
		WithLogger(defaultLogger),
		WithTSP(testTSP),
		WithOCSP(testOCSP),
	}
)
View Source
var (
	ErrInit    = errors.New("unable to refer to KC_GetFunctionList")
	ErrHTTPCli = errors.New("http cli error")
)
View Source
var ErrLoadKey = errors.New("load key error")

Functions

func WrapWithWSSESoapEnvelope

func WrapWithWSSESoapEnvelope(dataXML, id string) (result string)

WrapWithWSSESoapEnvelope оборачивает XML документ в SOAP формат, а точнее записывает содержимое под тегом soap:Body

Types

type CertIssuer

type CertIssuer struct {
	CommonName string
	Country    string
	DN         string
}

type CertOrganization

type CertOrganization struct {
	Name        string
	BIN         string
	SubjectRole CertSubjectRole
}

type CertSubject

type CertSubject struct {
	CommonName string
	LastName   string
	Country    string
	IIN        string
	DN         string
}

type CertSubjectRole

type CertSubjectRole int
const (
	CertSubjectRoleUndefined CertSubjectRole = iota
	CertSubjectRoleCEO
	CertSubjectRoleSign
	CertSubjectRoleSignFinance
	CertSubjectRoleHR
	CertSubjectRoleEmployee
)

type CertType

type CertType string

type Client

type Client struct {
	// contains filtered or unexported fields
}

func NewClient

func NewClient(opts ...Option) (*Client, error)

NewClient возвращает клиента для работы с KC.

func (*Client) Close

func (cli *Client) Close() (err error)

func (*Client) GetCertFromCMS

func (cli *Client) GetCertFromCMS(cms []byte, signID int) (string, error)

GetCertFromCMS обеспечивает получение сертификата из CMS.

func (*Client) GetCertFromXML

func (cli *Client) GetCertFromXML(xml string, signID int) ([]byte, error)

GetCertFromXML обеспечивает получение сертификата из XML.

func (*Client) GetTimeFromSig

func (cli *Client) GetTimeFromSig(signature []byte, signID int) (time.Time, error)

func (*Client) HashGOST95

func (cli *Client) HashGOST95(data []byte) (hashed []byte, err error)

func (*Client) HashSHA256

func (cli *Client) HashSHA256(data []byte) (hashed []byte, err error)

func (*Client) LoadCertFromBytes

func (cli *Client) LoadCertFromBytes(cert []byte, certType ckalkan.CertType) (err error)

func (*Client) LoadCerts

func (cli *Client) LoadCerts() error

func (*Client) LoadKeyStore

func (cli *Client) LoadKeyStore(path, password string) error

LoadKeyStore загружает PKCS12.

func (*Client) LoadKeyStoreFromBytes

func (cli *Client) LoadKeyStoreFromBytes(key []byte, password string) (err error)

LoadKeyStoreFromBytes загружает PKCS12.

func (*Client) Options

func (cli *Client) Options() Options

func (*Client) Sign

func (cli *Client) Sign(data []byte, isDetached, withTSP bool) (signature []byte, err error)

Sign подписывает данные и возвращает подпись.

func (*Client) SignWSSE

func (cli *Client) SignWSSE(xmlData, id string) (string, error)

func (*Client) SignXML

func (cli *Client) SignXML(xmlData string) (string, error)

SignXML подписывает данные в формате XML.

func (*Client) ValidateCert

func (cli *Client) ValidateCert(cert string) (string, error)

func (*Client) ValidateCertOCSP

func (cli *Client) ValidateCertOCSP(cert string, url ...string) (string, error)

func (*Client) Verify

func (cli *Client) Verify(signature []byte) (string, error)

Verify обеспечивает проверку подписи CMS в base64.

func (*Client) VerifyDetached

func (cli *Client) VerifyDetached(signature, data []byte) (string, error)

VerifyDetached обеспечивает проверку отделенной подписи CMS (detached signature) в base64.

func (*Client) VerifyXML

func (cli *Client) VerifyXML(signedXML string) (result string, err error)

VerifyXML обеспечивает проверку подписи данных в формате XML.

func (*Client) X509CertificateGetInfo

func (cli *Client) X509CertificateGetInfo(cert string, prop ckalkan.CertProp) (string, error)

func (*Client) X509CertificateGetSummary

func (cli *Client) X509CertificateGetSummary(cert string) (*Summary, error)

X509CertificateGetSummary возвращает информацию о сертификате. Используйте только после Verify, если используется для проверки подписей

type Kalkan

type Kalkan interface {
	LoadKeyStore(path, password string) (err error)
	LoadKeyStoreFromBytes(key []byte, password string) (err error)

	Sign(data []byte, isDetached, withTSP bool) (signature []byte, err error)
	SignXML(xml string) (signedXML string, err error)
	SignWSSE(xml, id string) (signedXML string, err error)

	Verify(signature []byte) (string, error)
	VerifyXML(signedXML string) (string, error)
	VerifyDetached(signature, data []byte) (string, error)

	GetCertFromCMS(cms []byte, signID int) (string, error)
	GetCertFromXML(xml string, signID int) ([]byte, error)

	ValidateCert(cert string) (string, error)
	ValidateCertOCSP(cert string, url ...string) (string, error)

	X509CertificateGetInfo(inCert string, prop ckalkan.CertProp) (string, error)

	HashSHA256(data []byte) ([]byte, error)
	HashGOST95(data []byte) ([]byte, error)
	Close() error
}

Kalkan - это обертка над методами KalkanCrypt.

type Logger

type Logger interface {
	Debug(args ...interface{})
	Error(args ...interface{})
}

type Option

type Option func(o *Options)

func WithCert

func WithCert(cert *x509.Certificate, typ ckalkan.CertType) Option

func WithCerts

func WithCerts(c []OptionsCert) Option

func WithLogger

func WithLogger(logger Logger) Option

func WithOCSP

func WithOCSP(u string) Option

func WithRemoteProdCerts

func WithRemoteProdCerts(ctx context.Context) Option

func WithRemoteTestCerts

func WithRemoteTestCerts(ctx context.Context) Option

func WithTSP

func WithTSP(u string) Option

type Options

type Options struct {
	TSP       string        `json:"tsp"`   // URL метки времени
	OCSP      string        `json:"ocsp"`  // URL сервиса онлайн проверки статуса сертификата
	Certs     []OptionsCert `json:"certs"` // Корневые сертификатам
	LoadCerts bool          `json:"load_certs"`
	// contains filtered or unexported fields
}

type OptionsCert

type OptionsCert struct {
	Cert *x509.Certificate
	Type ckalkan.CertType
}

type Summary

type Summary struct {
	Type         CertType
	Subject      CertSubject
	Organization *CertOrganization
	Issuer       CertIssuer
	PublicKey    string
	SerialNumber string
	NotAfter     time.Time
	NotBefore    time.Time
}

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL