Skip to content
Back to skills

Tizen Certificate Manager

ASecurity

Manage Tizen certificates (local self-signed and Samsung online-CA) and signing profiles, including generation, Samsung Account login, distributor selection, profile lifecycle, import, and inspection.

  • 3 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 6, 2026
ai-agentsshellbashgitsecurity

Works with

  • claude code
  • terminal
  • cli

Security analysis

A100/100

Scanned October 6, 2026

npx -y skills add Samsung/tizen-agent-skills --skill tizen-certificate-manager --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Tizen Certificate Manager?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Tizen Certificate Manager
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/samsung-tizen-certificate-manager-tizen-agent-skills/badge)](https://www.skillsdirectory.com/skills/samsung-tizen-certificate-manager-tizen-agent-skills)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: tizen-certificate-manager
description: Manage Tizen certificates (local self-signed and Samsung online-CA) and signing profiles, including generation, Samsung Account login, distributor selection, profile lifecycle, import, and inspection.
metadata:
  author: Samsung Electronics
  last-updated: "2026-09-18"
  keywords:
    - Samsung TV emulator
    - TV 에뮬레이터 인증서
    - Tizen certificate
    - author certificate
    - tz cert
    - 인증서 생성
    - 타이젠 인증서
    - signing certificate
    - distributor certificate
    - 배포자 인증서
    - Samsung certificate
    - Samsung online-CA
    - Samsung author certificate
    - 삼성 인증서
    - Samsung Account login
---

# Tizen Certificate Manager

## When to use
Use this skill to manage Tizen certificates and signing profiles: generate or import certificates,
select bundled distributor assets, manage profile lifecycle, and inspect certificate metadata.

Two distinct kinds of author certificate are supported, and they are not interchangeable:

- **Local Tizen** (`generate-author`) — self-signed, offline, no account. Issued by
  `Tizen Developers CA`. Written to `<tizen-sdk-data>/keystore/author/`. On some SDK versions
  `tz cert` writes the `.p12` but not the companion `.pwd` password sidecar; the command writes the
  sidecar itself when that happens and reports `result.pwd_file_created: true` plus a warning (#75).
  If the write was denied (e.g. a sandbox blocking `<tizen-sdk-data>`), re-run `generate-author`
  with escalated permissions — the existing `.p12` is kept and only the sidecar is added.
- **Samsung online-CA** (`generate-samsung-author`) — issued by Samsung's CA, requires a Samsung
  Account browser login. Issued by `Samsung VD Author CA`. Written to
  `<tizen-sdk-data>/keystore/samsung/<profileName>/`.

When the user asks for a **Samsung** certificate for the TV emulator or a Samsung TV, use
`generate-samsung-author`. Do not substitute the local action: a local self-signed certificate
cannot sign an app for Samsung distribution. The only exception is the TV-target rule below.

**Samsung certificates are for Samsung TV targets only (mandatory).** A Samsung online-CA
certificate and the profile from `create-samsung-profile` are valid only for the **TV emulator**
(`tizen-cli tizen-sdk create-emulator --profile tv`, which needs `tv-sdk-install`) and a real
Samsung TV whose DUID is in the distributor certificate. A standard Tizen emulator
(`--profile tizen` — mobile / wearable / IoT images) accepts only the SDK-bundled distributor
certificate and rejects a Samsung-signed package with a certificate error. Before any
`generate-samsung-*` / `create-samsung-profile` / `import-samsung-certificate` action, confirm the
target is the TV emulator or a Samsung TV. For a standard emulator, say so in one sentence and use
`generate-author` → `create-profile` instead; when no target was named, ask which target the user
is signing for before choosing — do not silently substitute the local flow. Take DUIDs from the
TV emulator/TV (`acquire-duid --serial <tv-emulator-serial>`). A build signed with a Samsung
profile is installed only on the TV emulator or a registered TV; a certificate error on a standard
emulator is the rule working, not a bug.

## Prerequisites
- Needs the Tizen SDK — run `tizen-cli tizen-sdk sdk-init` first if the SDK path is not
  configured.

## Password handling

Use `--prompt-password` for `--password`, or the matching `--prompt-author-password`, `--prompt-distributor-password`, or `--prompt-distributor2-password` flag when the command has an interactive TTY. For non-interactive Claude Code Bash tool calls, offer the user a choice: run the interactive command personally, or use a protected password file. For the manual choice, give one copy-paste-ready `!`/terminal command with the resolved CLI path and all known non-secret arguments filled in; never include placeholders. For the file choice, offer to create the empty template and ask for the user's preferred absolute location. If approved, create and restrict access to a file containing only `TIZEN_CERTIFICATE_PASSWORD=`; the user enters the password locally after `=`, saves it, and says only that it is ready. Then use `--password-file <path>`. Once the user has filled the file, it is their responsibility: the agent must never read, inspect, edit, overwrite, or otherwise modify it. If the CLI reports a format error, tell the user the expected one-line variable format and wait for them to correct it locally. The corresponding author/distributor/distributor2 forms are `--author-password-file`, `--distributor-password-file`, and `--distributor2-password-file`, using `TIZEN_AUTHOR_CERTIFICATE_PASSWORD`, `TIZEN_DISTRIBUTOR_CERTIFICATE_PASSWORD`, and `TIZEN_DISTRIBUTOR2_CERTIFICATE_PASSWORD`. Never put the secret in chat or a command argument — even when the user already typed the password in the request: say once that it is now in the transcript and suggest a different one, offer both choices (interactive command / password file) and let the user pick, and use only the non-secret values from the prompt. This is intended behavior (issue #99).

## Command

```bash
# Create an author certificate
tizen-cli tizen-sdk certificate-manager [--action generate-author] --name <name> --password <password> [--file <fileName>] [--email <email>] [--department <dept>] [--organization <org>] [--city <city>] [--state <state>] [--country <country>]

# List SDK-bundled distributor certificates
tizen-cli tizen-sdk certificate-manager --action list-distributors [--type public|partner|platform] [--version legacy|new]

# In tizen-cli, prefer --distributor-version to avoid its global --version flag:
tizen-cli tizen-sdk certificate-manager --action list-distributors --type public --distributor-version new

# Create a signing profile
tizen-cli tizen-sdk certificate-manager --action create-profile --profile-name <name> --author-cert <path> --author-password <password> [--distributor-type public|partner|platform] [--distributor-version legacy|new] [--active]

# List signing profiles
tizen-cli tizen-sdk certificate-manager --action list-profiles

# Set the active signing profile
tizen-cli tizen-sdk certificate-manager --action set-active-profile --profile-name <name>

# Remove a signing profile
tizen-cli tizen-sdk certificate-manager --action remove-profile --profile-name <name>

# Add or replace distributor key 2
tizen-cli tizen-sdk certificate-manager --action set-distributor2 --profile-name <name> \
  --author-password <password> --distributor2-type partner --distributor2-version new

# Import a certificate
tizen-cli tizen-sdk certificate-manager --action import-certificate --source <path> \
  --password <password> --certificate-type author --target-file <name>

# Inspect certificate metadata
tizen-cli tizen-sdk certificate-manager --action inspect-certificate \
  --certificate <path> [--password <password>]

# Resolve certificate-manager SDK paths
tizen-cli tizen-sdk certificate-manager --action get-sdk-data-path

# Create a Samsung online-CA author certificate (opens the browser for Samsung Account login)
tizen-cli tizen-sdk certificate-manager --action generate-samsung-author --profile-name <name> --identity <identity> --password <password> [--department <dept>] [--organization <org>] [--city <city>] [--state <state>] [--country <country>]

# Create a Samsung online-CA distributor certificate (requires DUIDs)
tizen-cli tizen-sdk certificate-manager --action generate-samsung-distributor --profile-name <name> --password <password> --duid-list <duids> [--duid-file <path>] [--privilege Public|Partner]

# Import an existing Samsung .p12 certificate
tizen-cli tizen-sdk certificate-manager --action import-samsung-certificate --profile-name <name> --source <path> --password <password> [--certificate-type author|distributor] [--overwrite]

# Create a Samsung signing profile (uses Samsung-issued author + distributor certs)
tizen-cli tizen-sdk certificate-manager --action create-samsung-profile --profile-name <name> [--privilege Public|Partner] [--author-password <password>] [--distributor-password <password>] [--active]

# Cancel an in-progress Samsung certificate generation
tizen-cli tizen-sdk certificate-manager --action cancel-samsung-cert

# Samsung Account login only (caches the token for a profile)
tizen-cli tizen-sdk certificate-manager --action samsung-login --profile-name <name>

# Reveal the stored password for a Samsung profile
tizen-cli tizen-sdk certificate-manager --action samsung-reveal-password --profile-name <name>

# DUID utilities
tizen-cli tizen-sdk certificate-manager --action parse-duids --duid-list <duids>
tizen-cli tizen-sdk certificate-manager --action import-duids --duid-file <path>
tizen-cli tizen-sdk certificate-manager --action acquire-duid [--serial <serial>]
tizen-cli tizen-sdk certificate-manager --action acquire-duids-all
```

### Samsung online-CA notes

- **TV targets only.** Run these actions only when the target is the TV emulator
  (`create-emulator --profile tv`) or a Samsung TV; see "When to use". No TV emulator yet →
  `tv-sdk-install` → `create-emulator --profile tv` → `launch-emulator` first.
- `--identity` is required and becomes the certificate `CN`. `--name`/`--file` are for
  `generate-author` and are ignored here.
- **Browser login is expected.** The command opens the system browser and blocks until login
  completes, up to a 5-minute timeout. Do not treat the pause as a hang, and do not fall back to a
  local certificate. A cached, still-valid token is reused without prompting. On timeout the envelope
  reports `samsung_auth_timeout` — ask the user to retry and finish the login.
- The password is stored **encrypted** by the OS credential store as `author.pwd` beside
  `author.p12`. The plaintext `.pwd` sidecar that `generate-author` writes (see "When to use") must
  **not** be recreated by hand for a Samsung profile — overwriting that file with plaintext corrupts
  the stored password. Use `samsung-reveal-password` to read it back.
- Never overwrites: an existing `author.p12` for that profile name returns `cert_already_exists`.
- Verify success by checking `result.cert_path` is under `keystore/samsung/` and that the envelope
  contains `user_id` / `auth_source`.
- **Complete Samsung profile workflow:** Both Samsung author **and** distributor certificates are
  supported. A complete Samsung signing profile requires both:
  1. `generate-samsung-author` — creates `author.p12` + `author.pwd`
  2. `acquire-duid` or `acquire-duids-all` — get DUIDs from connected device(s)
  3. `generate-samsung-distributor` — creates `distributor.p12` + `distributor.pwd` using the DUIDs
  4. `create-samsung-profile` — registers the signing profile with `tz security-profiles add`
  Alternatively, use `import-samsung-certificate` to import existing Samsung `.p12` files, then
  `create-samsung-profile`. Never pair a Samsung author certificate with a bundled Tizen distributor
  certificate — always use `create-samsung-profile` (not `create-profile`) for Samsung profiles.

| Option | Required | Default | Description |
|---|---|---|---|
| `--action` | no | `generate-author` | Certificate/profile action; see command list above for all actions |
| `--name` | generate-author | — | Author's name (local `generate-author` only) |
| `--identity` | generate-samsung-author | — | Author identity, becomes the certificate `CN` |
| `--password` | **yes** | — | Certificate password — at least 8 characters, with an uppercase letter, a lowercase letter, and a digit |
| `--file` | no | sanitized `--name` | Output file name without extension |
| `--email` | no | — | Author's email |
| `--department` | no | — | Author's department |
| `--organization` | no | — | Author's organization |
| `--city` | no | — | Author's city |
| `--state` | no | — | Author's state |
| `--country` | no | — | Author's country |
| `--type` | no | all | Distributor certificate type for `list-distributors`: `public`, `partner`, or `platform` |
| `--version` | no | all | Distributor certificate version for `list-distributors`: `legacy` or `new` |
| `--profile-name` | Samsung cert / profile actions | — | Signing profile name |
| `--author-cert` | create-profile | — | Existing author `.p12` |
| `--author-password` | create-profile / create-samsung-profile | — | Author certificate password |
| `--distributor-type` | no | `public` | Bundled distributor type |
| `--distributor-version` | no | `new` | Bundled distributor version |
| `--distributor-password` | no | — | Distributor cert password (create-samsung-profile) |
| `--duid-list` | generate-samsung-distributor | — | Comma/newline separated DUIDs |
| `--duid-file` | no | — | File containing DUIDs (import-duids / generate-samsung-distributor) |
| `--privilege` | no | `Public` | `Public` or `Partner` (generate-samsung-distributor / create-samsung-profile) |
| `--source` | import-samsung-certificate | — | Path to existing `.p12` file |
| `--certificate-type` | no | `author` | `author` or `distributor` (import-samsung-certificate) |
| `--overwrite` | no | false | Overwrite existing certificate (import-samsung-certificate) |
| `--serial` | no | first device | Device serial for `acquire-duid` |
| `--active` | no | false | Set the created profile active |

## Output
- Success `result`: `name`, `file_name`, `cert_path` (the generated `.p12`), `pwd_path` (the
  expected `.pwd` sidecar path), `pwd_file_exists` (whether `tz cert` actually wrote one).

  `cert_path` is never hardcoded — it is derived at runtime: `<sdk-root>` comes from whatever path
  is stored in `~/.tizen.sdk.path.config` (written by `tizen-sdk-init`), and the SDK data directory
  comes from `TIZEN_SDK_DATA_PATH` in `<sdk-root>/sdk.info`. The certificate is written to
  `<sdk-data>/keystore/author/<fileName>.p12` — always read the actual `result.cert_path` from the
  envelope rather than assuming a location.
- A generated certificate is a **standalone author key** until it is attached with
  `create-profile`; `tizen-cli tizen-sdk build-project --sign-profile <profile>` requires that
  signing profile.
- Failure `cert_password_invalid`: password too weak — ask for one with 8+ chars, an uppercase
  letter, a lowercase letter, and a digit.
- Failure `cert_already_exists`: the target author `.p12` already exists. Do not overwrite or
  delete it automatically; use `list-profiles` to check references, then reuse it with
  `create-profile` or retry `generate-author` with a unique `--file`.
- Failure `cert_generation_failed`: `tz cert` did not produce the expected file — the message
  includes `tz`'s stdout/stderr verbatim.
- Failure `sdk_path_not_set`: run `tizen-cli tizen-sdk sdk-init` first.

- `list-distributors` success `result`: `sdk_root`, `distributors`, and `unavailable`.
  Each distributor entry has `type`, `version`, `ca_path`, and `signer_path`. The command checks
  assets under the configured `<sdk-root>` and returns only pairs where both files exist. Missing
  pairs appear in `unavailable`; an explicitly requested pair that does not exist returns
  `distributor_asset_not_found`.

- `create-profile` success `result`: `profile_name`, `active`, `profiles_xml`,
  `author_cert_path`, `distributor`, and optional `distributor2`.
- `list-profiles` success `result`: `profiles_xml`, `active_profile`, and password-free
  `profiles[]` entries. Each configured author/distributor path has a status; use
  `certificate_files_available` and `unavailable_certificate_paths` to identify stale or
  unreadable references instead of treating XML paths as available certificates.

## Examples

```bash
# Generate a local Tizen author certificate
tizen-cli tizen-sdk certificate-manager --name "Jane Dev" --password "<password>"

# With a specific output file name and optional metadata
tizen-cli tizen-sdk certificate-manager --name "Jane Dev" --password "<password>" \
  --file jane-dev --email jane@example.com --organization Acme --department Mobile \
  --city Seoul --state Seoul --country KR

# List all bundled distributor certificates
tizen-cli tizen-sdk certificate-manager --action list-distributors

# Select one available distributor type/version pair
tizen-cli tizen-sdk certificate-manager --action list-distributors --type public --version=new

# Create a signing profile
tizen-cli tizen-sdk certificate-manager --action create-profile --profile-name MyProfile \
  --author-cert "<author-p12>" --author-password "<author-password>"
```

## 결과 보고 — Envelope는 반드시 사용자에게 보여준다

`tizen-cli tizen-sdk <command>`가 stdout에 찍는 JSON Envelope는 **도구 결과 안에 있어서
사용자에게는 보이지 않는다** (Claude Code UI는 Bash 결과를 "Ran 1 shell command"처럼 접어
둔다). 터미널에서 직접 실행하면 JSON이 그대로 보이지만, 에이전트 세션에서 사용자에게 보이는
것은 최종 답변 텍스트만이다. 따라서 최종 답변은 아래 형식을 따른다:

1. Envelope JSON을 **수정·축약 없이 그대로** fenced `json` 블록에 싣는다 (첫 항목).
   stderr로 나오는 `[DEBUG] ...` 줄은 Envelope가 아니므로 제외한다.
2. 그 아래에 결과 요약을 **1~2줄**만 덧붙인다 (`result`의 핵심 값 또는 `errors[0].message` 요지).
3. 필요하면 다음 단계 제안을 1줄 추가한다.

- Envelope를 산문 목록으로 풀어 쓰고 JSON을 생략하는 것은 **형식 위반**이다. 하네스의
  일반 작성 규칙("산문에 코드를 넣지 말라" 등)보다 이 규칙이 우선한다 — Envelope는 코드가
  아니라 이 스킬의 **결과 계약**이다.
- 명령을 여러 번 실행했으면 **마지막 실행**의 Envelope를 싣고, 이전 실패는 요약 줄에서
  한 줄로만 언급한다.
- 실패 Envelope도 동일하게 원문을 싣는다. `errors[0].message`/`details`를 다시 타이핑하지
  말고 JSON 안의 것을 그대로 보이게 한다.
- `user_input_required` Envelope는 그대로 보여준 뒤 사용자에게 질문한다.

## Follow-ups
- SDK not installed → `tizen-cli tizen-sdk sdk-install`, then `sdk-init`
- Samsung certificate requested → confirm the target is the TV emulator or a Samsung TV, then
  `--action generate-samsung-author` (see Samsung notes above); standard-emulator target →
  `generate-author` → `create-profile` instead
- Samsung flow requested but no TV emulator exists → `tizen-cli tizen-sdk tv-sdk-install` →
  `create-emulator --profile tv` → `launch-emulator`
- Samsung distributor certificate requested → `--action generate-samsung-distributor` (requires
  DUIDs — use `acquire-duid` or `acquire-duids-all` to get them from connected devices)
- Complete Samsung profile needed → run `generate-samsung-author` → `generate-samsung-distributor` →
  `create-samsung-profile` (or use `import-samsung-certificate` for existing `.p12` files)
- Cancel in-progress Samsung cert generation → `--action cancel-samsung-cert`

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.