gesign.mn платформын API documentation — 3-дагч тал системүүдэд зориулав
| Base URL | https://api.gesign.mn |
| Протокол | HTTPS (TLS 1.2+) |
| Content-Type | application/json |
| Стандарт | eIDAS, ETSI EN 319 132/142, CSC API v2, RFC 3161 |
gesign.mn нь 3-дагч тал системүүдэд дараах үйлчилгээнүүдийг үзүүлнэ:
Partner систем бүр OAuth2 Client болж бүртгэгдэнэ. Admin хэсгээс client_id + client_secret олгоно.
POST /oauth2/token
Content-Type: application/json
{
"grant_type": "client_credentials",
"client_id": "your_client_id",
"client_secret": "your_client_secret",
"scope": "sign webhook"
}// Response
{
"access_token": "eyJhbGci...",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "sign webhook"
}Scopes:
| Scope | Зориулалт |
|---|---|
sign | Sign request үүсгэх, статус шалгах |
credential:read | Сертификат жагсаах/харах |
credential:sign | CSC API-аар гарын үсэг зурах |
webhook | Webhook бүртгэх/удирдах |
CSC API болон хэрэглэгчийн endpoint-үүд JWT Bearer token шаарддаг.
Authorization: Bearer <access_token>Хэрэглэгчээр баримтад гарын үсэг зуруулах async flow. Partner систем хүсэлт үүсгэнэ, хэрэглэгч gesign.mn-ээр зурна, webhook-ээр үр дүн ирнэ.
Partner App gesign.mn User
| | |
|-- POST /partner/sign-request | |
| (document_hash) | |
|<---- sign_url, request_id ---| |
| | |
| sign_url-г хэрэглэгчид илгээнэ (email/SMS) |
|---------------------------------------------------------|
| | |
| |<-- Хэрэглэгч sign_url --|
| | нээж, гарын үсэг зурна|
| | |
|<---- Webhook: signed --------| |
| (signature, certificate) | |Auth: Bearer <partner_token> (scope: sign)
// Request
{
"user_email": "user@example.mn", // эсвэл user_phone
"user_phone": "+97699001234", // optional
"document_hash": "e3b0c44298fc...", // SHA-256 hex
"document_name": "contract.pdf", // optional
"document_url": "https://...", // optional, хэрэглэгчид харуулна
"description": "Гэрээний баримт", // optional
"required_loa": 2, // 1-3, default 2
"callback_url": "https://partner.mn/callback", // optional
"external_ref": "order-12345", // таны системийн reference
"expires_in": 86400 // секундээр, default 24 цаг
}// Response 201
{
"request_id": "uuid",
"status": "pending",
"sign_url": "https://gesign.mn/sign/uuid",
"expires_at": "2026-03-31T12:00:00Z",
"external_ref": "order-12345"
}Auth: Bearer <partner_token> (scope: sign)
// Response
{
"request_id": "uuid",
"status": "signed", // pending | signed | rejected | expired
"external_ref": "order-12345",
"signed_at": "2026-03-30T10:30:00Z",
"rejected_at": null,
"expires_at": "2026-03-31T12:00:00Z",
"created_at": "2026-03-30T10:00:00Z"
}Auth: Bearer <partner_token> (scope: webhook)
// Request
{
"url": "https://partner.mn/webhook/eid",
"events": ["sign_request.signed", "sign_request.rejected", "sign_request.expired"]
}
// Response 201
{
"webhook": { "id": "uuid", "url": "...", "events": [...], "status": "active" },
"signing_key": "hex_secret" // HMAC баталгаажуулалтад хэрэглэнэ
}Cloud Signature Consortium стандартын дагуу хэрэглэгчийн нэрийн өмнөөс hash-д шууд гарын үсэг зурна. Real-time (sync) flow.
1. credentials/list → Хэрэглэгчийн сертификатууд 2. credentials/info → Сертификатын мэдээлэл + SAM тохиргоо 3. credentials/authorize → OTP + PIN шалгалт → SAD token 4. signatures/signHash → SAD + hash → signature
Auth: шаардахгүй
// Response
{
"specs": "2.0.0.2",
"name": "gesign.mn",
"region": "MN",
"lang": "mn-MN",
"authType": ["basic", "oauth2code"],
"methods": [
"auth/login", "credentials/list", "credentials/info",
"credentials/authorize", "signatures/signHash"
]
}Auth: Bearer <user_jwt>
// Response
{
"credentialIDs": [
"ea530523-5b6b-4674-810f-23a2c6927857"
]
}Auth: Bearer <user_jwt>
// Request
{
"credentialID": "ea530523-...",
"certInfo": true,
"authInfo": true,
"certificates": "single"
}
// Response
{
"key": { "status": "enabled", "algo": ["1.2.840.10045.2.1"], "len": 256, "curve": "P-256" },
"cert": {
"status": "valid",
"subjectDN": "CN=..., C=MN",
"serialNumber": "...",
"validFrom": "20260324...",
"validTo": "20270324...",
"certificates": ["MIIBxTCCAWugAwIB..."]
},
"authMode": "explicit",
"SCAL": "1",
"multisign": 1,
"OTP": { "presence": "true", "type": "online" },
"PIN": { "presence": "true", "format": "N" }
}Auth: Bearer <user_jwt>
SAM (Signature Activation Module) шалгалт. OTP + PIN шаардлагатай (admin тохиргооноос хамаарна).
// Request (1-р дуудалт — OTP код илгээгдэнэ)
{
"credentialID": "ea530523-...",
"numSignatures": 1,
"hash": ["base64_encoded_sha256_hash"]
}
// Response 401
{ "error": "otp_required", "error_description": "OTP код илгээгдлээ (SMS)..." }
// Request (2-р дуудалт — OTP + PIN-тэй)
{
"credentialID": "ea530523-...",
"numSignatures": 1,
"hash": ["base64_encoded_sha256_hash"],
"OTP": "123456",
"PIN": "654321"
}
// Response 200
{
"SAD": "p6Kw_2zgWUuChdVq...",
"expiresIn": 300
}Auth: Bearer <user_jwt>
// Request
{
"credentialID": "ea530523-...",
"SAD": "p6Kw_2zgWUuChdVq...",
"hash": ["base64_encoded_sha256_hash"],
"hashAlgo": "2.16.840.1.101.3.4.2.1",
"signAlgo": "1.2.840.10045.4.3.2"
}
// Response
{
"signatures": ["A9SyJAhHw2TN8q5zco7f..."]
}3-дагч тал систем gesign.mn account-аар хэрэглэгчийг нэвтрүүлэх. Authorization Code + PKCE flow.
1. GET /oauth/authorize?client_id=...&redirect_uri=...&code_challenge=... 2. Хэрэглэгч gesign.mn-д нэвтэрч consent өгнө 3. Redirect → partner callback?code=...&state=... 4. POST /api/v1/auth/token (code + code_verifier → access_token)
GET /oauth/authorize?
client_id=your_client_id&
redirect_uri=https://partner.mn/callback&
response_type=code&
scope=openid+profile+email&
state=random_csrf_state&
code_challenge=S256_hash&
code_challenge_method=S256// Request
{
"grant_type": "authorization_code",
"code": "auth_code_from_callback",
"code_verifier": "original_pkce_verifier"
}
// Response
{
"data": {
"access_token": "eyJhbGci...",
"refresh_token": "...",
"expires_in": 3600
}
}GET /.well-known/openid-configuration | OIDC discovery metadata |
GET /.well-known/jwks.json | JWT public keys (JWK Set) |
POST /api/v1/oauth/introspect | Token introspection |
POST /api/v1/oauth/revoke | Token revocation |
Эдгээр endpoint-ууд нээлттэй — authentication шаардахгүй.
| Endpoint | Тайлбар |
|---|---|
POST /api/v1/signature/verify | Ерөнхий гарын үсэг шалгах |
POST /api/v1/signature/cades/verify | CAdES (CMS) шалгах |
POST /api/v1/signature/xades/verify | XAdES (XML) шалгах |
POST /api/v1/signature/pades/verify | PAdES (PDF) шалгах |
POST /api/v1/signature/asic/verify | ASiC контейнер шалгах |
// POST /api/v1/signature/verify
// Content-Type: multipart/form-data
// Fields: signature (file), document (file), signature_format (string)
// Response
{
"is_valid": true,
"signer_name": "Отгонбаяр БАЯРСАЙХАН",
"signing_time": "2026-03-30T10:30:00Z",
"signature_level": "CAdES-T",
"is_timestamped": true,
"certificate_info": "CN=..., C=MN"
}| Event | Тайлбар |
|---|---|
sign_request.signed | Хэрэглэгч гарын үсэг зурсан |
sign_request.rejected | Хэрэглэгч татгалзсан |
sign_request.expired | Хүсэлтийн хугацаа дууссан |
POST https://partner.mn/webhook/eid
Content-Type: application/json
X-Webhook-Signature: sha256=<hmac_hex>
X-Webhook-Timestamp: 1709400000
{
"event": "sign_request.signed",
"request_id": "uuid",
"external_ref": "order-12345",
"status": "signed",
"signed_at": "2026-03-30T10:30:00Z",
"signature": "MEYCIQD...", // base64 CAdES signature
"certificate": "-----BEGIN CERTIFICATE-----\n..."
}# Python жишээ
import hmac, hashlib
def verify_webhook(body: bytes, timestamp: str, signature: str, secret: str) -> bool:
payload = f"{timestamp}.".encode() + body
expected = hmac.new(secret.encode(), payload, hashlib.sha256).hexdigest()
return hmac.compare_digest(f"sha256={expected}", signature)Webhook амжилтгүй (HTTP 2xx биш) бол дараах дарааллаар дахин илгээнэ:
| 1-р | Шууд |
| 2-р | 1 минутын дараа |
| 3-р | 5 минутын дараа |
| 4-р | 30 минутын дараа |
| 5-р | 2 цагийн дараа (сүүлийнх) |
// Стандарт алдааны формат
{
"error": {
"code": "error_code",
"message": "Тайлбар"
}
}| Code | HTTP | Тайлбар |
|---|---|---|
unauthorized | 401 | Token буруу эсвэл хугацаа дууссан |
invalid_client | 401 | Client ID / secret буруу |
insufficient_scope | 403 | Scope хүрэхгүй |
invalid_sad | 400 | SAD token буруу эсвэл хугацаа дууссан |
otp_required | 401 | OTP код шаардлагатай (илгээгдсэн) |
invalid_otp | 401 | OTP код буруу |
pin_required | 401 | PIN код шаардлагатай |
invalid_pin | 401 | PIN код буруу |
too_many_attempts | 429 | Оролдлого хэтэрсэн (15 мин хүлээх) |
rate_limited | 429 | Rate limit хэтэрсэн |
invalid_credential | 400 | Сертификат олдсонгүй эсвэл идэвхгүй |
| Endpoint | Тайлбар |
|---|---|
POST /ocsp | OCSP Responder (RFC 6960) |
GET /crl | CRL (DER format) |
GET /crl.pem | CRL (PEM format) |
GET /api/v1/crl/info | CRL metadata (JSON) |
Холбоо барих: dev@gesign.mn
Бусад: SES Policy · AES Policy · QES Policy