<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://ilianko.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Anko</id>
	<title>Ilianko - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://ilianko.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Anko"/>
	<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Special:Contributions/Anko"/>
	<updated>2026-10-30T14:30:30Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>https://ilianko.com/index.php?title=Category:IaC&amp;diff=6285</id>
		<title>Category:IaC</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Category:IaC&amp;diff=6285"/>
		<updated>2026-10-27T12:01:13Z</updated>

		<summary type="html">&lt;p&gt;Anko: Created page with &amp;quot;Category:Azure Category:AWS Category:Terraform&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Azure]]&lt;br /&gt;
[[Category:AWS]]&lt;br /&gt;
[[Category:Terraform]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Category:Devops_Tools&amp;diff=6284</id>
		<title>Category:Devops Tools</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Category:Devops_Tools&amp;diff=6284"/>
		<updated>2026-10-27T12:00:16Z</updated>

		<summary type="html">&lt;p&gt;Anko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==[[Github CLI (gh)]]==&lt;br /&gt;
 gh --version&lt;br /&gt;
 gh auth login&lt;br /&gt;
 gh auth status&lt;br /&gt;
 gh repo clone OWNER/REPO&lt;br /&gt;
 gh repo create&lt;br /&gt;
 gh repo list&lt;br /&gt;
 gh repo view --web&lt;br /&gt;
&lt;br /&gt;
[[Category:PKI]]&lt;br /&gt;
[[Category:IaC]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Temporary_Let%27s_Encrypt_certificate&amp;diff=6283</id>
		<title>Temporary Let&#039;s Encrypt certificate</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Temporary_Let%27s_Encrypt_certificate&amp;diff=6283"/>
		<updated>2026-10-27T11:57:50Z</updated>

		<summary type="html">&lt;p&gt;Anko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Procedure to issue a temporary certificate signed by Let&#039;s Encrypt for &amp;lt;code&amp;gt;tst.lets.ef3.in&amp;lt;/code&amp;gt; on Kubernetes with Istio.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prerequisites:&#039;&#039;&#039; Istio with configured gateway (domain) and virtualservice (virtualhost).&lt;br /&gt;
&lt;br /&gt;
== Create temporary instance for certbot ==&lt;br /&gt;
Save as &amp;lt;code&amp;gt;temp-letsencrypt-server.yaml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
kind: Pod&lt;br /&gt;
metadata:&lt;br /&gt;
  name: certbot-temp&lt;br /&gt;
  namespace: ls-lets-website-tst&lt;br /&gt;
  labels:&lt;br /&gt;
    app: certbot-temp&lt;br /&gt;
spec:&lt;br /&gt;
  containers:&lt;br /&gt;
  - name: nginx&lt;br /&gt;
    image: nginx&lt;br /&gt;
    ports:&lt;br /&gt;
    - containerPort: 80&lt;br /&gt;
---&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
kind: Service&lt;br /&gt;
metadata:&lt;br /&gt;
  name: certbot-temp-svc&lt;br /&gt;
  namespace: ls-lets-website-tst&lt;br /&gt;
spec:&lt;br /&gt;
  selector:&lt;br /&gt;
    app: certbot-temp&lt;br /&gt;
  ports:&lt;br /&gt;
  - port: 80&lt;br /&gt;
    targetPort: 80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Apply it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl -n ls-lets-website-tst apply -f temp-letsencrypt-server.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Route the acme-challenge to the certbot instance ==&lt;br /&gt;
The virtualservice is an Istio entity. Add this match to the routes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl -n ls-lets-website-tst edit virtualservice ls-lets-vs&lt;br /&gt;
&lt;br /&gt;
  - match:&lt;br /&gt;
    - uri:&lt;br /&gt;
        prefix: /.well-known/acme-challenge/&lt;br /&gt;
    route:&lt;br /&gt;
    - destination:&lt;br /&gt;
        host: certbot-temp-svc&lt;br /&gt;
        port:&lt;br /&gt;
          number: 80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create certificate ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl exec -it certbot-temp -n ls-lets-website-tst -- bash&lt;br /&gt;
&lt;br /&gt;
# Inside the certbot pod: install certbot&lt;br /&gt;
apt-get update &amp;amp;&amp;amp; apt-get install -y certbot&lt;br /&gt;
&lt;br /&gt;
# Inside the pod: request the certificate&lt;br /&gt;
certbot certonly --webroot -w /usr/share/nginx/html -d tst.lets.ef3.in&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Copy the new certificate and the key ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl exec -n &amp;quot;ls-lets-website-tst&amp;quot; &amp;quot;certbot-temp&amp;quot; -- cat /etc/letsencrypt/live/tst.lets.ef3.in/fullchain.pem &amp;gt; tst.lets.fullchain.pem&lt;br /&gt;
&lt;br /&gt;
kubectl exec -n &amp;quot;ls-lets-website-tst&amp;quot; &amp;quot;certbot-temp&amp;quot; -- cat /etc/letsencrypt/live/tst.lets.ef3.in/privkey.pem &amp;gt; tst.lets.key.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Check the certificate:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openssl x509 --noout -in tst.lets.fullchain.pem --text&lt;br /&gt;
&lt;br /&gt;
Certificate:&lt;br /&gt;
    Data:&lt;br /&gt;
        Version: 3 (0x2)&lt;br /&gt;
        Signature Algorithm: ecdsa-with-SHA384&lt;br /&gt;
        Issuer: C = US, O = Let&#039;s Encrypt, CN = YE1&lt;br /&gt;
        Validity&lt;br /&gt;
            Not Before: Oct 13 13:01:42 2026 GMT&lt;br /&gt;
            Not After : Jan 11 13:01:41 2027 GMT&lt;br /&gt;
        Subject: CN = tst.lets.ef3.in&lt;br /&gt;
        Subject Public Key Info:&lt;br /&gt;
            Public Key Algorithm: id-ecPublicKey&lt;br /&gt;
                Public-Key: (256 bit)&lt;br /&gt;
                ASN1 OID: prime256v1&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create Istio secret ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl create secret tls tst.lets -n istio-ingress --key=tst.lets.key.pem --cert=tst.lets.fullchain.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Enable HTTPS at the gateway ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl -n ls-lets-website-tst edit gateway ls-lets-gateway&lt;br /&gt;
&lt;br /&gt;
  - hosts:&lt;br /&gt;
    - tst.lets.ef3.in&lt;br /&gt;
    port:&lt;br /&gt;
      name: https&lt;br /&gt;
      number: 443&lt;br /&gt;
      protocol: HTTPS&lt;br /&gt;
    tls:&lt;br /&gt;
      credentialName: tst.lets&lt;br /&gt;
      mode: SIMPLE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Clean the environment ==&lt;br /&gt;
* Remove the locally saved *.pem files&lt;br /&gt;
* Remove the routing to the certbot pod&lt;br /&gt;
* Delete the certbot pod&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm *pem&lt;br /&gt;
kubectl -n ls-lets-website-tst edit virtualservice ls-lets-vs&lt;br /&gt;
kubectl -n ls-lets-website-tst delete -f temp-letsencrypt-server.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Security]]&lt;br /&gt;
[[Category:Kubernetes]]&lt;br /&gt;
[[Category:PKI]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=MediaWiki:Sidebar&amp;diff=6282</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=MediaWiki:Sidebar&amp;diff=6282"/>
		<updated>2026-10-27T11:54:02Z</updated>

		<summary type="html">&lt;p&gt;Anko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** CV|CV&lt;br /&gt;
** Category:Devops Tools|Devops tools&lt;br /&gt;
** randompage-url|randompage&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=MediaWiki:Sidebar&amp;diff=6281</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=MediaWiki:Sidebar&amp;diff=6281"/>
		<updated>2026-10-27T11:52:57Z</updated>

		<summary type="html">&lt;p&gt;Anko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** CV|CV&lt;br /&gt;
** Category:Devops tools|Devops Tools&lt;br /&gt;
** randompage-url|randompage&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Category:Devops_Tools&amp;diff=6280</id>
		<title>Category:Devops Tools</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Category:Devops_Tools&amp;diff=6280"/>
		<updated>2026-10-27T11:51:55Z</updated>

		<summary type="html">&lt;p&gt;Anko: Created page with &amp;quot; ==Github CLI (gh)==  gh --version  gh auth login  gh auth status  gh repo clone OWNER/REPO  gh repo create  gh repo list  gh repo view --web&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
==[[Github CLI (gh)]]==&lt;br /&gt;
 gh --version&lt;br /&gt;
 gh auth login&lt;br /&gt;
 gh auth status&lt;br /&gt;
 gh repo clone OWNER/REPO&lt;br /&gt;
 gh repo create&lt;br /&gt;
 gh repo list&lt;br /&gt;
 gh repo view --web&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Github_CLI_(gh)&amp;diff=6279</id>
		<title>Github CLI (gh)</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Github_CLI_(gh)&amp;diff=6279"/>
		<updated>2026-10-27T11:51:30Z</updated>

		<summary type="html">&lt;p&gt;Anko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;GitHub CLI&#039;&#039;&#039; (&#039;&#039;gh&#039;&#039;) is GitHub&#039;s official command-line tool that brings pull requests, issues, GitHub Actions workflows, releases, gists, and other GitHub features directly to the terminal.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&#039;&#039;gh&#039;&#039; allows developers to interact with GitHub.com and GitHub Enterprise Server without leaving the command line. It automatically detects the current Git repository context, handles authentication and SSH/HTTPS Git credential configuration, and provides both interactive prompts and scriptable flags (including JSON output with &#039;&#039;--json&#039;&#039; and &#039;&#039;--jq&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
* &#039;&#039;&#039;Windows (winget / choco / scoop):&#039;&#039;&#039;&lt;br /&gt;
  winget install --id GitHub.cli&lt;br /&gt;
  choco install gh&lt;br /&gt;
* &#039;&#039;&#039;macOS (Homebrew):&#039;&#039;&#039;&lt;br /&gt;
  brew install gh&lt;br /&gt;
* &#039;&#039;&#039;Linux (Debian / Ubuntu):&#039;&#039;&#039;&lt;br /&gt;
  sudo apt update&lt;br /&gt;
  sudo apt install gh&lt;br /&gt;
&lt;br /&gt;
=== Update ===&lt;br /&gt;
 [[winget]] upgrade --id GitHub.cli&lt;br /&gt;
&lt;br /&gt;
== Common Commands ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Check installation&lt;br /&gt;
gh --version&lt;br /&gt;
&lt;br /&gt;
# Authenticate&lt;br /&gt;
gh auth login&lt;br /&gt;
&lt;br /&gt;
# Check authentication&lt;br /&gt;
gh auth status&lt;br /&gt;
&lt;br /&gt;
# Clone a repository&lt;br /&gt;
gh repo clone OWNER/REPO&lt;br /&gt;
&lt;br /&gt;
# Create a repository&lt;br /&gt;
gh repo create&lt;br /&gt;
&lt;br /&gt;
# List repositories&lt;br /&gt;
gh repo list&lt;br /&gt;
&lt;br /&gt;
# Open current repo in browser&lt;br /&gt;
gh repo view --web&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Authentication ===&lt;br /&gt;
  gh auth login       # Interactive login to GitHub.com or GitHub Enterprise&lt;br /&gt;
  gh auth status      # View active authentication state&lt;br /&gt;
  gh auth setup-git   # Configure git to use gh as a credential helper&lt;br /&gt;
  gh auth token       # Print the current authentication token&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Repositories (gh repo) ===&lt;br /&gt;
  gh repo clone OWNER/REPO            # Clone a repository&lt;br /&gt;
  gh repo create                      # Create a new repository on GitHub&lt;br /&gt;
  gh repo fork                        # Fork an existing repository&lt;br /&gt;
  gh repo view --web                  # Open the repository in the browser&lt;br /&gt;
&lt;br /&gt;
=== Pull Requests (gh pr) ===&lt;br /&gt;
  gh pr list                          # List open pull requests&lt;br /&gt;
  gh pr create --fill                 # Create a pull request using commit info&lt;br /&gt;
  gh pr checkout NUMBER               # Check out a pull request branch locally&lt;br /&gt;
  gh pr status                        # Show status of relevant pull requests&lt;br /&gt;
  gh pr checks                        # View CI/CD check statuses for a PR&lt;br /&gt;
  gh pr review --approve              # Approve the current pull request&lt;br /&gt;
  gh pr merge --squash --delete-branch # Squash-merge and delete branch&lt;br /&gt;
&lt;br /&gt;
=== Issues (gh issue) ===&lt;br /&gt;
  gh issue list                       # List issues in the repository&lt;br /&gt;
  gh issue create                     # Create a new issue interactively&lt;br /&gt;
  gh issue view NUMBER               # View issue details and comments&lt;br /&gt;
  gh issue develop NUMBER --checkout  # Create and check out a branch linked to an issue&lt;br /&gt;
  gh issue close NUMBER               # Close an issue&lt;br /&gt;
&lt;br /&gt;
=== GitHub Actions (gh run and gh workflow) ===&lt;br /&gt;
  gh workflow list                    # List workflows in the repository&lt;br /&gt;
  gh workflow run WORKFLOW_NAME       # Trigger a workflow_dispatch event&lt;br /&gt;
  gh run list                         # List recent workflow runs&lt;br /&gt;
  gh run watch                        # Watch an in-progress workflow run live&lt;br /&gt;
  gh run view --log-failed            # View logs for failed steps in a run&lt;br /&gt;
&lt;br /&gt;
=== Releases, Gists and Codespaces ===&lt;br /&gt;
  gh release list                     # List repository releases&lt;br /&gt;
  gh release create v1.0.0 --generate-notes # Create a release with auto-generated notes&lt;br /&gt;
  gh gist create FILE                 # Create a new GitHub Gist&lt;br /&gt;
  gh codespace list                   # List active GitHub Codespaces&lt;br /&gt;
&lt;br /&gt;
=== update ===&lt;br /&gt;
&lt;br /&gt;
== Scripting, REST/GraphQL API and Extensions ==&lt;br /&gt;
* &#039;&#039;&#039;Structured JSON and jq filtering:&#039;&#039;&#039;&lt;br /&gt;
  gh pr list --json number,title,author&lt;br /&gt;
* &#039;&#039;&#039;Direct GitHub API requests (gh api):&#039;&#039;&#039;&lt;br /&gt;
  gh api repos/{owner}/{repo}/releases/latest&lt;br /&gt;
  gh api graphql -f query=&#039;{ viewer { login } }&#039;&lt;br /&gt;
* &#039;&#039;&#039;Aliases and Extensions:&#039;&#039;&#039;&lt;br /&gt;
  gh alias set co &#039;pr checkout&#039;&lt;br /&gt;
  gh extension search&lt;br /&gt;
  gh extension install dlvhdr/gh-dash&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
* [https://cli.github.com/ Official GitHub CLI Website]&lt;br /&gt;
* [https://cli.github.com/manual/ GitHub CLI Manual and Command Reference]&lt;br /&gt;
* [https://github.com/cli/cli GitHub CLI Source Repository (cli/cli)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Devops Tools]]&lt;br /&gt;
[[Category:CLI]]&lt;br /&gt;
[[Category:Git]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=MediaWiki:Sidebar&amp;diff=6278</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=MediaWiki:Sidebar&amp;diff=6278"/>
		<updated>2026-10-27T11:50:42Z</updated>

		<summary type="html">&lt;p&gt;Anko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** CV|CV&lt;br /&gt;
** Category:Devops tools|Devops tools&lt;br /&gt;
** randompage-url|randompage&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=MediaWiki:Common.css&amp;diff=6277</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=MediaWiki:Common.css&amp;diff=6277"/>
		<updated>2026-10-27T10:07:31Z</updated>

		<summary type="html">&lt;p&gt;Anko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
#column-content { margin-left: -16em }&lt;br /&gt;
#column-content #content { margin-left: 16em }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Scale up all Math extension formulas */&lt;br /&gt;
.mwe-math-element {&lt;br /&gt;
    font-size: 140% !important; /* Increases the &#039;ex&#039; unit size the SVGs use */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mwe-math-element img {&lt;br /&gt;
    transform: scale(1.4);&lt;br /&gt;
    transform-origin: center left;&lt;br /&gt;
    margin-right: 10px; /* Prevents the scaled image from hitting the next word */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide &amp;quot;Wiki tools&amp;quot; menu */&lt;br /&gt;
#p-tb { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
/* Hide &amp;quot;Page tools&amp;quot; menu */&lt;br /&gt;
#vector-page-tools { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
/* Hide &amp;quot;More&amp;quot; menu */&lt;br /&gt;
#p-cactions { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
/* Force the bottom category box to show */&lt;br /&gt;
#catlinks {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Force the sidebar category box to show */&lt;br /&gt;
#catlinks-sidebar {&lt;br /&gt;
    display: block !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Category:PKI&amp;diff=6276</id>
		<title>Category:PKI</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Category:PKI&amp;diff=6276"/>
		<updated>2026-10-27T10:03:43Z</updated>

		<summary type="html">&lt;p&gt;Anko: Created page with &amp;quot;.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Category:Security&amp;diff=6275</id>
		<title>Category:Security</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Category:Security&amp;diff=6275"/>
		<updated>2026-10-27T10:03:29Z</updated>

		<summary type="html">&lt;p&gt;Anko: Created page with &amp;quot;.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=MediaWiki:Common.css&amp;diff=6274</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=MediaWiki:Common.css&amp;diff=6274"/>
		<updated>2026-10-27T10:00:04Z</updated>

		<summary type="html">&lt;p&gt;Anko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
#column-content { margin-left: -16em }&lt;br /&gt;
#column-content #content { margin-left: 16em }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* Scale up all Math extension formulas */&lt;br /&gt;
.mwe-math-element {&lt;br /&gt;
    font-size: 140% !important; /* Increases the &#039;ex&#039; unit size the SVGs use */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mwe-math-element img {&lt;br /&gt;
    transform: scale(1.4);&lt;br /&gt;
    transform-origin: center left;&lt;br /&gt;
    margin-right: 10px; /* Prevents the scaled image from hitting the next word */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide &amp;quot;Wiki tools&amp;quot; menu */&lt;br /&gt;
#p-tb { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
/* Hide &amp;quot;Page tools&amp;quot; menu */&lt;br /&gt;
#vector-page-tools { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
/* Hide &amp;quot;More&amp;quot; menu */&lt;br /&gt;
#p-cactions { display: none !important; }&lt;br /&gt;
&lt;br /&gt;
#catlinks a.new { &lt;br /&gt;
    display: inline !important; &lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Temporary_Let%27s_Encrypt_certificate&amp;diff=6273</id>
		<title>Temporary Let&#039;s Encrypt certificate</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Temporary_Let%27s_Encrypt_certificate&amp;diff=6273"/>
		<updated>2026-10-27T09:53:09Z</updated>

		<summary type="html">&lt;p&gt;Anko: Category Certificate -&amp;gt; PKI&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Procedure to issue a temporary certificate signed by Let&#039;s Encrypt for &amp;lt;code&amp;gt;tst.lets.ef3.in&amp;lt;/code&amp;gt; on Kubernetes with Istio.&lt;br /&gt;
&lt;br /&gt;
== Create temporary instance for certbot ==&lt;br /&gt;
Save as &amp;lt;code&amp;gt;temp-letsencrypt-server.yaml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
kind: Pod&lt;br /&gt;
metadata:&lt;br /&gt;
  name: certbot-temp&lt;br /&gt;
  namespace: ls-lets-website-tst&lt;br /&gt;
  labels:&lt;br /&gt;
    app: certbot-temp&lt;br /&gt;
spec:&lt;br /&gt;
  containers:&lt;br /&gt;
  - name: nginx&lt;br /&gt;
    image: nginx&lt;br /&gt;
    ports:&lt;br /&gt;
    - containerPort: 80&lt;br /&gt;
---&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
kind: Service&lt;br /&gt;
metadata:&lt;br /&gt;
  name: certbot-temp-svc&lt;br /&gt;
  namespace: ls-lets-website-tst&lt;br /&gt;
spec:&lt;br /&gt;
  selector:&lt;br /&gt;
    app: certbot-temp&lt;br /&gt;
  ports:&lt;br /&gt;
  - port: 80&lt;br /&gt;
    targetPort: 80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Apply it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl -n ls-lets-website-tst apply -f temp-letsencrypt-server.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Route the acme-challenge to the certbot instance ==&lt;br /&gt;
The virtualservice is an Istio entity. Add this match to the routes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl -n ls-lets-website-tst edit virtualservice ls-lets-vs&lt;br /&gt;
&lt;br /&gt;
  - match:&lt;br /&gt;
    - uri:&lt;br /&gt;
        prefix: /.well-known/acme-challenge/&lt;br /&gt;
    route:&lt;br /&gt;
    - destination:&lt;br /&gt;
        host: certbot-temp-svc&lt;br /&gt;
        port:&lt;br /&gt;
          number: 80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create certificate ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl exec -it certbot-temp -n ls-lets-website-tst -- bash&lt;br /&gt;
&lt;br /&gt;
# Inside the certbot pod: install certbot&lt;br /&gt;
apt-get update &amp;amp;&amp;amp; apt-get install -y certbot&lt;br /&gt;
&lt;br /&gt;
# Inside the pod: request the certificate&lt;br /&gt;
certbot certonly --webroot -w /usr/share/nginx/html -d tst.lets.ef3.in&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Copy the new certificate and the key ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl exec -n &amp;quot;ls-lets-website-tst&amp;quot; &amp;quot;certbot-temp&amp;quot; -- cat /etc/letsencrypt/live/tst.lets.ef3.in/fullchain.pem &amp;gt; tst.lets.fullchain.pem&lt;br /&gt;
&lt;br /&gt;
kubectl exec -n &amp;quot;ls-lets-website-tst&amp;quot; &amp;quot;certbot-temp&amp;quot; -- cat /etc/letsencrypt/live/tst.lets.ef3.in/privkey.pem &amp;gt; tst.lets.key.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Check the certificate:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openssl x509 --noout -in tst.lets.fullchain.pem --text&lt;br /&gt;
&lt;br /&gt;
Certificate:&lt;br /&gt;
    Data:&lt;br /&gt;
        Version: 3 (0x2)&lt;br /&gt;
        Signature Algorithm: ecdsa-with-SHA384&lt;br /&gt;
        Issuer: C = US, O = Let&#039;s Encrypt, CN = YE1&lt;br /&gt;
        Validity&lt;br /&gt;
            Not Before: Oct 13 13:01:42 2026 GMT&lt;br /&gt;
            Not After : Jan 11 13:01:41 2027 GMT&lt;br /&gt;
        Subject: CN = tst.lets.ef3.in&lt;br /&gt;
        Subject Public Key Info:&lt;br /&gt;
            Public Key Algorithm: id-ecPublicKey&lt;br /&gt;
                Public-Key: (256 bit)&lt;br /&gt;
                ASN1 OID: prime256v1&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create Istio secret ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl create secret tls tst.lets -n istio-ingress --key=tst.lets.key.pem --cert=tst.lets.fullchain.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Enable HTTPS at the gateway ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl -n ls-lets-website-tst edit gateway ls-lets-gateway&lt;br /&gt;
&lt;br /&gt;
  - hosts:&lt;br /&gt;
    - tst.lets.ef3.in&lt;br /&gt;
    port:&lt;br /&gt;
      name: https&lt;br /&gt;
      number: 443&lt;br /&gt;
      protocol: HTTPS&lt;br /&gt;
    tls:&lt;br /&gt;
      credentialName: tst.lets&lt;br /&gt;
      mode: SIMPLE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Clean the environment ==&lt;br /&gt;
* Remove the locally saved *.pem files&lt;br /&gt;
* Remove the routing to the certbot pod&lt;br /&gt;
* Delete the certbot pod&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm *pem&lt;br /&gt;
kubectl -n ls-lets-website-tst edit virtualservice ls-lets-vs&lt;br /&gt;
kubectl -n ls-lets-website-tst delete -f temp-letsencrypt-server.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Security]]&lt;br /&gt;
[[Category:Kubernetes]]&lt;br /&gt;
[[Category:PKI]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Create_CA_with_openssl&amp;diff=6272</id>
		<title>Create CA with openssl</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Create_CA_with_openssl&amp;diff=6272"/>
		<updated>2026-10-27T09:53:08Z</updated>

		<summary type="html">&lt;p&gt;Anko: Category Certificate -&amp;gt; PKI&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating a certification authority ==&lt;br /&gt;
&lt;br /&gt;
Certificate Authority - an organization that issues digital certificates&lt;br /&gt;
&lt;br /&gt;
===Creating the directory structure===&lt;br /&gt;
 mkdir CA&lt;br /&gt;
 cd CA&lt;br /&gt;
 mkdir certs crl newcerts private&lt;br /&gt;
 chmod 700 private&lt;br /&gt;
 touch index.txt&lt;br /&gt;
 echo 1000 &amp;gt; serial&lt;br /&gt;
 &lt;br /&gt;
index.txt, serial - list of the certificates&lt;br /&gt;
&lt;br /&gt;
===Configuration===&lt;br /&gt;
 cp /etc/ssl/openssl.cnf ./&lt;br /&gt;
 nano openssl.cnf&lt;br /&gt;
&lt;br /&gt;
In openssl.conf, the path to the CA directory must be set in [ CA_default ]&lt;br /&gt;
Example: dir=/home/mrezhi/CA&lt;br /&gt;
 [ CA_default ]&lt;br /&gt;
 dir=/home/mrezhi/CA&lt;br /&gt;
&lt;br /&gt;
 [ usr_cert ]&lt;br /&gt;
 # These extensions are added when &#039;ca&#039; signs a request.&lt;br /&gt;
 basicConstraints=CA:FALSE&lt;br /&gt;
 keyUsage = nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
 nsComment = &amp;quot;OpenSSL Generated Certificate&amp;quot;&lt;br /&gt;
 subjectKeyIdentifier=hash&lt;br /&gt;
 authorityKeyIdentifier=keyid,issuer&lt;br /&gt;
&lt;br /&gt;
 [ v3_ca ]&lt;br /&gt;
 # Extensions for a typical CA&lt;br /&gt;
 subjectKeyIdentifier=hash&lt;br /&gt;
 authorityKeyIdentifier=keyid:always,issuer&lt;br /&gt;
 basicConstraints = CA:true&lt;br /&gt;
 keyUsage = cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 [ policy_match ]&lt;br /&gt;
 countryName             = match&lt;br /&gt;
 stateOrProvinceName     = supplied&lt;br /&gt;
 organizationName        = supplied&lt;br /&gt;
 organizationalUnitName  = optional&lt;br /&gt;
 commonName              = supplied&lt;br /&gt;
 emailAddress            = optional&lt;br /&gt;
&lt;br /&gt;
===Generating the private key===&lt;br /&gt;
 openssl genrsa -aes256 -out private/ca.key.pem 4096&lt;br /&gt;
&lt;br /&gt;
aes256 - encrypts the private key&lt;br /&gt;
&lt;br /&gt;
===Generating the CA certificate===&lt;br /&gt;
&lt;br /&gt;
 openssl req -config openssl.cnf \&lt;br /&gt;
  -new -x509 -days 3650 \&lt;br /&gt;
  -key private/ca.key.pem \&lt;br /&gt;
  -sha256 -extensions v3_ca \&lt;br /&gt;
  -out certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
The file is read-only&lt;br /&gt;
 chmod 444 certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
==Generating and signing certificates==&lt;br /&gt;
&lt;br /&gt;
===Private key===&lt;br /&gt;
 openssl genrsa -out private/student.tugab.bg.key.pem 4096&lt;br /&gt;
 chmod 400 student.tugab.bg.key.pem&lt;br /&gt;
&lt;br /&gt;
===Certificate signing request===&lt;br /&gt;
 openssl req -config openssl.cnf \&lt;br /&gt;
  -sha256 -new -key private/student.tugab.bg.key.pem \&lt;br /&gt;
  -out certs/student.tugab.bg.csr.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
 openssl req -newkey rsa:2048 -keyout private/domain1.tugab.key -out certs/domain1.tugab.csr -config ./openssl.cnf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Signing the certificate signing request===&lt;br /&gt;
&lt;br /&gt;
 openssl ca -config openssl.cnf \&lt;br /&gt;
  -keyfile private/ca.key.pem \&lt;br /&gt;
  -cert certs/ca.cert.pem \&lt;br /&gt;
  -extensions usr_cert -notext -md sha256 \&lt;br /&gt;
  -in certs/student.tugab.bg.csr.pem \&lt;br /&gt;
  -out certs/student.tugab.bg.cert.pem&lt;br /&gt;
&lt;br /&gt;
==Configuring a web server==&lt;br /&gt;
&lt;br /&gt;
*Import a Linux/Debian virtual machine&lt;br /&gt;
*Copy the key pair to the hosting machine (FileZilla can be used)&lt;br /&gt;
*Install apache2&lt;br /&gt;
 apt-get install apache2&lt;br /&gt;
*Enable the ssl module&lt;br /&gt;
 a2enmod ssl&lt;br /&gt;
*Enable https&lt;br /&gt;
** nano /etc/apache2/ports.conf&lt;br /&gt;
** cp /etc/apache2/sites-available/default-ssl /etc/apache2/sites-enabled&lt;br /&gt;
** nano /etc/apache2/sites-enabled/default-ssl , set the paths to the certificates&lt;br /&gt;
&lt;br /&gt;
===Browser===&lt;br /&gt;
&lt;br /&gt;
Add the generated root certificate to the built-in certificates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Generate Server Certificate Commands==&lt;br /&gt;
&lt;br /&gt;
*Access the server&lt;br /&gt;
 ssh hq@ca-in-hq.ef3.local&lt;br /&gt;
&lt;br /&gt;
*Root user and the configuration folder&lt;br /&gt;
 su&lt;br /&gt;
 cd /root/ca&lt;br /&gt;
&lt;br /&gt;
*Define the FQDN&lt;br /&gt;
 FQDN=xxx.ef3.local&lt;br /&gt;
&lt;br /&gt;
*Generate the key. The key has no password. Length 4096 bits.&lt;br /&gt;
 openssl genrsa -out private/$FQDN.key.pem 4096&lt;br /&gt;
 chmod 400 private/$FQDN.key.pem &lt;br /&gt;
&lt;br /&gt;
*Generate the request. Leave the default values, except for the FQDN, which is the name the certificate will be issued for. Location is optional...&lt;br /&gt;
 openssl req -config openssl.cnf -sha256 -new -key private/$FQDN.key.pem -out csr/$FQDN.csr.pem&lt;br /&gt;
 chmod 444 csr/$FQDN.csr.pem &lt;br /&gt;
&lt;br /&gt;
*Generate the certificate. Valid for 3000 days.&lt;br /&gt;
 openssl ca -config openssl.cnf -extensions server_cert -days 3000 -notext -md sha256 -in csr/$FQDN.csr.pem -out certs/$FQDN.cert.pem&lt;br /&gt;
&lt;br /&gt;
*Save the certificate and key in a format convenient for import into Windows&lt;br /&gt;
 openssl pkcs12 -export -out $FQDN.pfx   \&lt;br /&gt;
           -inkey private/$FQDN.key.pem \&lt;br /&gt;
           -in certs/$FQDN.cert.pem&lt;br /&gt;
&lt;br /&gt;
*Copy them so they can be downloaded through an sftp client&lt;br /&gt;
 cp /root/ca/certs/$FQDN.cert.pem /home/?? hq or sf&lt;br /&gt;
 cp /root/ca/private/$FQDN.key.pem /home/??&lt;br /&gt;
 mv $FQDN.pfx /home/??&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
&lt;br /&gt;
*Open a certificate&lt;br /&gt;
 openssl x509 -noout -text -in certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
*Verify a certificate&lt;br /&gt;
 openssl verify -CAfile certs/ca.cert.pem intermediate/certs/intermediate.cert.pem &lt;br /&gt;
&lt;br /&gt;
*Create a private key&lt;br /&gt;
 openssl genrsa  -out intermediate/private/t19201.ef3.test.key.pem 4096&lt;br /&gt;
&lt;br /&gt;
*Generate a pfx (certificate + password-protected key)&lt;br /&gt;
 openssl pkcs12 -export -out t19201.pfx \&lt;br /&gt;
  -inkey intermediate/private/t19201.ef3.test.key.pem \&lt;br /&gt;
  -in intermediate/certs/t19201.ef3.test.cert.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Revocation List ==&lt;br /&gt;
&lt;br /&gt;
*Generate&lt;br /&gt;
 openssl ca -config openssl.cnf  -gencrl -out crl/ca-in-sf.ef3.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Verify&lt;br /&gt;
 openssl crl -in ca-in-sf.ef3.local.crl.pem -noout -text&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Published at http://crl.ef3.local/ca-in-sf.ef3.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
Published at http://crl.ef3.local/ca-in-hq.ef3.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/act-as-your-own-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/generate-certificate-revocation-list-revoke-certificates/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/create-an-intermediate-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out privkey.pem 2048&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Network Security]]&lt;br /&gt;
[[Category:PKI]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Temporary_Let%27s_Encrypt_certificate&amp;diff=6271</id>
		<title>Temporary Let&#039;s Encrypt certificate</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Temporary_Let%27s_Encrypt_certificate&amp;diff=6271"/>
		<updated>2026-10-27T09:51:19Z</updated>

		<summary type="html">&lt;p&gt;Anko: Add category Certificate&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Procedure to issue a temporary certificate signed by Let&#039;s Encrypt for &amp;lt;code&amp;gt;tst.lets.ef3.in&amp;lt;/code&amp;gt; on Kubernetes with Istio.&lt;br /&gt;
&lt;br /&gt;
== Create temporary instance for certbot ==&lt;br /&gt;
Save as &amp;lt;code&amp;gt;temp-letsencrypt-server.yaml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
kind: Pod&lt;br /&gt;
metadata:&lt;br /&gt;
  name: certbot-temp&lt;br /&gt;
  namespace: ls-lets-website-tst&lt;br /&gt;
  labels:&lt;br /&gt;
    app: certbot-temp&lt;br /&gt;
spec:&lt;br /&gt;
  containers:&lt;br /&gt;
  - name: nginx&lt;br /&gt;
    image: nginx&lt;br /&gt;
    ports:&lt;br /&gt;
    - containerPort: 80&lt;br /&gt;
---&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
kind: Service&lt;br /&gt;
metadata:&lt;br /&gt;
  name: certbot-temp-svc&lt;br /&gt;
  namespace: ls-lets-website-tst&lt;br /&gt;
spec:&lt;br /&gt;
  selector:&lt;br /&gt;
    app: certbot-temp&lt;br /&gt;
  ports:&lt;br /&gt;
  - port: 80&lt;br /&gt;
    targetPort: 80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Apply it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl -n ls-lets-website-tst apply -f temp-letsencrypt-server.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Route the acme-challenge to the certbot instance ==&lt;br /&gt;
The virtualservice is an Istio entity. Add this match to the routes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl -n ls-lets-website-tst edit virtualservice ls-lets-vs&lt;br /&gt;
&lt;br /&gt;
  - match:&lt;br /&gt;
    - uri:&lt;br /&gt;
        prefix: /.well-known/acme-challenge/&lt;br /&gt;
    route:&lt;br /&gt;
    - destination:&lt;br /&gt;
        host: certbot-temp-svc&lt;br /&gt;
        port:&lt;br /&gt;
          number: 80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create certificate ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl exec -it certbot-temp -n ls-lets-website-tst -- bash&lt;br /&gt;
&lt;br /&gt;
# Inside the certbot pod: install certbot&lt;br /&gt;
apt-get update &amp;amp;&amp;amp; apt-get install -y certbot&lt;br /&gt;
&lt;br /&gt;
# Inside the pod: request the certificate&lt;br /&gt;
certbot certonly --webroot -w /usr/share/nginx/html -d tst.lets.ef3.in&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Copy the new certificate and the key ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl exec -n &amp;quot;ls-lets-website-tst&amp;quot; &amp;quot;certbot-temp&amp;quot; -- cat /etc/letsencrypt/live/tst.lets.ef3.in/fullchain.pem &amp;gt; tst.lets.fullchain.pem&lt;br /&gt;
&lt;br /&gt;
kubectl exec -n &amp;quot;ls-lets-website-tst&amp;quot; &amp;quot;certbot-temp&amp;quot; -- cat /etc/letsencrypt/live/tst.lets.ef3.in/privkey.pem &amp;gt; tst.lets.key.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Check the certificate:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openssl x509 --noout -in tst.lets.fullchain.pem --text&lt;br /&gt;
&lt;br /&gt;
Certificate:&lt;br /&gt;
    Data:&lt;br /&gt;
        Version: 3 (0x2)&lt;br /&gt;
        Signature Algorithm: ecdsa-with-SHA384&lt;br /&gt;
        Issuer: C = US, O = Let&#039;s Encrypt, CN = YE1&lt;br /&gt;
        Validity&lt;br /&gt;
            Not Before: Oct 13 13:01:42 2026 GMT&lt;br /&gt;
            Not After : Jan 11 13:01:41 2027 GMT&lt;br /&gt;
        Subject: CN = tst.lets.ef3.in&lt;br /&gt;
        Subject Public Key Info:&lt;br /&gt;
            Public Key Algorithm: id-ecPublicKey&lt;br /&gt;
                Public-Key: (256 bit)&lt;br /&gt;
                ASN1 OID: prime256v1&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create Istio secret ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl create secret tls tst.lets -n istio-ingress --key=tst.lets.key.pem --cert=tst.lets.fullchain.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Enable HTTPS at the gateway ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl -n ls-lets-website-tst edit gateway ls-lets-gateway&lt;br /&gt;
&lt;br /&gt;
  - hosts:&lt;br /&gt;
    - tst.lets.ef3.in&lt;br /&gt;
    port:&lt;br /&gt;
      name: https&lt;br /&gt;
      number: 443&lt;br /&gt;
      protocol: HTTPS&lt;br /&gt;
    tls:&lt;br /&gt;
      credentialName: tst.lets&lt;br /&gt;
      mode: SIMPLE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Clean the environment ==&lt;br /&gt;
* Remove the locally saved *.pem files&lt;br /&gt;
* Remove the routing to the certbot pod&lt;br /&gt;
* Delete the certbot pod&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm *pem&lt;br /&gt;
kubectl -n ls-lets-website-tst edit virtualservice ls-lets-vs&lt;br /&gt;
kubectl -n ls-lets-website-tst delete -f temp-letsencrypt-server.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Security]]&lt;br /&gt;
[[Category:Kubernetes]]&lt;br /&gt;
[[Category:Certificate]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Create_CA_with_openssl&amp;diff=6270</id>
		<title>Create CA with openssl</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Create_CA_with_openssl&amp;diff=6270"/>
		<updated>2026-10-27T09:51:19Z</updated>

		<summary type="html">&lt;p&gt;Anko: Add category Certificate&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating a certification authority ==&lt;br /&gt;
&lt;br /&gt;
Certificate Authority - an organization that issues digital certificates&lt;br /&gt;
&lt;br /&gt;
===Creating the directory structure===&lt;br /&gt;
 mkdir CA&lt;br /&gt;
 cd CA&lt;br /&gt;
 mkdir certs crl newcerts private&lt;br /&gt;
 chmod 700 private&lt;br /&gt;
 touch index.txt&lt;br /&gt;
 echo 1000 &amp;gt; serial&lt;br /&gt;
 &lt;br /&gt;
index.txt, serial - list of the certificates&lt;br /&gt;
&lt;br /&gt;
===Configuration===&lt;br /&gt;
 cp /etc/ssl/openssl.cnf ./&lt;br /&gt;
 nano openssl.cnf&lt;br /&gt;
&lt;br /&gt;
In openssl.conf, the path to the CA directory must be set in [ CA_default ]&lt;br /&gt;
Example: dir=/home/mrezhi/CA&lt;br /&gt;
 [ CA_default ]&lt;br /&gt;
 dir=/home/mrezhi/CA&lt;br /&gt;
&lt;br /&gt;
 [ usr_cert ]&lt;br /&gt;
 # These extensions are added when &#039;ca&#039; signs a request.&lt;br /&gt;
 basicConstraints=CA:FALSE&lt;br /&gt;
 keyUsage = nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
 nsComment = &amp;quot;OpenSSL Generated Certificate&amp;quot;&lt;br /&gt;
 subjectKeyIdentifier=hash&lt;br /&gt;
 authorityKeyIdentifier=keyid,issuer&lt;br /&gt;
&lt;br /&gt;
 [ v3_ca ]&lt;br /&gt;
 # Extensions for a typical CA&lt;br /&gt;
 subjectKeyIdentifier=hash&lt;br /&gt;
 authorityKeyIdentifier=keyid:always,issuer&lt;br /&gt;
 basicConstraints = CA:true&lt;br /&gt;
 keyUsage = cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 [ policy_match ]&lt;br /&gt;
 countryName             = match&lt;br /&gt;
 stateOrProvinceName     = supplied&lt;br /&gt;
 organizationName        = supplied&lt;br /&gt;
 organizationalUnitName  = optional&lt;br /&gt;
 commonName              = supplied&lt;br /&gt;
 emailAddress            = optional&lt;br /&gt;
&lt;br /&gt;
===Generating the private key===&lt;br /&gt;
 openssl genrsa -aes256 -out private/ca.key.pem 4096&lt;br /&gt;
&lt;br /&gt;
aes256 - encrypts the private key&lt;br /&gt;
&lt;br /&gt;
===Generating the CA certificate===&lt;br /&gt;
&lt;br /&gt;
 openssl req -config openssl.cnf \&lt;br /&gt;
  -new -x509 -days 3650 \&lt;br /&gt;
  -key private/ca.key.pem \&lt;br /&gt;
  -sha256 -extensions v3_ca \&lt;br /&gt;
  -out certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
The file is read-only&lt;br /&gt;
 chmod 444 certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
==Generating and signing certificates==&lt;br /&gt;
&lt;br /&gt;
===Private key===&lt;br /&gt;
 openssl genrsa -out private/student.tugab.bg.key.pem 4096&lt;br /&gt;
 chmod 400 student.tugab.bg.key.pem&lt;br /&gt;
&lt;br /&gt;
===Certificate signing request===&lt;br /&gt;
 openssl req -config openssl.cnf \&lt;br /&gt;
  -sha256 -new -key private/student.tugab.bg.key.pem \&lt;br /&gt;
  -out certs/student.tugab.bg.csr.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
 openssl req -newkey rsa:2048 -keyout private/domain1.tugab.key -out certs/domain1.tugab.csr -config ./openssl.cnf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Signing the certificate signing request===&lt;br /&gt;
&lt;br /&gt;
 openssl ca -config openssl.cnf \&lt;br /&gt;
  -keyfile private/ca.key.pem \&lt;br /&gt;
  -cert certs/ca.cert.pem \&lt;br /&gt;
  -extensions usr_cert -notext -md sha256 \&lt;br /&gt;
  -in certs/student.tugab.bg.csr.pem \&lt;br /&gt;
  -out certs/student.tugab.bg.cert.pem&lt;br /&gt;
&lt;br /&gt;
==Configuring a web server==&lt;br /&gt;
&lt;br /&gt;
*Import a Linux/Debian virtual machine&lt;br /&gt;
*Copy the key pair to the hosting machine (FileZilla can be used)&lt;br /&gt;
*Install apache2&lt;br /&gt;
 apt-get install apache2&lt;br /&gt;
*Enable the ssl module&lt;br /&gt;
 a2enmod ssl&lt;br /&gt;
*Enable https&lt;br /&gt;
** nano /etc/apache2/ports.conf&lt;br /&gt;
** cp /etc/apache2/sites-available/default-ssl /etc/apache2/sites-enabled&lt;br /&gt;
** nano /etc/apache2/sites-enabled/default-ssl , set the paths to the certificates&lt;br /&gt;
&lt;br /&gt;
===Browser===&lt;br /&gt;
&lt;br /&gt;
Add the generated root certificate to the built-in certificates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Generate Server Certificate Commands==&lt;br /&gt;
&lt;br /&gt;
*Access the server&lt;br /&gt;
 ssh hq@ca-in-hq.ef3.local&lt;br /&gt;
&lt;br /&gt;
*Root user and the configuration folder&lt;br /&gt;
 su&lt;br /&gt;
 cd /root/ca&lt;br /&gt;
&lt;br /&gt;
*Define the FQDN&lt;br /&gt;
 FQDN=xxx.ef3.local&lt;br /&gt;
&lt;br /&gt;
*Generate the key. The key has no password. Length 4096 bits.&lt;br /&gt;
 openssl genrsa -out private/$FQDN.key.pem 4096&lt;br /&gt;
 chmod 400 private/$FQDN.key.pem &lt;br /&gt;
&lt;br /&gt;
*Generate the request. Leave the default values, except for the FQDN, which is the name the certificate will be issued for. Location is optional...&lt;br /&gt;
 openssl req -config openssl.cnf -sha256 -new -key private/$FQDN.key.pem -out csr/$FQDN.csr.pem&lt;br /&gt;
 chmod 444 csr/$FQDN.csr.pem &lt;br /&gt;
&lt;br /&gt;
*Generate the certificate. Valid for 3000 days.&lt;br /&gt;
 openssl ca -config openssl.cnf -extensions server_cert -days 3000 -notext -md sha256 -in csr/$FQDN.csr.pem -out certs/$FQDN.cert.pem&lt;br /&gt;
&lt;br /&gt;
*Save the certificate and key in a format convenient for import into Windows&lt;br /&gt;
 openssl pkcs12 -export -out $FQDN.pfx   \&lt;br /&gt;
           -inkey private/$FQDN.key.pem \&lt;br /&gt;
           -in certs/$FQDN.cert.pem&lt;br /&gt;
&lt;br /&gt;
*Copy them so they can be downloaded through an sftp client&lt;br /&gt;
 cp /root/ca/certs/$FQDN.cert.pem /home/?? hq or sf&lt;br /&gt;
 cp /root/ca/private/$FQDN.key.pem /home/??&lt;br /&gt;
 mv $FQDN.pfx /home/??&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
&lt;br /&gt;
*Open a certificate&lt;br /&gt;
 openssl x509 -noout -text -in certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
*Verify a certificate&lt;br /&gt;
 openssl verify -CAfile certs/ca.cert.pem intermediate/certs/intermediate.cert.pem &lt;br /&gt;
&lt;br /&gt;
*Create a private key&lt;br /&gt;
 openssl genrsa  -out intermediate/private/t19201.ef3.test.key.pem 4096&lt;br /&gt;
&lt;br /&gt;
*Generate a pfx (certificate + password-protected key)&lt;br /&gt;
 openssl pkcs12 -export -out t19201.pfx \&lt;br /&gt;
  -inkey intermediate/private/t19201.ef3.test.key.pem \&lt;br /&gt;
  -in intermediate/certs/t19201.ef3.test.cert.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Revocation List ==&lt;br /&gt;
&lt;br /&gt;
*Generate&lt;br /&gt;
 openssl ca -config openssl.cnf  -gencrl -out crl/ca-in-sf.ef3.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Verify&lt;br /&gt;
 openssl crl -in ca-in-sf.ef3.local.crl.pem -noout -text&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Published at http://crl.ef3.local/ca-in-sf.ef3.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
Published at http://crl.ef3.local/ca-in-hq.ef3.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/act-as-your-own-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/generate-certificate-revocation-list-revoke-certificates/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/create-an-intermediate-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out privkey.pem 2048&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Network Security]]&lt;br /&gt;
[[Category:Certificate]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Certificates&amp;diff=6269</id>
		<title>Certificates</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Certificates&amp;diff=6269"/>
		<updated>2026-10-27T09:51:18Z</updated>

		<summary type="html">&lt;p&gt;Anko: Anko moved page Certificates to Certificate old: Archive old page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Certificate old]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Certificate_old&amp;diff=6268</id>
		<title>Certificate old</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Certificate_old&amp;diff=6268"/>
		<updated>2026-10-27T09:51:18Z</updated>

		<summary type="html">&lt;p&gt;Anko: Anko moved page Certificates to Certificate old: Archive old page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== openssl ==&lt;br /&gt;
&lt;br /&gt;
Генериране на ключ:&lt;br /&gt;
&lt;br /&gt;
== Създаване на сертифицираща организация ==&lt;br /&gt;
&lt;br /&gt;
Certificate Authority - организация, която издава цифрови сертификати&lt;br /&gt;
&lt;br /&gt;
===Създаване на директорийна структура===&lt;br /&gt;
 mkdir CA&lt;br /&gt;
 cd CA&lt;br /&gt;
 mkdir certs crl newcerts private&lt;br /&gt;
 chmod 700 private&lt;br /&gt;
 touch index.txt&lt;br /&gt;
 echo 1000 &amp;gt; serial&lt;br /&gt;
 &lt;br /&gt;
index.txt, serial - списък на сертификатите&lt;br /&gt;
&lt;br /&gt;
===Настройки===&lt;br /&gt;
 cp /etc/ssl/openssl.cnf ./&lt;br /&gt;
 nano openssl.cnf&lt;br /&gt;
&lt;br /&gt;
В openssl.conf за [ CA_default ] трябва да се настрои пътят към директорията CA&lt;br /&gt;
Примерно dir=/home/mrezhi/CA&lt;br /&gt;
 [ CA_default ]&lt;br /&gt;
 dir=/home/mrezhi/CA&lt;br /&gt;
&lt;br /&gt;
 [ usr_cert ]&lt;br /&gt;
 # These extensions are added when &#039;ca&#039; signs a request.&lt;br /&gt;
 basicConstraints=CA:FALSE&lt;br /&gt;
 keyUsage = nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
 nsComment = &amp;quot;OpenSSL Generated Certificate&amp;quot;&lt;br /&gt;
 subjectKeyIdentifier=hash&lt;br /&gt;
 authorityKeyIdentifier=keyid,issuer&lt;br /&gt;
&lt;br /&gt;
 [ v3_ca ]&lt;br /&gt;
 # Extensions for a typical CA&lt;br /&gt;
 subjectKeyIdentifier=hash&lt;br /&gt;
 authorityKeyIdentifier=keyid:always,issuer&lt;br /&gt;
 basicConstraints = CA:true&lt;br /&gt;
 keyUsage = cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 [ policy_match ]&lt;br /&gt;
 countryName             = match&lt;br /&gt;
 stateOrProvinceName     = supplied&lt;br /&gt;
 organizationName        = supplied&lt;br /&gt;
 organizationalUnitName  = optional&lt;br /&gt;
 commonName              = supplied&lt;br /&gt;
 emailAddress            = optional&lt;br /&gt;
&lt;br /&gt;
===Генериране на частен ключ===&lt;br /&gt;
 openssl genrsa -aes256 -out private/ca.key.pem 4096&lt;br /&gt;
&lt;br /&gt;
aes256 - криптира частния ключ&lt;br /&gt;
&lt;br /&gt;
===Генериране на сертификат за CA===&lt;br /&gt;
&lt;br /&gt;
 openssl req -config openssl.cnf \&lt;br /&gt;
  -new -x509 -days 3650 \&lt;br /&gt;
  -key private/ca.key.pem \&lt;br /&gt;
  -sha256 -extensions v3_ca \&lt;br /&gt;
  -out certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
Файлът е само за четене&lt;br /&gt;
 chmod 444 certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
==Генериране и подписване на сертификати==&lt;br /&gt;
&lt;br /&gt;
===частен ключ===&lt;br /&gt;
 openssl genrsa -out private/student.tugab.bg.key.pem 4096&lt;br /&gt;
 chmod 400 student.tugab.bg.key.pem&lt;br /&gt;
&lt;br /&gt;
===Искане за подпис===&lt;br /&gt;
 openssl req -config openssl.cnf \&lt;br /&gt;
  -sha256 -new -key private/student.tugab.bg.key.pem \&lt;br /&gt;
  -out certs/student.tugab.bg.csr.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ili&lt;br /&gt;
 openssl req -newkey rsa:2048 -keyout private/domain1.tugab.key -out certs/domain1.tugab.csr -config ./openssl.cnf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Подписване на искането за подпис===&lt;br /&gt;
&lt;br /&gt;
 openssl ca -config openssl.cnf \&lt;br /&gt;
  -keyfile private/ca.key.pem \&lt;br /&gt;
  -cert certs/ca.cert.pem \&lt;br /&gt;
  -extensions usr_cert -notext -md sha256 \&lt;br /&gt;
  -in certs/student.tugab.bg.csr.pem \&lt;br /&gt;
  -out certs/student.tugab.bg.cert.pem&lt;br /&gt;
&lt;br /&gt;
==Конфигуриране на web server==&lt;br /&gt;
&lt;br /&gt;
*Импортиране виртуална машина с Линукс\Дебиан&lt;br /&gt;
*копиране на двойката ключове на хостинг машината (може да се използва fileZilla&lt;br /&gt;
*инсталиране на apache2&lt;br /&gt;
 apt-get install apache2&lt;br /&gt;
*активиране на ssl модула&lt;br /&gt;
 a2enmod ssl&lt;br /&gt;
*актвиране на https&lt;br /&gt;
** nano /etc/apache2/ports.conf&lt;br /&gt;
** cp /etc/apache2/sites-available/default-ssl /etc/apache2/sites-enabled&lt;br /&gt;
** nano /etc/apache2/sites-enabled/default-ssl , да се настроят пътищата към сертификатите&lt;br /&gt;
&lt;br /&gt;
===Браузър===&lt;br /&gt;
&lt;br /&gt;
Да се добави генерираният root сертификат към вградените сертификати.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Generate Server Certificate Commands==&lt;br /&gt;
&lt;br /&gt;
*Достъп до сървъра&lt;br /&gt;
 ssh hq@ca-in-hq.ef3.local&lt;br /&gt;
&lt;br /&gt;
*роот потребител и папка със конфигурацията&lt;br /&gt;
 su&lt;br /&gt;
 cd /root/ca&lt;br /&gt;
&lt;br /&gt;
*Дефиниране FQDN&lt;br /&gt;
 FQDN=xxx.ef3.local&lt;br /&gt;
&lt;br /&gt;
*Генериране на ключ. Ключа е без парола. Дължина 4096 бит-а.&lt;br /&gt;
 openssl genrsa -out private/$FQDN.key.pem 4096&lt;br /&gt;
 chmod 400 private/$FQDN.key.pem &lt;br /&gt;
&lt;br /&gt;
*Генериране на рекуест. Оставят се стойностите по подразбиране,  С изключение на FQDN, което е името за което ще бъде издаден сертификата. Location е опционално...&lt;br /&gt;
 openssl req -config openssl.cnf -sha256 -new -key private/$FQDN.key.pem -out csr/$FQDN.csr.pem&lt;br /&gt;
 chmod 444 csr/$FQDN.csr.pem &lt;br /&gt;
&lt;br /&gt;
*Генериране на сертификат. Валидност 3000 дена.&lt;br /&gt;
 openssl ca -config openssl.cnf -extensions server_cert -days 3000 -notext -md sha256 -in csr/$FQDN.csr.pem -out certs/$FQDN.cert.pem&lt;br /&gt;
&lt;br /&gt;
*Записване на сертификата и ключа във формат удобен за импорт в Windows&lt;br /&gt;
 openssl pkcs12 -export -out $FQDN.pfx   \&lt;br /&gt;
           -inkey private/$FQDN.key.pem \&lt;br /&gt;
           -in certs/$FQDN.cert.pem&lt;br /&gt;
&lt;br /&gt;
*копиране за да могат да бъдат изтеглени през sftp клиент&lt;br /&gt;
 cp /root/ca/certs/$FQDN.cert.pem /home/?? hq ili sf&lt;br /&gt;
 cp /root/ca/private/$FQDN.key.pem /home/??&lt;br /&gt;
 mv $FQDN.pfx /home/??&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
&lt;br /&gt;
*Отваряне на сертификат&lt;br /&gt;
 openssl x509 -noout -text -in certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
*Проверка на сертификат&lt;br /&gt;
 openssl verify -CAfile certs/ca.cert.pem intermediate/certs/intermediate.cert.pem &lt;br /&gt;
&lt;br /&gt;
*Създаване на частен ключ&lt;br /&gt;
 openssl genrsa  -out intermediate/private/t19201.ef3.test.key.pem 4096&lt;br /&gt;
&lt;br /&gt;
*Генериране на pfx (сертификат + ключ с парола)&lt;br /&gt;
 openssl pkcs12 -export -out t19201.pfx \&lt;br /&gt;
  -inkey intermediate/private/t19201.ef3.test.key.pem \&lt;br /&gt;
  -in intermediate/certs/t19201.ef3.test.cert.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Revocation List ==&lt;br /&gt;
&lt;br /&gt;
*Генериране &lt;br /&gt;
 openssl ca -config openssl.cnf  -gencrl -out crl/ca-in-sf.ef3.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Проверка&lt;br /&gt;
 openssl crl -in ca-in-sf.ef3.local.crl.pem -noout -text&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Публикува се на http://crl.ef3.local/ca-in-sf.ef3.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
Публикува се на http://crl.ef3.local/ca-in-hq.ef3.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/act-as-your-own-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/generate-certificate-revocation-list-revoke-certificates/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/create-an-intermediate-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/act-as-your-own-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/generate-certificate-revocation-list-revoke-certificates/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/create-an-intermediate-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out privkey.pem 2048&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Мрежова сигурност]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Create_CA_with_openssl&amp;diff=6267</id>
		<title>Create CA with openssl</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Create_CA_with_openssl&amp;diff=6267"/>
		<updated>2026-10-27T09:46:49Z</updated>

		<summary type="html">&lt;p&gt;Anko: Synced from t230&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Creating a certification authority ==&lt;br /&gt;
&lt;br /&gt;
Certificate Authority - an organization that issues digital certificates&lt;br /&gt;
&lt;br /&gt;
===Creating the directory structure===&lt;br /&gt;
 mkdir CA&lt;br /&gt;
 cd CA&lt;br /&gt;
 mkdir certs crl newcerts private&lt;br /&gt;
 chmod 700 private&lt;br /&gt;
 touch index.txt&lt;br /&gt;
 echo 1000 &amp;gt; serial&lt;br /&gt;
 &lt;br /&gt;
index.txt, serial - list of the certificates&lt;br /&gt;
&lt;br /&gt;
===Configuration===&lt;br /&gt;
 cp /etc/ssl/openssl.cnf ./&lt;br /&gt;
 nano openssl.cnf&lt;br /&gt;
&lt;br /&gt;
In openssl.conf, the path to the CA directory must be set in [ CA_default ]&lt;br /&gt;
Example: dir=/home/mrezhi/CA&lt;br /&gt;
 [ CA_default ]&lt;br /&gt;
 dir=/home/mrezhi/CA&lt;br /&gt;
&lt;br /&gt;
 [ usr_cert ]&lt;br /&gt;
 # These extensions are added when &#039;ca&#039; signs a request.&lt;br /&gt;
 basicConstraints=CA:FALSE&lt;br /&gt;
 keyUsage = nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
 nsComment = &amp;quot;OpenSSL Generated Certificate&amp;quot;&lt;br /&gt;
 subjectKeyIdentifier=hash&lt;br /&gt;
 authorityKeyIdentifier=keyid,issuer&lt;br /&gt;
&lt;br /&gt;
 [ v3_ca ]&lt;br /&gt;
 # Extensions for a typical CA&lt;br /&gt;
 subjectKeyIdentifier=hash&lt;br /&gt;
 authorityKeyIdentifier=keyid:always,issuer&lt;br /&gt;
 basicConstraints = CA:true&lt;br /&gt;
 keyUsage = cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 [ policy_match ]&lt;br /&gt;
 countryName             = match&lt;br /&gt;
 stateOrProvinceName     = supplied&lt;br /&gt;
 organizationName        = supplied&lt;br /&gt;
 organizationalUnitName  = optional&lt;br /&gt;
 commonName              = supplied&lt;br /&gt;
 emailAddress            = optional&lt;br /&gt;
&lt;br /&gt;
===Generating the private key===&lt;br /&gt;
 openssl genrsa -aes256 -out private/ca.key.pem 4096&lt;br /&gt;
&lt;br /&gt;
aes256 - encrypts the private key&lt;br /&gt;
&lt;br /&gt;
===Generating the CA certificate===&lt;br /&gt;
&lt;br /&gt;
 openssl req -config openssl.cnf \&lt;br /&gt;
  -new -x509 -days 3650 \&lt;br /&gt;
  -key private/ca.key.pem \&lt;br /&gt;
  -sha256 -extensions v3_ca \&lt;br /&gt;
  -out certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
The file is read-only&lt;br /&gt;
 chmod 444 certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
==Generating and signing certificates==&lt;br /&gt;
&lt;br /&gt;
===Private key===&lt;br /&gt;
 openssl genrsa -out private/student.tugab.bg.key.pem 4096&lt;br /&gt;
 chmod 400 student.tugab.bg.key.pem&lt;br /&gt;
&lt;br /&gt;
===Certificate signing request===&lt;br /&gt;
 openssl req -config openssl.cnf \&lt;br /&gt;
  -sha256 -new -key private/student.tugab.bg.key.pem \&lt;br /&gt;
  -out certs/student.tugab.bg.csr.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
 openssl req -newkey rsa:2048 -keyout private/domain1.tugab.key -out certs/domain1.tugab.csr -config ./openssl.cnf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Signing the certificate signing request===&lt;br /&gt;
&lt;br /&gt;
 openssl ca -config openssl.cnf \&lt;br /&gt;
  -keyfile private/ca.key.pem \&lt;br /&gt;
  -cert certs/ca.cert.pem \&lt;br /&gt;
  -extensions usr_cert -notext -md sha256 \&lt;br /&gt;
  -in certs/student.tugab.bg.csr.pem \&lt;br /&gt;
  -out certs/student.tugab.bg.cert.pem&lt;br /&gt;
&lt;br /&gt;
==Configuring a web server==&lt;br /&gt;
&lt;br /&gt;
*Import a Linux/Debian virtual machine&lt;br /&gt;
*Copy the key pair to the hosting machine (FileZilla can be used)&lt;br /&gt;
*Install apache2&lt;br /&gt;
 apt-get install apache2&lt;br /&gt;
*Enable the ssl module&lt;br /&gt;
 a2enmod ssl&lt;br /&gt;
*Enable https&lt;br /&gt;
** nano /etc/apache2/ports.conf&lt;br /&gt;
** cp /etc/apache2/sites-available/default-ssl /etc/apache2/sites-enabled&lt;br /&gt;
** nano /etc/apache2/sites-enabled/default-ssl , set the paths to the certificates&lt;br /&gt;
&lt;br /&gt;
===Browser===&lt;br /&gt;
&lt;br /&gt;
Add the generated root certificate to the built-in certificates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Generate Server Certificate Commands==&lt;br /&gt;
&lt;br /&gt;
*Access the server&lt;br /&gt;
 ssh hq@ca-in-hq.ef3.local&lt;br /&gt;
&lt;br /&gt;
*Root user and the configuration folder&lt;br /&gt;
 su&lt;br /&gt;
 cd /root/ca&lt;br /&gt;
&lt;br /&gt;
*Define the FQDN&lt;br /&gt;
 FQDN=xxx.ef3.local&lt;br /&gt;
&lt;br /&gt;
*Generate the key. The key has no password. Length 4096 bits.&lt;br /&gt;
 openssl genrsa -out private/$FQDN.key.pem 4096&lt;br /&gt;
 chmod 400 private/$FQDN.key.pem &lt;br /&gt;
&lt;br /&gt;
*Generate the request. Leave the default values, except for the FQDN, which is the name the certificate will be issued for. Location is optional...&lt;br /&gt;
 openssl req -config openssl.cnf -sha256 -new -key private/$FQDN.key.pem -out csr/$FQDN.csr.pem&lt;br /&gt;
 chmod 444 csr/$FQDN.csr.pem &lt;br /&gt;
&lt;br /&gt;
*Generate the certificate. Valid for 3000 days.&lt;br /&gt;
 openssl ca -config openssl.cnf -extensions server_cert -days 3000 -notext -md sha256 -in csr/$FQDN.csr.pem -out certs/$FQDN.cert.pem&lt;br /&gt;
&lt;br /&gt;
*Save the certificate and key in a format convenient for import into Windows&lt;br /&gt;
 openssl pkcs12 -export -out $FQDN.pfx   \&lt;br /&gt;
           -inkey private/$FQDN.key.pem \&lt;br /&gt;
           -in certs/$FQDN.cert.pem&lt;br /&gt;
&lt;br /&gt;
*Copy them so they can be downloaded through an sftp client&lt;br /&gt;
 cp /root/ca/certs/$FQDN.cert.pem /home/?? hq or sf&lt;br /&gt;
 cp /root/ca/private/$FQDN.key.pem /home/??&lt;br /&gt;
 mv $FQDN.pfx /home/??&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
&lt;br /&gt;
*Open a certificate&lt;br /&gt;
 openssl x509 -noout -text -in certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
*Verify a certificate&lt;br /&gt;
 openssl verify -CAfile certs/ca.cert.pem intermediate/certs/intermediate.cert.pem &lt;br /&gt;
&lt;br /&gt;
*Create a private key&lt;br /&gt;
 openssl genrsa  -out intermediate/private/t19201.ef3.test.key.pem 4096&lt;br /&gt;
&lt;br /&gt;
*Generate a pfx (certificate + password-protected key)&lt;br /&gt;
 openssl pkcs12 -export -out t19201.pfx \&lt;br /&gt;
  -inkey intermediate/private/t19201.ef3.test.key.pem \&lt;br /&gt;
  -in intermediate/certs/t19201.ef3.test.cert.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Revocation List ==&lt;br /&gt;
&lt;br /&gt;
*Generate&lt;br /&gt;
 openssl ca -config openssl.cnf  -gencrl -out crl/ca-in-sf.ef3.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Verify&lt;br /&gt;
 openssl crl -in ca-in-sf.ef3.local.crl.pem -noout -text&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Published at http://crl.ef3.local/ca-in-sf.ef3.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
Published at http://crl.ef3.local/ca-in-hq.ef3.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/act-as-your-own-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/generate-certificate-revocation-list-revoke-certificates/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/create-an-intermediate-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out privkey.pem 2048&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Network Security]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Certificate_old&amp;diff=6266</id>
		<title>Certificate old</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Certificate_old&amp;diff=6266"/>
		<updated>2026-10-27T09:41:18Z</updated>

		<summary type="html">&lt;p&gt;Anko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== openssl ==&lt;br /&gt;
&lt;br /&gt;
Генериране на ключ:&lt;br /&gt;
&lt;br /&gt;
== Създаване на сертифицираща организация ==&lt;br /&gt;
&lt;br /&gt;
Certificate Authority - организация, която издава цифрови сертификати&lt;br /&gt;
&lt;br /&gt;
===Създаване на директорийна структура===&lt;br /&gt;
 mkdir CA&lt;br /&gt;
 cd CA&lt;br /&gt;
 mkdir certs crl newcerts private&lt;br /&gt;
 chmod 700 private&lt;br /&gt;
 touch index.txt&lt;br /&gt;
 echo 1000 &amp;gt; serial&lt;br /&gt;
 &lt;br /&gt;
index.txt, serial - списък на сертификатите&lt;br /&gt;
&lt;br /&gt;
===Настройки===&lt;br /&gt;
 cp /etc/ssl/openssl.cnf ./&lt;br /&gt;
 nano openssl.cnf&lt;br /&gt;
&lt;br /&gt;
В openssl.conf за [ CA_default ] трябва да се настрои пътят към директорията CA&lt;br /&gt;
Примерно dir=/home/mrezhi/CA&lt;br /&gt;
 [ CA_default ]&lt;br /&gt;
 dir=/home/mrezhi/CA&lt;br /&gt;
&lt;br /&gt;
 [ usr_cert ]&lt;br /&gt;
 # These extensions are added when &#039;ca&#039; signs a request.&lt;br /&gt;
 basicConstraints=CA:FALSE&lt;br /&gt;
 keyUsage = nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
 nsComment = &amp;quot;OpenSSL Generated Certificate&amp;quot;&lt;br /&gt;
 subjectKeyIdentifier=hash&lt;br /&gt;
 authorityKeyIdentifier=keyid,issuer&lt;br /&gt;
&lt;br /&gt;
 [ v3_ca ]&lt;br /&gt;
 # Extensions for a typical CA&lt;br /&gt;
 subjectKeyIdentifier=hash&lt;br /&gt;
 authorityKeyIdentifier=keyid:always,issuer&lt;br /&gt;
 basicConstraints = CA:true&lt;br /&gt;
 keyUsage = cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 [ policy_match ]&lt;br /&gt;
 countryName             = match&lt;br /&gt;
 stateOrProvinceName     = supplied&lt;br /&gt;
 organizationName        = supplied&lt;br /&gt;
 organizationalUnitName  = optional&lt;br /&gt;
 commonName              = supplied&lt;br /&gt;
 emailAddress            = optional&lt;br /&gt;
&lt;br /&gt;
===Генериране на частен ключ===&lt;br /&gt;
 openssl genrsa -aes256 -out private/ca.key.pem 4096&lt;br /&gt;
&lt;br /&gt;
aes256 - криптира частния ключ&lt;br /&gt;
&lt;br /&gt;
===Генериране на сертификат за CA===&lt;br /&gt;
&lt;br /&gt;
 openssl req -config openssl.cnf \&lt;br /&gt;
  -new -x509 -days 3650 \&lt;br /&gt;
  -key private/ca.key.pem \&lt;br /&gt;
  -sha256 -extensions v3_ca \&lt;br /&gt;
  -out certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
Файлът е само за четене&lt;br /&gt;
 chmod 444 certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
==Генериране и подписване на сертификати==&lt;br /&gt;
&lt;br /&gt;
===частен ключ===&lt;br /&gt;
 openssl genrsa -out private/student.tugab.bg.key.pem 4096&lt;br /&gt;
 chmod 400 student.tugab.bg.key.pem&lt;br /&gt;
&lt;br /&gt;
===Искане за подпис===&lt;br /&gt;
 openssl req -config openssl.cnf \&lt;br /&gt;
  -sha256 -new -key private/student.tugab.bg.key.pem \&lt;br /&gt;
  -out certs/student.tugab.bg.csr.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ili&lt;br /&gt;
 openssl req -newkey rsa:2048 -keyout private/domain1.tugab.key -out certs/domain1.tugab.csr -config ./openssl.cnf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Подписване на искането за подпис===&lt;br /&gt;
&lt;br /&gt;
 openssl ca -config openssl.cnf \&lt;br /&gt;
  -keyfile private/ca.key.pem \&lt;br /&gt;
  -cert certs/ca.cert.pem \&lt;br /&gt;
  -extensions usr_cert -notext -md sha256 \&lt;br /&gt;
  -in certs/student.tugab.bg.csr.pem \&lt;br /&gt;
  -out certs/student.tugab.bg.cert.pem&lt;br /&gt;
&lt;br /&gt;
==Конфигуриране на web server==&lt;br /&gt;
&lt;br /&gt;
*Импортиране виртуална машина с Линукс\Дебиан&lt;br /&gt;
*копиране на двойката ключове на хостинг машината (може да се използва fileZilla&lt;br /&gt;
*инсталиране на apache2&lt;br /&gt;
 apt-get install apache2&lt;br /&gt;
*активиране на ssl модула&lt;br /&gt;
 a2enmod ssl&lt;br /&gt;
*актвиране на https&lt;br /&gt;
** nano /etc/apache2/ports.conf&lt;br /&gt;
** cp /etc/apache2/sites-available/default-ssl /etc/apache2/sites-enabled&lt;br /&gt;
** nano /etc/apache2/sites-enabled/default-ssl , да се настроят пътищата към сертификатите&lt;br /&gt;
&lt;br /&gt;
===Браузър===&lt;br /&gt;
&lt;br /&gt;
Да се добави генерираният root сертификат към вградените сертификати.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Generate Server Certificate Commands==&lt;br /&gt;
&lt;br /&gt;
*Достъп до сървъра&lt;br /&gt;
 ssh hq@ca-in-hq.ef3.local&lt;br /&gt;
&lt;br /&gt;
*роот потребител и папка със конфигурацията&lt;br /&gt;
 su&lt;br /&gt;
 cd /root/ca&lt;br /&gt;
&lt;br /&gt;
*Дефиниране FQDN&lt;br /&gt;
 FQDN=xxx.ef3.local&lt;br /&gt;
&lt;br /&gt;
*Генериране на ключ. Ключа е без парола. Дължина 4096 бит-а.&lt;br /&gt;
 openssl genrsa -out private/$FQDN.key.pem 4096&lt;br /&gt;
 chmod 400 private/$FQDN.key.pem &lt;br /&gt;
&lt;br /&gt;
*Генериране на рекуест. Оставят се стойностите по подразбиране,  С изключение на FQDN, което е името за което ще бъде издаден сертификата. Location е опционално...&lt;br /&gt;
 openssl req -config openssl.cnf -sha256 -new -key private/$FQDN.key.pem -out csr/$FQDN.csr.pem&lt;br /&gt;
 chmod 444 csr/$FQDN.csr.pem &lt;br /&gt;
&lt;br /&gt;
*Генериране на сертификат. Валидност 3000 дена.&lt;br /&gt;
 openssl ca -config openssl.cnf -extensions server_cert -days 3000 -notext -md sha256 -in csr/$FQDN.csr.pem -out certs/$FQDN.cert.pem&lt;br /&gt;
&lt;br /&gt;
*Записване на сертификата и ключа във формат удобен за импорт в Windows&lt;br /&gt;
 openssl pkcs12 -export -out $FQDN.pfx   \&lt;br /&gt;
           -inkey private/$FQDN.key.pem \&lt;br /&gt;
           -in certs/$FQDN.cert.pem&lt;br /&gt;
&lt;br /&gt;
*копиране за да могат да бъдат изтеглени през sftp клиент&lt;br /&gt;
 cp /root/ca/certs/$FQDN.cert.pem /home/?? hq ili sf&lt;br /&gt;
 cp /root/ca/private/$FQDN.key.pem /home/??&lt;br /&gt;
 mv $FQDN.pfx /home/??&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
&lt;br /&gt;
*Отваряне на сертификат&lt;br /&gt;
 openssl x509 -noout -text -in certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
*Проверка на сертификат&lt;br /&gt;
 openssl verify -CAfile certs/ca.cert.pem intermediate/certs/intermediate.cert.pem &lt;br /&gt;
&lt;br /&gt;
*Създаване на частен ключ&lt;br /&gt;
 openssl genrsa  -out intermediate/private/t19201.ef3.test.key.pem 4096&lt;br /&gt;
&lt;br /&gt;
*Генериране на pfx (сертификат + ключ с парола)&lt;br /&gt;
 openssl pkcs12 -export -out t19201.pfx \&lt;br /&gt;
  -inkey intermediate/private/t19201.ef3.test.key.pem \&lt;br /&gt;
  -in intermediate/certs/t19201.ef3.test.cert.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Revocation List ==&lt;br /&gt;
&lt;br /&gt;
*Генериране &lt;br /&gt;
 openssl ca -config openssl.cnf  -gencrl -out crl/ca-in-sf.ef3.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Проверка&lt;br /&gt;
 openssl crl -in ca-in-sf.ef3.local.crl.pem -noout -text&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Публикува се на http://crl.ef3.local/ca-in-sf.ef3.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
Публикува се на http://crl.ef3.local/ca-in-hq.ef3.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/act-as-your-own-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/generate-certificate-revocation-list-revoke-certificates/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/create-an-intermediate-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/act-as-your-own-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/generate-certificate-revocation-list-revoke-certificates/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/create-an-intermediate-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out privkey.pem 2048&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Мрежова сигурност]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Certificate_old&amp;diff=6265</id>
		<title>Certificate old</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Certificate_old&amp;diff=6265"/>
		<updated>2026-10-27T09:40:03Z</updated>

		<summary type="html">&lt;p&gt;Anko: /* Revocation List */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== openssl ==&lt;br /&gt;
&lt;br /&gt;
Генериране на ключ:&lt;br /&gt;
&lt;br /&gt;
== Създаване на сертифицираща организация ==&lt;br /&gt;
&lt;br /&gt;
Certificate Authority - организация, която издава цифрови сертификати&lt;br /&gt;
&lt;br /&gt;
===Създаване на директорийна структура===&lt;br /&gt;
 mkdir CA&lt;br /&gt;
 cd CA&lt;br /&gt;
 mkdir certs crl newcerts private&lt;br /&gt;
 chmod 700 private&lt;br /&gt;
 touch index.txt&lt;br /&gt;
 echo 1000 &amp;gt; serial&lt;br /&gt;
 &lt;br /&gt;
index.txt, serial - списък на сертификатите&lt;br /&gt;
&lt;br /&gt;
===Настройки===&lt;br /&gt;
 cp /etc/ssl/openssl.cnf ./&lt;br /&gt;
 nano openssl.cnf&lt;br /&gt;
&lt;br /&gt;
В openssl.conf за [ CA_default ] трябва да се настрои пътят към директорията CA&lt;br /&gt;
Примерно dir=/home/mrezhi/CA&lt;br /&gt;
 [ CA_default ]&lt;br /&gt;
 dir=/home/mrezhi/CA&lt;br /&gt;
&lt;br /&gt;
 [ usr_cert ]&lt;br /&gt;
 # These extensions are added when &#039;ca&#039; signs a request.&lt;br /&gt;
 basicConstraints=CA:FALSE&lt;br /&gt;
 keyUsage = nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
 nsComment = &amp;quot;OpenSSL Generated Certificate&amp;quot;&lt;br /&gt;
 subjectKeyIdentifier=hash&lt;br /&gt;
 authorityKeyIdentifier=keyid,issuer&lt;br /&gt;
&lt;br /&gt;
 [ v3_ca ]&lt;br /&gt;
 # Extensions for a typical CA&lt;br /&gt;
 subjectKeyIdentifier=hash&lt;br /&gt;
 authorityKeyIdentifier=keyid:always,issuer&lt;br /&gt;
 basicConstraints = CA:true&lt;br /&gt;
 keyUsage = cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
 ...&lt;br /&gt;
 [ policy_match ]&lt;br /&gt;
 countryName             = match&lt;br /&gt;
 stateOrProvinceName     = supplied&lt;br /&gt;
 organizationName        = supplied&lt;br /&gt;
 organizationalUnitName  = optional&lt;br /&gt;
 commonName              = supplied&lt;br /&gt;
 emailAddress            = optional&lt;br /&gt;
&lt;br /&gt;
===Генериране на частен ключ===&lt;br /&gt;
 openssl genrsa -aes256 -out private/ca.key.pem 4096&lt;br /&gt;
&lt;br /&gt;
aes256 - криптира частния ключ&lt;br /&gt;
&lt;br /&gt;
===Генериране на сертификат за CA===&lt;br /&gt;
&lt;br /&gt;
 openssl req -config openssl.cnf \&lt;br /&gt;
  -new -x509 -days 3650 \&lt;br /&gt;
  -key private/ca.key.pem \&lt;br /&gt;
  -sha256 -extensions v3_ca \&lt;br /&gt;
  -out certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
Файлът е само за четене&lt;br /&gt;
 chmod 444 certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
==Генериране и подписване на сертификати==&lt;br /&gt;
&lt;br /&gt;
===частен ключ===&lt;br /&gt;
 openssl genrsa -out private/student.tugab.bg.key.pem 4096&lt;br /&gt;
 chmod 400 student.tugab.bg.key.pem&lt;br /&gt;
&lt;br /&gt;
===Искане за подпис===&lt;br /&gt;
 openssl req -config openssl.cnf \&lt;br /&gt;
  -sha256 -new -key private/student.tugab.bg.key.pem \&lt;br /&gt;
  -out certs/student.tugab.bg.csr.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ili&lt;br /&gt;
 openssl req -newkey rsa:2048 -keyout private/domain1.tugab.key -out certs/domain1.tugab.csr -config ./openssl.cnf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Подписване на искането за подпис===&lt;br /&gt;
&lt;br /&gt;
 openssl ca -config openssl.cnf \&lt;br /&gt;
  -keyfile private/ca.key.pem \&lt;br /&gt;
  -cert certs/ca.cert.pem \&lt;br /&gt;
  -extensions usr_cert -notext -md sha256 \&lt;br /&gt;
  -in certs/student.tugab.bg.csr.pem \&lt;br /&gt;
  -out certs/student.tugab.bg.cert.pem&lt;br /&gt;
&lt;br /&gt;
==Конфигуриране на web server==&lt;br /&gt;
&lt;br /&gt;
*Импортиране виртуална машина с Линукс\Дебиан&lt;br /&gt;
*копиране на двойката ключове на хостинг машината (може да се използва fileZilla&lt;br /&gt;
*инсталиране на apache2&lt;br /&gt;
 apt-get install apache2&lt;br /&gt;
*активиране на ssl модула&lt;br /&gt;
 a2enmod ssl&lt;br /&gt;
*актвиране на https&lt;br /&gt;
** nano /etc/apache2/ports.conf&lt;br /&gt;
** cp /etc/apache2/sites-available/default-ssl /etc/apache2/sites-enabled&lt;br /&gt;
** nano /etc/apache2/sites-enabled/default-ssl , да се настроят пътищата към сертификатите&lt;br /&gt;
&lt;br /&gt;
===Браузър===&lt;br /&gt;
&lt;br /&gt;
Да се добави генерираният root сертификат към вградените сертификати.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Generate Server Certificate Commands==&lt;br /&gt;
&lt;br /&gt;
*Достъп до сървъра&lt;br /&gt;
 ssh hq@ca-in-hq.stemo.local&lt;br /&gt;
&lt;br /&gt;
*роот потребител и папка със конфигурацията&lt;br /&gt;
 su&lt;br /&gt;
 cd /root/ca&lt;br /&gt;
&lt;br /&gt;
*Дефиниране FQDN&lt;br /&gt;
 FQDN=xxx.stemo.local&lt;br /&gt;
&lt;br /&gt;
*Генериране на ключ. Ключа е без парола. Дължина 4096 бит-а.&lt;br /&gt;
 openssl genrsa -out private/$FQDN.key.pem 4096&lt;br /&gt;
 chmod 400 private/$FQDN.key.pem &lt;br /&gt;
&lt;br /&gt;
*Генериране на рекуест. Оставят се стойностите по подразбиране,  С изключение на FQDN, което е името за което ще бъде издаден сертификата. Location е опционално...&lt;br /&gt;
 openssl req -config openssl.cnf -sha256 -new -key private/$FQDN.key.pem -out csr/$FQDN.csr.pem&lt;br /&gt;
 chmod 444 csr/$FQDN.csr.pem &lt;br /&gt;
&lt;br /&gt;
*Генериране на сертификат. Валидност 3000 дена.&lt;br /&gt;
 openssl ca -config openssl.cnf -extensions server_cert -days 3000 -notext -md sha256 -in csr/$FQDN.csr.pem -out certs/$FQDN.cert.pem&lt;br /&gt;
&lt;br /&gt;
*Записване на сертификата и ключа във формат удобен за импорт в Windows&lt;br /&gt;
 openssl pkcs12 -export -out $FQDN.pfx   \&lt;br /&gt;
           -inkey private/$FQDN.key.pem \&lt;br /&gt;
           -in certs/$FQDN.cert.pem&lt;br /&gt;
&lt;br /&gt;
*копиране за да могат да бъдат изтеглени през sftp клиент&lt;br /&gt;
 cp /root/ca/certs/$FQDN.cert.pem /home/?? hq ili sf&lt;br /&gt;
 cp /root/ca/private/$FQDN.key.pem /home/??&lt;br /&gt;
 mv $FQDN.pfx /home/??&lt;br /&gt;
&lt;br /&gt;
== Commands ==&lt;br /&gt;
&lt;br /&gt;
*Отваряне на сертификат&lt;br /&gt;
 openssl x509 -noout -text -in certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
*Проверка на сертификат&lt;br /&gt;
 openssl verify -CAfile certs/ca.cert.pem intermediate/certs/intermediate.cert.pem &lt;br /&gt;
&lt;br /&gt;
*Създаване на частен ключ&lt;br /&gt;
 openssl genrsa  -out intermediate/private/t19201.stemo.test.key.pem 4096&lt;br /&gt;
&lt;br /&gt;
*Генериране на pfx (сертификат + ключ с парола)&lt;br /&gt;
 openssl pkcs12 -export -out t19201.pfx \&lt;br /&gt;
  -inkey intermediate/private/t19201.stemo.test.key.pem \&lt;br /&gt;
  -in intermediate/certs/t19201.stemo.test.cert.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Revocation List ==&lt;br /&gt;
&lt;br /&gt;
*Генериране &lt;br /&gt;
 openssl ca -config openssl.cnf  -gencrl -out crl/ca-in-sf.stemo.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Проверка&lt;br /&gt;
 openssl crl -in ca-in-sf.ef3.local.crl.pem -noout -text&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Публикува се на http://crl.ef3.local/ca-in-sf.stemo.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
Публикува се на http://crl.ef3.local/ca-in-hq.stemo.local.crl.pem&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/act-as-your-own-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/generate-certificate-revocation-list-revoke-certificates/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/create-an-intermediate-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/act-as-your-own-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/generate-certificate-revocation-list-revoke-certificates/&lt;br /&gt;
&lt;br /&gt;
https://jamielinux.com/articles/2013/08/create-an-intermediate-certificate-authority/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
openssl genrsa -out privkey.pem 2048&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Мрежова сигурност]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Temporary_Let%27s_Encrypt_certificate&amp;diff=6264</id>
		<title>Temporary Let&#039;s Encrypt certificate</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Temporary_Let%27s_Encrypt_certificate&amp;diff=6264"/>
		<updated>2026-10-27T09:37:34Z</updated>

		<summary type="html">&lt;p&gt;Anko: Synced from t230&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Procedure to issue a temporary certificate signed by Let&#039;s Encrypt for &amp;lt;code&amp;gt;tst.lets.ef3.in&amp;lt;/code&amp;gt; on Kubernetes with Istio.&lt;br /&gt;
&lt;br /&gt;
== Create temporary instance for certbot ==&lt;br /&gt;
Save as &amp;lt;code&amp;gt;temp-letsencrypt-server.yaml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
kind: Pod&lt;br /&gt;
metadata:&lt;br /&gt;
  name: certbot-temp&lt;br /&gt;
  namespace: ls-lets-website-tst&lt;br /&gt;
  labels:&lt;br /&gt;
    app: certbot-temp&lt;br /&gt;
spec:&lt;br /&gt;
  containers:&lt;br /&gt;
  - name: nginx&lt;br /&gt;
    image: nginx&lt;br /&gt;
    ports:&lt;br /&gt;
    - containerPort: 80&lt;br /&gt;
---&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
kind: Service&lt;br /&gt;
metadata:&lt;br /&gt;
  name: certbot-temp-svc&lt;br /&gt;
  namespace: ls-lets-website-tst&lt;br /&gt;
spec:&lt;br /&gt;
  selector:&lt;br /&gt;
    app: certbot-temp&lt;br /&gt;
  ports:&lt;br /&gt;
  - port: 80&lt;br /&gt;
    targetPort: 80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Apply it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl -n ls-lets-website-tst apply -f temp-letsencrypt-server.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Route the acme-challenge to the certbot instance ==&lt;br /&gt;
The virtualservice is an Istio entity. Add this match to the routes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl -n ls-lets-website-tst edit virtualservice ls-lets-vs&lt;br /&gt;
&lt;br /&gt;
  - match:&lt;br /&gt;
    - uri:&lt;br /&gt;
        prefix: /.well-known/acme-challenge/&lt;br /&gt;
    route:&lt;br /&gt;
    - destination:&lt;br /&gt;
        host: certbot-temp-svc&lt;br /&gt;
        port:&lt;br /&gt;
          number: 80&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create certificate ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl exec -it certbot-temp -n ls-lets-website-tst -- bash&lt;br /&gt;
&lt;br /&gt;
# Inside the certbot pod: install certbot&lt;br /&gt;
apt-get update &amp;amp;&amp;amp; apt-get install -y certbot&lt;br /&gt;
&lt;br /&gt;
# Inside the pod: request the certificate&lt;br /&gt;
certbot certonly --webroot -w /usr/share/nginx/html -d tst.lets.ef3.in&lt;br /&gt;
&lt;br /&gt;
exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Copy the new certificate and the key ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl exec -n &amp;quot;ls-lets-website-tst&amp;quot; &amp;quot;certbot-temp&amp;quot; -- cat /etc/letsencrypt/live/tst.lets.ef3.in/fullchain.pem &amp;gt; tst.lets.fullchain.pem&lt;br /&gt;
&lt;br /&gt;
kubectl exec -n &amp;quot;ls-lets-website-tst&amp;quot; &amp;quot;certbot-temp&amp;quot; -- cat /etc/letsencrypt/live/tst.lets.ef3.in/privkey.pem &amp;gt; tst.lets.key.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Check the certificate:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
openssl x509 --noout -in tst.lets.fullchain.pem --text&lt;br /&gt;
&lt;br /&gt;
Certificate:&lt;br /&gt;
    Data:&lt;br /&gt;
        Version: 3 (0x2)&lt;br /&gt;
        Signature Algorithm: ecdsa-with-SHA384&lt;br /&gt;
        Issuer: C = US, O = Let&#039;s Encrypt, CN = YE1&lt;br /&gt;
        Validity&lt;br /&gt;
            Not Before: Oct 13 13:01:42 2026 GMT&lt;br /&gt;
            Not After : Jan 11 13:01:41 2027 GMT&lt;br /&gt;
        Subject: CN = tst.lets.ef3.in&lt;br /&gt;
        Subject Public Key Info:&lt;br /&gt;
            Public Key Algorithm: id-ecPublicKey&lt;br /&gt;
                Public-Key: (256 bit)&lt;br /&gt;
                ASN1 OID: prime256v1&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create Istio secret ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl create secret tls tst.lets -n istio-ingress --key=tst.lets.key.pem --cert=tst.lets.fullchain.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Enable HTTPS at the gateway ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kubectl -n ls-lets-website-tst edit gateway ls-lets-gateway&lt;br /&gt;
&lt;br /&gt;
  - hosts:&lt;br /&gt;
    - tst.lets.ef3.in&lt;br /&gt;
    port:&lt;br /&gt;
      name: https&lt;br /&gt;
      number: 443&lt;br /&gt;
      protocol: HTTPS&lt;br /&gt;
    tls:&lt;br /&gt;
      credentialName: tst.lets&lt;br /&gt;
      mode: SIMPLE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Clean the environment ==&lt;br /&gt;
* Remove the locally saved *.pem files&lt;br /&gt;
* Remove the routing to the certbot pod&lt;br /&gt;
* Delete the certbot pod&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm *pem&lt;br /&gt;
kubectl -n ls-lets-website-tst edit virtualservice ls-lets-vs&lt;br /&gt;
kubectl -n ls-lets-website-tst delete -f temp-letsencrypt-server.yaml&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Security]]&lt;br /&gt;
[[Category:Kubernetes]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Github_Copilot&amp;diff=6263</id>
		<title>Github Copilot</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Github_Copilot&amp;diff=6263"/>
		<updated>2026-10-27T07:50:54Z</updated>

		<summary type="html">&lt;p&gt;Anko: Created page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GitHub Copilot =&lt;br /&gt;
&lt;br /&gt;
GitHub Copilot is an AI coding assistant from GitHub. It is available in editors, on github.com and as a terminal tool (Copilot CLI).&lt;br /&gt;
&lt;br /&gt;
== Copilot CLI ==&lt;br /&gt;
* Terminal assistant that reads, edits and runs code using natural-language prompts.&lt;br /&gt;
* Can run shell commands, search code, use GitHub via the gh CLI and call MCP servers.&lt;br /&gt;
&lt;br /&gt;
== Custom instructions ==&lt;br /&gt;
* Repository: &#039;.github/copilot-instructions.md&#039;&lt;br /&gt;
* Path-specific: &#039;.github/instructions/*.instructions.md&#039;&lt;br /&gt;
* Agents: &#039;AGENTS.md&#039;&lt;br /&gt;
* User level: &#039;$HOME/.copilot/copilot-instructions.md&#039;&lt;br /&gt;
&lt;br /&gt;
== MCP ==&lt;br /&gt;
Model Context Protocol servers extend Copilot with external tools, for example the MediaWiki MCP servers (t230 and ilianko.com).&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
* https://docs.github.com/en/copilot&lt;br /&gt;
&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Github_CLI_(gh)&amp;diff=6261</id>
		<title>Github CLI (gh)</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Github_CLI_(gh)&amp;diff=6261"/>
		<updated>2026-10-27T07:22:00Z</updated>

		<summary type="html">&lt;p&gt;Anko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;GitHub CLI&#039;&#039;&#039; (&#039;&#039;gh&#039;&#039;) is GitHub&#039;s official command-line tool that brings pull requests, issues, GitHub Actions workflows, releases, gists, and other GitHub features directly to the terminal.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&#039;&#039;gh&#039;&#039; allows developers to interact with GitHub.com and GitHub Enterprise Server without leaving the command line. It automatically detects the current Git repository context, handles authentication and SSH/HTTPS Git credential configuration, and provides both interactive prompts and scriptable flags (including JSON output with &#039;&#039;--json&#039;&#039; and &#039;&#039;--jq&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
* &#039;&#039;&#039;Windows (winget / choco / scoop):&#039;&#039;&#039;&lt;br /&gt;
  winget install --id GitHub.cli&lt;br /&gt;
  choco install gh&lt;br /&gt;
* &#039;&#039;&#039;macOS (Homebrew):&#039;&#039;&#039;&lt;br /&gt;
  brew install gh&lt;br /&gt;
* &#039;&#039;&#039;Linux (Debian / Ubuntu):&#039;&#039;&#039;&lt;br /&gt;
  sudo apt update&lt;br /&gt;
  sudo apt install gh&lt;br /&gt;
&lt;br /&gt;
=== Update ===&lt;br /&gt;
 [[winget]] upgrade --id GitHub.cli&lt;br /&gt;
&lt;br /&gt;
== Common Commands ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Check installation&lt;br /&gt;
gh --version&lt;br /&gt;
&lt;br /&gt;
# Authenticate&lt;br /&gt;
gh auth login&lt;br /&gt;
&lt;br /&gt;
# Check authentication&lt;br /&gt;
gh auth status&lt;br /&gt;
&lt;br /&gt;
# Clone a repository&lt;br /&gt;
gh repo clone OWNER/REPO&lt;br /&gt;
&lt;br /&gt;
# Create a repository&lt;br /&gt;
gh repo create&lt;br /&gt;
&lt;br /&gt;
# List repositories&lt;br /&gt;
gh repo list&lt;br /&gt;
&lt;br /&gt;
# Open current repo in browser&lt;br /&gt;
gh repo view --web&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Authentication ===&lt;br /&gt;
  gh auth login       # Interactive login to GitHub.com or GitHub Enterprise&lt;br /&gt;
  gh auth status      # View active authentication state&lt;br /&gt;
  gh auth setup-git   # Configure git to use gh as a credential helper&lt;br /&gt;
  gh auth token       # Print the current authentication token&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Repositories (gh repo) ===&lt;br /&gt;
  gh repo clone OWNER/REPO            # Clone a repository&lt;br /&gt;
  gh repo create                      # Create a new repository on GitHub&lt;br /&gt;
  gh repo fork                        # Fork an existing repository&lt;br /&gt;
  gh repo view --web                  # Open the repository in the browser&lt;br /&gt;
&lt;br /&gt;
=== Pull Requests (gh pr) ===&lt;br /&gt;
  gh pr list                          # List open pull requests&lt;br /&gt;
  gh pr create --fill                 # Create a pull request using commit info&lt;br /&gt;
  gh pr checkout NUMBER               # Check out a pull request branch locally&lt;br /&gt;
  gh pr status                        # Show status of relevant pull requests&lt;br /&gt;
  gh pr checks                        # View CI/CD check statuses for a PR&lt;br /&gt;
  gh pr review --approve              # Approve the current pull request&lt;br /&gt;
  gh pr merge --squash --delete-branch # Squash-merge and delete branch&lt;br /&gt;
&lt;br /&gt;
=== Issues (gh issue) ===&lt;br /&gt;
  gh issue list                       # List issues in the repository&lt;br /&gt;
  gh issue create                     # Create a new issue interactively&lt;br /&gt;
  gh issue view NUMBER               # View issue details and comments&lt;br /&gt;
  gh issue develop NUMBER --checkout  # Create and check out a branch linked to an issue&lt;br /&gt;
  gh issue close NUMBER               # Close an issue&lt;br /&gt;
&lt;br /&gt;
=== GitHub Actions (gh run and gh workflow) ===&lt;br /&gt;
  gh workflow list                    # List workflows in the repository&lt;br /&gt;
  gh workflow run WORKFLOW_NAME       # Trigger a workflow_dispatch event&lt;br /&gt;
  gh run list                         # List recent workflow runs&lt;br /&gt;
  gh run watch                        # Watch an in-progress workflow run live&lt;br /&gt;
  gh run view --log-failed            # View logs for failed steps in a run&lt;br /&gt;
&lt;br /&gt;
=== Releases, Gists and Codespaces ===&lt;br /&gt;
  gh release list                     # List repository releases&lt;br /&gt;
  gh release create v1.0.0 --generate-notes # Create a release with auto-generated notes&lt;br /&gt;
  gh gist create FILE                 # Create a new GitHub Gist&lt;br /&gt;
  gh codespace list                   # List active GitHub Codespaces&lt;br /&gt;
&lt;br /&gt;
=== update ===&lt;br /&gt;
&lt;br /&gt;
== Scripting, REST/GraphQL API and Extensions ==&lt;br /&gt;
* &#039;&#039;&#039;Structured JSON and jq filtering:&#039;&#039;&#039;&lt;br /&gt;
  gh pr list --json number,title,author&lt;br /&gt;
* &#039;&#039;&#039;Direct GitHub API requests (gh api):&#039;&#039;&#039;&lt;br /&gt;
  gh api repos/{owner}/{repo}/releases/latest&lt;br /&gt;
  gh api graphql -f query=&#039;{ viewer { login } }&#039;&lt;br /&gt;
* &#039;&#039;&#039;Aliases and Extensions:&#039;&#039;&#039;&lt;br /&gt;
  gh alias set co &#039;pr checkout&#039;&lt;br /&gt;
  gh extension search&lt;br /&gt;
  gh extension install dlvhdr/gh-dash&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
* [https://cli.github.com/ Official GitHub CLI Website]&lt;br /&gt;
* [https://cli.github.com/manual/ GitHub CLI Manual and Command Reference]&lt;br /&gt;
* [https://github.com/cli/cli GitHub CLI Source Repository (cli/cli)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Tools]]&lt;br /&gt;
[[Category:CLI]]&lt;br /&gt;
[[Category:Git]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Github_CLI_(gh)&amp;diff=6260</id>
		<title>Github CLI (gh)</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Github_CLI_(gh)&amp;diff=6260"/>
		<updated>2026-10-27T07:20:04Z</updated>

		<summary type="html">&lt;p&gt;Anko: /* Common Commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;GitHub CLI&#039;&#039;&#039; (&#039;&#039;gh&#039;&#039;) is GitHub&#039;s official command-line tool that brings pull requests, issues, GitHub Actions workflows, releases, gists, and other GitHub features directly to the terminal.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&#039;&#039;gh&#039;&#039; allows developers to interact with GitHub.com and GitHub Enterprise Server without leaving the command line. It automatically detects the current Git repository context, handles authentication and SSH/HTTPS Git credential configuration, and provides both interactive prompts and scriptable flags (including JSON output with &#039;&#039;--json&#039;&#039; and &#039;&#039;--jq&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
* &#039;&#039;&#039;Windows (winget / choco / scoop):&#039;&#039;&#039;&lt;br /&gt;
  winget install --id GitHub.cli&lt;br /&gt;
  choco install gh&lt;br /&gt;
* &#039;&#039;&#039;macOS (Homebrew):&#039;&#039;&#039;&lt;br /&gt;
  brew install gh&lt;br /&gt;
* &#039;&#039;&#039;Linux (Debian / Ubuntu):&#039;&#039;&#039;&lt;br /&gt;
  sudo apt update&lt;br /&gt;
  sudo apt install gh&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
  gh auth login       # Interactive login to GitHub.com or GitHub Enterprise&lt;br /&gt;
  gh auth status      # View active authentication state&lt;br /&gt;
  gh auth setup-git   # Configure git to use gh as a credential helper&lt;br /&gt;
  gh auth token       # Print the current authentication token&lt;br /&gt;
&lt;br /&gt;
== Common Commands ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Check installation&lt;br /&gt;
gh --version&lt;br /&gt;
&lt;br /&gt;
# Authenticate&lt;br /&gt;
gh auth login&lt;br /&gt;
&lt;br /&gt;
# Check authentication&lt;br /&gt;
gh auth status&lt;br /&gt;
&lt;br /&gt;
# Clone a repository&lt;br /&gt;
gh repo clone OWNER/REPO&lt;br /&gt;
&lt;br /&gt;
# Create a repository&lt;br /&gt;
gh repo create&lt;br /&gt;
&lt;br /&gt;
# List repositories&lt;br /&gt;
gh repo list&lt;br /&gt;
&lt;br /&gt;
# Open current repo in browser&lt;br /&gt;
gh repo view --web&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Repositories (gh repo) ===&lt;br /&gt;
  gh repo clone OWNER/REPO            # Clone a repository&lt;br /&gt;
  gh repo create                      # Create a new repository on GitHub&lt;br /&gt;
  gh repo fork                        # Fork an existing repository&lt;br /&gt;
  gh repo view --web                  # Open the repository in the browser&lt;br /&gt;
&lt;br /&gt;
=== Pull Requests (gh pr) ===&lt;br /&gt;
  gh pr list                          # List open pull requests&lt;br /&gt;
  gh pr create --fill                 # Create a pull request using commit info&lt;br /&gt;
  gh pr checkout NUMBER               # Check out a pull request branch locally&lt;br /&gt;
  gh pr status                        # Show status of relevant pull requests&lt;br /&gt;
  gh pr checks                        # View CI/CD check statuses for a PR&lt;br /&gt;
  gh pr review --approve              # Approve the current pull request&lt;br /&gt;
  gh pr merge --squash --delete-branch # Squash-merge and delete branch&lt;br /&gt;
&lt;br /&gt;
=== Issues (gh issue) ===&lt;br /&gt;
  gh issue list                       # List issues in the repository&lt;br /&gt;
  gh issue create                     # Create a new issue interactively&lt;br /&gt;
  gh issue view NUMBER               # View issue details and comments&lt;br /&gt;
  gh issue develop NUMBER --checkout  # Create and check out a branch linked to an issue&lt;br /&gt;
  gh issue close NUMBER               # Close an issue&lt;br /&gt;
&lt;br /&gt;
=== GitHub Actions (gh run and gh workflow) ===&lt;br /&gt;
  gh workflow list                    # List workflows in the repository&lt;br /&gt;
  gh workflow run WORKFLOW_NAME       # Trigger a workflow_dispatch event&lt;br /&gt;
  gh run list                         # List recent workflow runs&lt;br /&gt;
  gh run watch                        # Watch an in-progress workflow run live&lt;br /&gt;
  gh run view --log-failed            # View logs for failed steps in a run&lt;br /&gt;
&lt;br /&gt;
=== Releases, Gists and Codespaces ===&lt;br /&gt;
  gh release list                     # List repository releases&lt;br /&gt;
  gh release create v1.0.0 --generate-notes # Create a release with auto-generated notes&lt;br /&gt;
  gh gist create FILE                 # Create a new GitHub Gist&lt;br /&gt;
  gh codespace list                   # List active GitHub Codespaces&lt;br /&gt;
&lt;br /&gt;
=== update ===&lt;br /&gt;
&lt;br /&gt;
== Scripting, REST/GraphQL API and Extensions ==&lt;br /&gt;
* &#039;&#039;&#039;Structured JSON and jq filtering:&#039;&#039;&#039;&lt;br /&gt;
  gh pr list --json number,title,author&lt;br /&gt;
* &#039;&#039;&#039;Direct GitHub API requests (gh api):&#039;&#039;&#039;&lt;br /&gt;
  gh api repos/{owner}/{repo}/releases/latest&lt;br /&gt;
  gh api graphql -f query=&#039;{ viewer { login } }&#039;&lt;br /&gt;
* &#039;&#039;&#039;Aliases and Extensions:&#039;&#039;&#039;&lt;br /&gt;
  gh alias set co &#039;pr checkout&#039;&lt;br /&gt;
  gh extension search&lt;br /&gt;
  gh extension install dlvhdr/gh-dash&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
* [https://cli.github.com/ Official GitHub CLI Website]&lt;br /&gt;
* [https://cli.github.com/manual/ GitHub CLI Manual and Command Reference]&lt;br /&gt;
* [https://github.com/cli/cli GitHub CLI Source Repository (cli/cli)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Tools]]&lt;br /&gt;
[[Category:CLI]]&lt;br /&gt;
[[Category:Git]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Github_CLI_(gh)&amp;diff=6259</id>
		<title>Github CLI (gh)</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Github_CLI_(gh)&amp;diff=6259"/>
		<updated>2026-10-27T07:19:44Z</updated>

		<summary type="html">&lt;p&gt;Anko: /* Common Commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;GitHub CLI&#039;&#039;&#039; (&#039;&#039;gh&#039;&#039;) is GitHub&#039;s official command-line tool that brings pull requests, issues, GitHub Actions workflows, releases, gists, and other GitHub features directly to the terminal.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&#039;&#039;gh&#039;&#039; allows developers to interact with GitHub.com and GitHub Enterprise Server without leaving the command line. It automatically detects the current Git repository context, handles authentication and SSH/HTTPS Git credential configuration, and provides both interactive prompts and scriptable flags (including JSON output with &#039;&#039;--json&#039;&#039; and &#039;&#039;--jq&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
* &#039;&#039;&#039;Windows (winget / choco / scoop):&#039;&#039;&#039;&lt;br /&gt;
  winget install --id GitHub.cli&lt;br /&gt;
  choco install gh&lt;br /&gt;
* &#039;&#039;&#039;macOS (Homebrew):&#039;&#039;&#039;&lt;br /&gt;
  brew install gh&lt;br /&gt;
* &#039;&#039;&#039;Linux (Debian / Ubuntu):&#039;&#039;&#039;&lt;br /&gt;
  sudo apt update&lt;br /&gt;
  sudo apt install gh&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
  gh auth login       # Interactive login to GitHub.com or GitHub Enterprise&lt;br /&gt;
  gh auth status      # View active authentication state&lt;br /&gt;
  gh auth setup-git   # Configure git to use gh as a credential helper&lt;br /&gt;
  gh auth token       # Print the current authentication token&lt;br /&gt;
&lt;br /&gt;
== Common Commands ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
# Check installation&lt;br /&gt;
gh --version&lt;br /&gt;
&lt;br /&gt;
# Authenticate&lt;br /&gt;
gh auth login&lt;br /&gt;
&lt;br /&gt;
# Check authentication&lt;br /&gt;
gh auth status&lt;br /&gt;
&lt;br /&gt;
# Clone a repository&lt;br /&gt;
gh repo clone OWNER/REPO&lt;br /&gt;
&lt;br /&gt;
# Create a repository&lt;br /&gt;
gh repo create&lt;br /&gt;
&lt;br /&gt;
# List repositories&lt;br /&gt;
gh repo list&lt;br /&gt;
&lt;br /&gt;
# Open current repo in browser&lt;br /&gt;
gh repo view --web&lt;br /&gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Repositories (gh repo) ===&lt;br /&gt;
  gh repo clone OWNER/REPO            # Clone a repository&lt;br /&gt;
  gh repo create                      # Create a new repository on GitHub&lt;br /&gt;
  gh repo fork                        # Fork an existing repository&lt;br /&gt;
  gh repo view --web                  # Open the repository in the browser&lt;br /&gt;
&lt;br /&gt;
=== Pull Requests (gh pr) ===&lt;br /&gt;
  gh pr list                          # List open pull requests&lt;br /&gt;
  gh pr create --fill                 # Create a pull request using commit info&lt;br /&gt;
  gh pr checkout NUMBER               # Check out a pull request branch locally&lt;br /&gt;
  gh pr status                        # Show status of relevant pull requests&lt;br /&gt;
  gh pr checks                        # View CI/CD check statuses for a PR&lt;br /&gt;
  gh pr review --approve              # Approve the current pull request&lt;br /&gt;
  gh pr merge --squash --delete-branch # Squash-merge and delete branch&lt;br /&gt;
&lt;br /&gt;
=== Issues (gh issue) ===&lt;br /&gt;
  gh issue list                       # List issues in the repository&lt;br /&gt;
  gh issue create                     # Create a new issue interactively&lt;br /&gt;
  gh issue view NUMBER               # View issue details and comments&lt;br /&gt;
  gh issue develop NUMBER --checkout  # Create and check out a branch linked to an issue&lt;br /&gt;
  gh issue close NUMBER               # Close an issue&lt;br /&gt;
&lt;br /&gt;
=== GitHub Actions (gh run and gh workflow) ===&lt;br /&gt;
  gh workflow list                    # List workflows in the repository&lt;br /&gt;
  gh workflow run WORKFLOW_NAME       # Trigger a workflow_dispatch event&lt;br /&gt;
  gh run list                         # List recent workflow runs&lt;br /&gt;
  gh run watch                        # Watch an in-progress workflow run live&lt;br /&gt;
  gh run view --log-failed            # View logs for failed steps in a run&lt;br /&gt;
&lt;br /&gt;
=== Releases, Gists and Codespaces ===&lt;br /&gt;
  gh release list                     # List repository releases&lt;br /&gt;
  gh release create v1.0.0 --generate-notes # Create a release with auto-generated notes&lt;br /&gt;
  gh gist create FILE                 # Create a new GitHub Gist&lt;br /&gt;
  gh codespace list                   # List active GitHub Codespaces&lt;br /&gt;
&lt;br /&gt;
=== update ===&lt;br /&gt;
&lt;br /&gt;
== Scripting, REST/GraphQL API and Extensions ==&lt;br /&gt;
* &#039;&#039;&#039;Structured JSON and jq filtering:&#039;&#039;&#039;&lt;br /&gt;
  gh pr list --json number,title,author&lt;br /&gt;
* &#039;&#039;&#039;Direct GitHub API requests (gh api):&#039;&#039;&#039;&lt;br /&gt;
  gh api repos/{owner}/{repo}/releases/latest&lt;br /&gt;
  gh api graphql -f query=&#039;{ viewer { login } }&#039;&lt;br /&gt;
* &#039;&#039;&#039;Aliases and Extensions:&#039;&#039;&#039;&lt;br /&gt;
  gh alias set co &#039;pr checkout&#039;&lt;br /&gt;
  gh extension search&lt;br /&gt;
  gh extension install dlvhdr/gh-dash&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
* [https://cli.github.com/ Official GitHub CLI Website]&lt;br /&gt;
* [https://cli.github.com/manual/ GitHub CLI Manual and Command Reference]&lt;br /&gt;
* [https://github.com/cli/cli GitHub CLI Source Repository (cli/cli)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Tools]]&lt;br /&gt;
[[Category:CLI]]&lt;br /&gt;
[[Category:Git]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Github_CLI_(gh)&amp;diff=6258</id>
		<title>Github CLI (gh)</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Github_CLI_(gh)&amp;diff=6258"/>
		<updated>2026-10-27T07:19:19Z</updated>

		<summary type="html">&lt;p&gt;Anko: /* Common Commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;GitHub CLI&#039;&#039;&#039; (&#039;&#039;gh&#039;&#039;) is GitHub&#039;s official command-line tool that brings pull requests, issues, GitHub Actions workflows, releases, gists, and other GitHub features directly to the terminal.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&#039;&#039;gh&#039;&#039; allows developers to interact with GitHub.com and GitHub Enterprise Server without leaving the command line. It automatically detects the current Git repository context, handles authentication and SSH/HTTPS Git credential configuration, and provides both interactive prompts and scriptable flags (including JSON output with &#039;&#039;--json&#039;&#039; and &#039;&#039;--jq&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
* &#039;&#039;&#039;Windows (winget / choco / scoop):&#039;&#039;&#039;&lt;br /&gt;
  winget install --id GitHub.cli&lt;br /&gt;
  choco install gh&lt;br /&gt;
* &#039;&#039;&#039;macOS (Homebrew):&#039;&#039;&#039;&lt;br /&gt;
  brew install gh&lt;br /&gt;
* &#039;&#039;&#039;Linux (Debian / Ubuntu):&#039;&#039;&#039;&lt;br /&gt;
  sudo apt update&lt;br /&gt;
  sudo apt install gh&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
  gh auth login       # Interactive login to GitHub.com or GitHub Enterprise&lt;br /&gt;
  gh auth status      # View active authentication state&lt;br /&gt;
  gh auth setup-git   # Configure git to use gh as a credential helper&lt;br /&gt;
  gh auth token       # Print the current authentication token&lt;br /&gt;
&lt;br /&gt;
== Common Commands ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
# Check installation&lt;br /&gt;
gh --version&lt;br /&gt;
&lt;br /&gt;
# Authenticate&lt;br /&gt;
gh auth login&lt;br /&gt;
&lt;br /&gt;
# Check authentication&lt;br /&gt;
gh auth status&lt;br /&gt;
&lt;br /&gt;
# Clone a repository&lt;br /&gt;
gh repo clone OWNER/REPO&lt;br /&gt;
&lt;br /&gt;
# Create a repository&lt;br /&gt;
gh repo create&lt;br /&gt;
&lt;br /&gt;
# List repositories&lt;br /&gt;
gh repo list&lt;br /&gt;
&lt;br /&gt;
# Open current repo in browser&lt;br /&gt;
gh repo view --web&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Repositories (gh repo) ===&lt;br /&gt;
  gh repo clone OWNER/REPO            # Clone a repository&lt;br /&gt;
  gh repo create                      # Create a new repository on GitHub&lt;br /&gt;
  gh repo fork                        # Fork an existing repository&lt;br /&gt;
  gh repo view --web                  # Open the repository in the browser&lt;br /&gt;
&lt;br /&gt;
=== Pull Requests (gh pr) ===&lt;br /&gt;
  gh pr list                          # List open pull requests&lt;br /&gt;
  gh pr create --fill                 # Create a pull request using commit info&lt;br /&gt;
  gh pr checkout NUMBER               # Check out a pull request branch locally&lt;br /&gt;
  gh pr status                        # Show status of relevant pull requests&lt;br /&gt;
  gh pr checks                        # View CI/CD check statuses for a PR&lt;br /&gt;
  gh pr review --approve              # Approve the current pull request&lt;br /&gt;
  gh pr merge --squash --delete-branch # Squash-merge and delete branch&lt;br /&gt;
&lt;br /&gt;
=== Issues (gh issue) ===&lt;br /&gt;
  gh issue list                       # List issues in the repository&lt;br /&gt;
  gh issue create                     # Create a new issue interactively&lt;br /&gt;
  gh issue view NUMBER               # View issue details and comments&lt;br /&gt;
  gh issue develop NUMBER --checkout  # Create and check out a branch linked to an issue&lt;br /&gt;
  gh issue close NUMBER               # Close an issue&lt;br /&gt;
&lt;br /&gt;
=== GitHub Actions (gh run and gh workflow) ===&lt;br /&gt;
  gh workflow list                    # List workflows in the repository&lt;br /&gt;
  gh workflow run WORKFLOW_NAME       # Trigger a workflow_dispatch event&lt;br /&gt;
  gh run list                         # List recent workflow runs&lt;br /&gt;
  gh run watch                        # Watch an in-progress workflow run live&lt;br /&gt;
  gh run view --log-failed            # View logs for failed steps in a run&lt;br /&gt;
&lt;br /&gt;
=== Releases, Gists and Codespaces ===&lt;br /&gt;
  gh release list                     # List repository releases&lt;br /&gt;
  gh release create v1.0.0 --generate-notes # Create a release with auto-generated notes&lt;br /&gt;
  gh gist create FILE                 # Create a new GitHub Gist&lt;br /&gt;
  gh codespace list                   # List active GitHub Codespaces&lt;br /&gt;
&lt;br /&gt;
=== update ===&lt;br /&gt;
&lt;br /&gt;
== Scripting, REST/GraphQL API and Extensions ==&lt;br /&gt;
* &#039;&#039;&#039;Structured JSON and jq filtering:&#039;&#039;&#039;&lt;br /&gt;
  gh pr list --json number,title,author&lt;br /&gt;
* &#039;&#039;&#039;Direct GitHub API requests (gh api):&#039;&#039;&#039;&lt;br /&gt;
  gh api repos/{owner}/{repo}/releases/latest&lt;br /&gt;
  gh api graphql -f query=&#039;{ viewer { login } }&#039;&lt;br /&gt;
* &#039;&#039;&#039;Aliases and Extensions:&#039;&#039;&#039;&lt;br /&gt;
  gh alias set co &#039;pr checkout&#039;&lt;br /&gt;
  gh extension search&lt;br /&gt;
  gh extension install dlvhdr/gh-dash&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
* [https://cli.github.com/ Official GitHub CLI Website]&lt;br /&gt;
* [https://cli.github.com/manual/ GitHub CLI Manual and Command Reference]&lt;br /&gt;
* [https://github.com/cli/cli GitHub CLI Source Repository (cli/cli)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Tools]]&lt;br /&gt;
[[Category:CLI]]&lt;br /&gt;
[[Category:Git]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Github_CLI_(gh)&amp;diff=6257</id>
		<title>Github CLI (gh)</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Github_CLI_(gh)&amp;diff=6257"/>
		<updated>2026-10-27T07:12:53Z</updated>

		<summary type="html">&lt;p&gt;Anko: Created Github CLI (gh) reference page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;GitHub CLI&#039;&#039;&#039; (&#039;&#039;gh&#039;&#039;) is GitHub&#039;s official command-line tool that brings pull requests, issues, GitHub Actions workflows, releases, gists, and other GitHub features directly to the terminal.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&#039;&#039;gh&#039;&#039; allows developers to interact with GitHub.com and GitHub Enterprise Server without leaving the command line. It automatically detects the current Git repository context, handles authentication and SSH/HTTPS Git credential configuration, and provides both interactive prompts and scriptable flags (including JSON output with &#039;&#039;--json&#039;&#039; and &#039;&#039;--jq&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
* &#039;&#039;&#039;Windows (winget / choco / scoop):&#039;&#039;&#039;&lt;br /&gt;
  winget install --id GitHub.cli&lt;br /&gt;
  choco install gh&lt;br /&gt;
* &#039;&#039;&#039;macOS (Homebrew):&#039;&#039;&#039;&lt;br /&gt;
  brew install gh&lt;br /&gt;
* &#039;&#039;&#039;Linux (Debian / Ubuntu):&#039;&#039;&#039;&lt;br /&gt;
  sudo apt update&lt;br /&gt;
  sudo apt install gh&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
  gh auth login       # Interactive login to GitHub.com or GitHub Enterprise&lt;br /&gt;
  gh auth status      # View active authentication state&lt;br /&gt;
  gh auth setup-git   # Configure git to use gh as a credential helper&lt;br /&gt;
  gh auth token       # Print the current authentication token&lt;br /&gt;
&lt;br /&gt;
== Common Commands ==&lt;br /&gt;
&lt;br /&gt;
=== Repositories (gh repo) ===&lt;br /&gt;
  gh repo clone OWNER/REPO            # Clone a repository&lt;br /&gt;
  gh repo create                      # Create a new repository on GitHub&lt;br /&gt;
  gh repo fork                        # Fork an existing repository&lt;br /&gt;
  gh repo view --web                  # Open the repository in the browser&lt;br /&gt;
&lt;br /&gt;
=== Pull Requests (gh pr) ===&lt;br /&gt;
  gh pr list                          # List open pull requests&lt;br /&gt;
  gh pr create --fill                 # Create a pull request using commit info&lt;br /&gt;
  gh pr checkout NUMBER               # Check out a pull request branch locally&lt;br /&gt;
  gh pr status                        # Show status of relevant pull requests&lt;br /&gt;
  gh pr checks                        # View CI/CD check statuses for a PR&lt;br /&gt;
  gh pr review --approve              # Approve the current pull request&lt;br /&gt;
  gh pr merge --squash --delete-branch # Squash-merge and delete branch&lt;br /&gt;
&lt;br /&gt;
=== Issues (gh issue) ===&lt;br /&gt;
  gh issue list                       # List issues in the repository&lt;br /&gt;
  gh issue create                     # Create a new issue interactively&lt;br /&gt;
  gh issue view NUMBER               # View issue details and comments&lt;br /&gt;
  gh issue develop NUMBER --checkout  # Create and check out a branch linked to an issue&lt;br /&gt;
  gh issue close NUMBER               # Close an issue&lt;br /&gt;
&lt;br /&gt;
=== GitHub Actions (gh run and gh workflow) ===&lt;br /&gt;
  gh workflow list                    # List workflows in the repository&lt;br /&gt;
  gh workflow run WORKFLOW_NAME       # Trigger a workflow_dispatch event&lt;br /&gt;
  gh run list                         # List recent workflow runs&lt;br /&gt;
  gh run watch                        # Watch an in-progress workflow run live&lt;br /&gt;
  gh run view --log-failed            # View logs for failed steps in a run&lt;br /&gt;
&lt;br /&gt;
=== Releases, Gists and Codespaces ===&lt;br /&gt;
  gh release list                     # List repository releases&lt;br /&gt;
  gh release create v1.0.0 --generate-notes # Create a release with auto-generated notes&lt;br /&gt;
  gh gist create FILE                 # Create a new GitHub Gist&lt;br /&gt;
  gh codespace list                   # List active GitHub Codespaces&lt;br /&gt;
&lt;br /&gt;
== Scripting, REST/GraphQL API and Extensions ==&lt;br /&gt;
* &#039;&#039;&#039;Structured JSON and jq filtering:&#039;&#039;&#039;&lt;br /&gt;
  gh pr list --json number,title,author&lt;br /&gt;
* &#039;&#039;&#039;Direct GitHub API requests (gh api):&#039;&#039;&#039;&lt;br /&gt;
  gh api repos/{owner}/{repo}/releases/latest&lt;br /&gt;
  gh api graphql -f query=&#039;{ viewer { login } }&#039;&lt;br /&gt;
* &#039;&#039;&#039;Aliases and Extensions:&#039;&#039;&#039;&lt;br /&gt;
  gh alias set co &#039;pr checkout&#039;&lt;br /&gt;
  gh extension search&lt;br /&gt;
  gh extension install dlvhdr/gh-dash&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
* [https://cli.github.com/ Official GitHub CLI Website]&lt;br /&gt;
* [https://cli.github.com/manual/ GitHub CLI Manual and Command Reference]&lt;br /&gt;
* [https://github.com/cli/cli GitHub CLI Source Repository (cli/cli)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Tools]]&lt;br /&gt;
[[Category:CLI]]&lt;br /&gt;
[[Category:Git]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=MediaWiki:Sidebar&amp;diff=6256</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=MediaWiki:Sidebar&amp;diff=6256"/>
		<updated>2026-10-27T07:00:21Z</updated>

		<summary type="html">&lt;p&gt;Anko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** CV|CV&lt;br /&gt;
**Devops tools|Devops tools&lt;br /&gt;
** randompage-url|randompage&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=MediaWiki:Sidebar&amp;diff=6255</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=MediaWiki:Sidebar&amp;diff=6255"/>
		<updated>2026-10-27T06:59:57Z</updated>

		<summary type="html">&lt;p&gt;Anko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** CV|CV&lt;br /&gt;
**Devops Tools|Devops Tools&lt;br /&gt;
** randompage-url|randompage&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=MediaWiki:Sidebar&amp;diff=6254</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=MediaWiki:Sidebar&amp;diff=6254"/>
		<updated>2026-10-27T06:59:29Z</updated>

		<summary type="html">&lt;p&gt;Anko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** CV|CV&lt;br /&gt;
**devops-tools|Devops Tools&lt;br /&gt;
** randompage-url|randompage&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Category:DP-420_Terminology&amp;diff=6253</id>
		<title>Category:DP-420 Terminology</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Category:DP-420_Terminology&amp;diff=6253"/>
		<updated>2026-10-26T15:18:01Z</updated>

		<summary type="html">&lt;p&gt;Anko: Add 100-word category description for DP-420 Terminology&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This category contains key terminology, concepts, and reference articles for the &#039;&#039;&#039;[[DP-420: Azure Cosmos DB Developer Specialty]]&#039;&#039;&#039; certification exam (&#039;&#039;Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB&#039;&#039;). It covers core NoSQL concepts, Request Units (RUs), logical and physical partitioning, data modeling strategies, provisioned and serverless throughput, global distribution, tunable consistency levels, client SDK connectivity, server-side JavaScript programming, indexing policies, Change Feed, Azure Synapse Link, Microsoft Fabric mirroring, monitoring diagnostics, backup and restore models, and data-plane security. Each article includes a concise technical overview, links to official Microsoft Learn documentation, and DP-420 style practice questions with detailed answer keys.&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Azure_Cosmos_DB&amp;diff=6252</id>
		<title>Azure Cosmos DB</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Azure_Cosmos_DB&amp;diff=6252"/>
		<updated>2026-10-26T15:15:50Z</updated>

		<summary type="html">&lt;p&gt;Anko: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;larr; Back to [[DP-420: Azure Cosmos DB Developer Specialty|DP-420 Terminology Reference]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Core Concepts&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Microsoft&#039;s globally distributed, multi-model NoSQL database service for cloud-native apps.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Azure Cosmos DB is Microsoft&#039;s globally distributed, multi-model NoSQL database service designed for cloud-native applications requiring low latency, high availability, and elastic scalability. It supports multiple APIs (including the API for NoSQL, MongoDB, Cassandra, Gremlin, and Table), automatic and transparent horizontal partitioning, tunable consistency levels, and turnkey global distribution across any number of Azure regions.&lt;br /&gt;
&lt;br /&gt;
== More Info &amp;amp; Links ==&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/cosmos-db/introduction Microsoft Learn: Welcome to Azure Cosmos DB]&lt;br /&gt;
* [https://learn.microsoft.com/en-us/credentials/certifications/resources/study-guides/dp-420 Microsoft Learn: DP-420 study guide]&lt;br /&gt;
&lt;br /&gt;
== DP-420 Style Practice Questions ==&lt;br /&gt;
&#039;&#039;&#039;Q1.&#039;&#039;&#039; What is a defining characteristic of Azure Cosmos DB compared to a traditional single-region relational database?&lt;br /&gt;
* A. Turnkey global distribution across multiple Azure regions with tunable consistency&lt;br /&gt;
* B. It only supports a single fixed consistency level&lt;br /&gt;
* C. It requires manual sharding scripts written by the developer&lt;br /&gt;
* D. It cannot scale horizontally&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q2.&#039;&#039;&#039; Which of the following APIs is NOT supported by Azure Cosmos DB?&lt;br /&gt;
* A. API for MySQL&lt;br /&gt;
* B. API for NoSQL&lt;br /&gt;
* C. API for MongoDB&lt;br /&gt;
* D. API for Cassandra&lt;br /&gt;
&lt;br /&gt;
== Answer Key ==&lt;br /&gt;
&#039;&#039;Answers are listed at the very end so you can attempt the questions first.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Q1 (Azure Cosmos DB):&#039;&#039;&#039; A. Turnkey global distribution across multiple Azure regions with tunable consistency — Azure Cosmos DB provides built-in global distribution and multiple tunable consistency levels, unlike traditional single-region databases.&lt;br /&gt;
* &#039;&#039;&#039;Q2 (Azure Cosmos DB):&#039;&#039;&#039; A. API for MySQL — Azure Cosmos DB supports NoSQL, MongoDB, Cassandra, Gremlin, and Table APIs, but not a dedicated &#039;API for MySQL&#039;.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — term detail page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[:Category:DP-420 Terminology]]&lt;br /&gt;
[[Category:Core Concepts]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=DP-420:_Azure_Cosmos_DB_Developer_Specialty&amp;diff=6251</id>
		<title>DP-420: Azure Cosmos DB Developer Specialty</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=DP-420:_Azure_Cosmos_DB_Developer_Specialty&amp;diff=6251"/>
		<updated>2026-10-26T15:12:09Z</updated>

		<summary type="html">&lt;p&gt;Anko: /* Uncategorized */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB&#039;&#039;&#039; — Key terminology reference for exam preparation.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Core Concepts ==&lt;br /&gt;
; [[Azure Cosmos DB]]&lt;br /&gt;
: Microsoft&#039;s globally distributed, multi-model NoSQL database service for cloud-native apps.&lt;br /&gt;
; [[Request Unit (RU)]]&lt;br /&gt;
: Normalized currency measuring the cost of database operations, independent of hardware.&lt;br /&gt;
; [[Container]]&lt;br /&gt;
: Fundamental unit of scalability/storage in Cosmos DB for NoSQL, analogous to a table.&lt;br /&gt;
; [[Item (Document)]]&lt;br /&gt;
: Fundamental unit of data, stored as a self-describing JSON document within a container.&lt;br /&gt;
; [[API for NoSQL]]&lt;br /&gt;
: Cosmos DB&#039;s native API (formerly SQL API), queried with a SQL-like language; DP-420&#039;s focus.&lt;br /&gt;
; [[OLTP]]&lt;br /&gt;
: Online Transactional Processing; small, fast operations — Cosmos DB&#039;s core transactional workload type.&lt;br /&gt;
; [[OLAP]]&lt;br /&gt;
: Online Analytical Processing; large aggregations and analytical queries over historical data&lt;br /&gt;
&lt;br /&gt;
== Data Modeling &amp;amp; Partitioning ==&lt;br /&gt;
; [[Partition Key]]&lt;br /&gt;
: Property used to distribute items across physical partitions for scalability.&lt;br /&gt;
; [[Logical Partition]]&lt;br /&gt;
: Group of items sharing the same partition key value; max 20 GB storage.&lt;br /&gt;
; [[Physical Partition]]&lt;br /&gt;
: Underlying infrastructure unit hosting one or more logical partitions.&lt;br /&gt;
; [[Synthetic Partition Key]]&lt;br /&gt;
: Concatenated/computed key combining multiple properties for better distribution.&lt;br /&gt;
; [[Hierarchical Partition Key]]&lt;br /&gt;
: Up to 3 levels of partition keys for granular, multi-tenant partitioning.&lt;br /&gt;
; [[Embedding (Denormalization)]]&lt;br /&gt;
: Nesting related data within a single document for fewer round trips.&lt;br /&gt;
; [[Referencing (Normalization)]]&lt;br /&gt;
: Storing related entities as separate documents linked by an id reference.&lt;br /&gt;
; [[Time to Live (TTL)]]&lt;br /&gt;
: Container/item setting that automatically deletes items after a set time.&lt;br /&gt;
; [[Unique Keys]]&lt;br /&gt;
: Container-level constraint enforcing uniqueness of property paths per logical partition.&lt;br /&gt;
&lt;br /&gt;
== Throughput &amp;amp; Scaling ==&lt;br /&gt;
; [[Provisioned Throughput]]&lt;br /&gt;
: Reserved, guaranteed RU/s billed regardless of consumption; suits steady workloads.&lt;br /&gt;
; [[Serverless]]&lt;br /&gt;
: Consumption-based billing for actual RUs used; suits intermittent/unpredictable traffic.&lt;br /&gt;
; [[Autoscale Throughput]]&lt;br /&gt;
: Automatically scales RU/s between 10%-100% of a configured maximum based on demand.&lt;br /&gt;
; [[Database-Level Throughput]]&lt;br /&gt;
: Provisioned throughput shared across all containers in a database.&lt;br /&gt;
; [[az cosmosdb sql container update]]&lt;br /&gt;
: CLI: updates container config (indexing, TTL, unique keys), not throughput.&lt;br /&gt;
; [[az cosmosdb sql container throughput update]]&lt;br /&gt;
: CLI: changes a container&#039;s manual RU/s or autoscale max RU/s.&lt;br /&gt;
; [[az cosmosdb sql container throughput migrate]]&lt;br /&gt;
: CLI: switches a container between manual and autoscale throughput.&lt;br /&gt;
; [[az cosmosdb sql container redistribute-partition-throughput]]&lt;br /&gt;
: CLI: reallocates RU/s unevenly across physical partitions to relieve a hot partition.&lt;br /&gt;
&lt;br /&gt;
== Data Distribution &amp;amp; Consistency ==&lt;br /&gt;
; [[Global Distribution]]&lt;br /&gt;
: Turnkey replication of data across any number of Azure regions, no code changes.&lt;br /&gt;
; [[Consistency Levels]]&lt;br /&gt;
: Five tunable levels (Strong, Bounded Staleness, Session, Consistent Prefix, Eventual).&lt;br /&gt;
; [[Automatic Failover]]&lt;br /&gt;
: Policy that automatically promotes a new write region during a regional outage.&lt;br /&gt;
; [[Multi-Region Writes]]&lt;br /&gt;
: Every region accepts reads and writes simultaneously (multi-master).&lt;br /&gt;
; [[Conflict Resolution Policy]]&lt;br /&gt;
: Defines how concurrent multi-region write conflicts are resolved (e.g., LWW).&lt;br /&gt;
; [[Session Token]]&lt;br /&gt;
: Value guaranteeing a client reads its own writes under session consistency.&lt;br /&gt;
&lt;br /&gt;
== Client Connectivity &amp;amp; SDK ==&lt;br /&gt;
; [[Gateway Mode]]&lt;br /&gt;
: SDK connectivity via a single HTTPS endpoint; more firewall-friendly, higher latency.&lt;br /&gt;
; [[Direct Mode]]&lt;br /&gt;
: SDK connectivity direct to backend replicas over TCP; lower latency, more ports needed.&lt;br /&gt;
; [[Cosmos DB Emulator]]&lt;br /&gt;
: Local, offline tool emulating Cosmos DB for development/testing without Azure cost.&lt;br /&gt;
; [[Point Operation]]&lt;br /&gt;
: Single-item operation using id + partition key, more RU-efficient than a query.&lt;br /&gt;
; [[Patch Operation]]&lt;br /&gt;
: Partial update of specific item properties without replacing the whole document.&lt;br /&gt;
; [[Transactional Batch]]&lt;br /&gt;
: Groups multiple point operations on the same logical partition into one atomic transaction.&lt;br /&gt;
; [[Bulk Support]]&lt;br /&gt;
: SDK feature optimized for loading/updating large volumes of items across many partitions.&lt;br /&gt;
; [[Optimistic Concurrency (ETag)]]&lt;br /&gt;
: Uses the ETag property with if-match preconditions to detect write conflicts.&lt;br /&gt;
; [[Continuation Token]]&lt;br /&gt;
: Opaque value used to resume a paginated query/feed from where the last page left off.&lt;br /&gt;
; [[Cross-Partition Query]]&lt;br /&gt;
: Query spanning multiple physical partitions; tuned via MaxConcurrency and MaxBufferedItemCount.&lt;br /&gt;
; [[429 Throttling Error]]&lt;br /&gt;
: Error indicating a request was rate-limited due to exceeding provisioned RU/s.&lt;br /&gt;
; [[isTombstone]]&lt;br /&gt;
&lt;br /&gt;
== Server-Side Programming ==&lt;br /&gt;
; [[x-ms-retry-after-ms]]&lt;br /&gt;
: http header value that represents in milliseconds the minimal waiting time between requests.&lt;br /&gt;
; [[Item response, Feed response]]&lt;br /&gt;
: Contains both returned data plus request charge, session token, and ETag&lt;br /&gt;
; [[Queries]]&lt;br /&gt;
: Queries&lt;br /&gt;
; [[Stored Procedure]]&lt;br /&gt;
: JavaScript logic executed server-side within a single logical partition transaction.&lt;br /&gt;
; [[BulkImportResponse]]&lt;br /&gt;
: Return object of the classic bulkImport stored procedure pattern; reports numDocsImported/continuation.&lt;br /&gt;
; [[Trigger]]&lt;br /&gt;
: Pre- or post-operation JavaScript logic, explicitly invoked by the client per request.&lt;br /&gt;
; [[User-Defined Function (UDF)]]&lt;br /&gt;
: Read-only JavaScript function extending SQL queries with custom computations.&lt;br /&gt;
; [[Aggregate Functions (COUNT, SUM, AVG, MIN, MAX)]]&lt;br /&gt;
: Built-in SQL aggregate operators (COUNT, SUM, AVG, MIN, MAX) used with GROUP BY.&lt;br /&gt;
; [[EXISTS &amp;amp; Array Functions (IS_ARRAY, ARRAY_CONTAINS)]]&lt;br /&gt;
: SQL subquery and array functions (EXISTS, IS_ARRAY, ARRAY_CONTAINS, ARRAY_LENGTH) for nested data.&lt;br /&gt;
&lt;br /&gt;
== Integration &amp;amp; Analytics ==&lt;br /&gt;
; [[Change Feed]]&lt;br /&gt;
: Persistent, ordered log of item inserts/updates, consumable by apps and Azure Functions.&lt;br /&gt;
; [[Full-Text Query]]&lt;br /&gt;
: Native keyword search via FULLTEXTCONTAINS/FULLTEXTSCORE, backed by a full-text index.&lt;br /&gt;
; [[HTAP (Hybrid Transactional and Analytical Processing)]]&lt;br /&gt;
: Architecture running analytics over operational data without impacting transactional OLTP RUs, enabled via Synapse Link/analytical store.&lt;br /&gt;
; [[Azure Synapse Link / Analytical Store]]&lt;br /&gt;
: Near real-time analytics via a separate column-store, no RU impact on transactional data.&lt;br /&gt;
; [[Azure Cosmos DB Mirroring for Fabric]]&lt;br /&gt;
: Near real-time replication of Cosmos DB data into Microsoft Fabric&#039;s OneLake.&lt;br /&gt;
; [[OneLake]]&lt;br /&gt;
: Fabric&#039;s single, unified, tenant-wide data lake storing all workloads&#039; data in Delta format.&lt;br /&gt;
; [[Delta Format]]&lt;br /&gt;
: Open-source ACID table format (Delta Lake) used for all data stored in OneLake.&lt;br /&gt;
; [[Apache Spark]]&lt;br /&gt;
: Distributed processing engine used in Synapse/Fabric notebooks to analyze Cosmos DB data.&lt;br /&gt;
; [[Serverless SQL Pool]]&lt;br /&gt;
: On-demand T-SQL query service in Azure Synapse to query Cosmos DB analytical store via OPENROWSET.&lt;br /&gt;
; [[Direct Lake]]&lt;br /&gt;
: Power BI mode reading Delta tables directly from OneLake — near-Import speed, always fresh.&lt;br /&gt;
; [[Azure Functions Integration]]&lt;br /&gt;
: Serverless compute triggered by Cosmos DB change feed for event-driven processing, denormalization, and data movement.&lt;br /&gt;
; [[Azure Logic Apps]]&lt;br /&gt;
: Low-code cloud workflow automation service integrating with Cosmos DB via connectors, triggers, and actions.&lt;br /&gt;
; [[Azure AI Search Integration]]&lt;br /&gt;
: Indexer pulls Cosmos DB data (via change feed) to enable full-text/semantic search.&lt;br /&gt;
&lt;br /&gt;
== Optimization ==&lt;br /&gt;
; [[Indexing Policy]]&lt;br /&gt;
: Defines which properties are indexed, trading off query performance vs. write RU cost.&lt;br /&gt;
; [[Range Index]]&lt;br /&gt;
: Default index type for string/numeric properties; supports equality, range, and ORDER BY.&lt;br /&gt;
; [[Spatial Index]]&lt;br /&gt;
: Accelerates geospatial queries (ST_DISTANCE, ST_WITHIN) over GeoJSON properties.&lt;br /&gt;
; [[Composite Index]]&lt;br /&gt;
: Index across multiple properties to support efficient multi-property filter/sort queries.&lt;br /&gt;
; [[Vector Index]]&lt;br /&gt;
: Enables approximate nearest-neighbor similarity search over embeddings for AI/RAG scenarios.&lt;br /&gt;
; [[Wildcard / Included &amp;amp; Excluded Paths]]&lt;br /&gt;
: Path expressions (with optional /* wildcard) controlling exactly which properties are indexed.&lt;br /&gt;
; [[Integrated Cache]]&lt;br /&gt;
: In-memory caching layer (via dedicated gateway) reducing RU cost/latency for repeated reads.&lt;br /&gt;
; [[Change Feed Estimator]]&lt;br /&gt;
: Reports pending change feed lag to help decide when to scale out consumer instances.&lt;br /&gt;
&lt;br /&gt;
== Maintenance &amp;amp; Security ==&lt;br /&gt;
; [[Alerts]]&lt;br /&gt;
: Cosmo DB alerts&lt;br /&gt;
; [[Normalized RU Consumption]]&lt;br /&gt;
: Azure Monitor metric showing % of provisioned throughput used; flags hot partitions.&lt;br /&gt;
; [[PartitionKeyRUConsumption (Diagnostic Log)]]&lt;br /&gt;
: Per-second RU/s consumption per partition key; pinpoints hot partitions.&lt;br /&gt;
; [[PartitionKeyStatistics (Diagnostic Log)]]&lt;br /&gt;
: Estimated storage size (KB) per logical partition key; flags storage skew.&lt;br /&gt;
; [[QueryRuntimeStatistics (Diagnostic Log)]]&lt;br /&gt;
: Logs query operations against the account for query performance analysis.&lt;br /&gt;
; [[ControlPlaneRequests (Diagnostic Log)]]&lt;br /&gt;
: Logs account control-plane operations, e.g. adding/removing replication regions.&lt;br /&gt;
; [[DataPlaneRequests (Diagnostic Log)]]&lt;br /&gt;
: Logs item-level create/read/replace/delete/query operations with RU charge and duration.&lt;br /&gt;
; [[KQL (Kusto Query Language)]]&lt;br /&gt;
: Query language used in Azure Monitor Log Analytics to analyze Cosmos DB diagnostic logs and metrics.&lt;br /&gt;
; [[Periodic Backup]]&lt;br /&gt;
: Original backup mode; scheduled snapshots, typically restored via a support request.&lt;br /&gt;
; [[Continuous Backup &amp;amp; Point-in-Time Restore]]&lt;br /&gt;
: Continuous backups enabling self-service restore to any timestamp in the retention window.&lt;br /&gt;
; [[Customer-Managed Keys]]&lt;br /&gt;
: Encrypt data at rest using a key you control in Azure Key Vault.&lt;br /&gt;
; [[Data Encryption Key (DEK)]]&lt;br /&gt;
: for Always Encrypted in Azure Cosmos DB, you must use the Azure Cosmos DB SDK (C#, Java, or Node.js).&lt;br /&gt;
; [[RBAC for Data Plane]]&lt;br /&gt;
: Fine-grained Microsoft Entra ID permissions for data operations, avoiding shared account keys.&lt;br /&gt;
; [[Cosmos DB Operator]]&lt;br /&gt;
: Provisions accounts, databases, and containers; cannot access data or use Data Explorer.&lt;br /&gt;
; [[Cosmos DB Account Reader Role]]&lt;br /&gt;
: Can read Azure Cosmos DB account data; cannot provision resources or make changes.&lt;br /&gt;
; [[Cosmos Backup Operator]]&lt;br /&gt;
: Submits a restore request for a periodic backup-enabled database or container.&lt;br /&gt;
; [[CosmosRestoreOperator]]&lt;br /&gt;
: Performs the restore action for an account in continuous backup mode.&lt;br /&gt;
; [[Always Encrypted]]&lt;br /&gt;
: Client-side encryption ensuring Cosmos DB never sees plaintext values of protected properties.&lt;br /&gt;
; [[Azure Data Factory (Data Movement)]]&lt;br /&gt;
: Pipeline-based ETL/ELT service for moving data into/out of Cosmos DB.&lt;br /&gt;
; [[ARM Templates (Infrastructure as Code)]]&lt;br /&gt;
: Declarative, version-controlled provisioning of Cosmos DB resources as code.&lt;br /&gt;
; [[log-analytics]]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — terminology reference&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:DP-420 Terminology]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Test&amp;diff=6250</id>
		<title>Test</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Test&amp;diff=6250"/>
		<updated>2026-10-26T15:07:46Z</updated>

		<summary type="html">&lt;p&gt;Anko: Recreated DP-420 term page: test (Uncategorized)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;larr; Back to [[DP-420: Azure Cosmos DB Developer Specialty|DP-420 Terminology Reference]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Uncategorized&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — term detail page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:DP-420 Terminology]]&lt;br /&gt;
[[Category:Uncategorized]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Log-analytics&amp;diff=6249</id>
		<title>Log-analytics</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Log-analytics&amp;diff=6249"/>
		<updated>2026-10-26T15:07:46Z</updated>

		<summary type="html">&lt;p&gt;Anko: Recreated DP-420 term page: log-analytics (Maintenance &amp;amp; Security)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;larr; Back to [[DP-420: Azure Cosmos DB Developer Specialty|DP-420 Terminology Reference]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Maintenance &amp;amp; Security&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
It can save data in:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| Table                            | Purpose                                    | When to Use                        | DP-420 Keywords                                           |&lt;br /&gt;
| -------------------------------- | ------------------------------------------ | ---------------------------------- | --------------------------------------------------------- |&lt;br /&gt;
| **CDBDataPlaneRequests**         | Individual requests made against Cosmos DB | Troubleshoot specific operations   | Request charge, latency, 429, point read, query           |&lt;br /&gt;
| **CDBDataPlaneRequests5M**       | Aggregated metrics over 5-minute windows   | Trend analysis and dashboards      | Throughput trends, average latency, request counts        |&lt;br /&gt;
| **CDBPartitionKeyRUConsumption** | RU consumption per partition key           | Find hot partitions                | Hot partition, skewed workload, RU distribution           |&lt;br /&gt;
| **CDBPartitionKeyStatistics**    | Statistics about partition key usage       | Analyze partitioning effectiveness | Partition cardinality, partition growth, partition design |&lt;br /&gt;
| **CDBQueryRuntimeStatistics**    | Query execution details                    | Optimize queries                   | Index utilization, query performance, scans               |&lt;br /&gt;
            &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Send to Log Analytics workspace&lt;br /&gt;
* Send to storage account&lt;br /&gt;
* Send to event hub&lt;br /&gt;
* Send to another Azure Monitor log&lt;br /&gt;
* Send to Azure&lt;br /&gt;
&lt;br /&gt;
== More Info &amp;amp; Links ==&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/log-analytics/tutorial-kql Microsoft Learn: Tutorial - Write KQL queries to monitor Azure Cosmos DB]&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query/ Microsoft Learn: Overview of Kusto Query Language (KQL)]&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/cosmos-db/monitor-resource-logs Microsoft Learn: Monitor and troubleshoot Azure Cosmos DB using diagnostic logs]&lt;br /&gt;
&lt;br /&gt;
== DP-420 Style Practice Questions ==&lt;br /&gt;
&#039;&#039;&#039;Q1.&#039;&#039;&#039; What is the primary role of KQL (Kusto Query Language) in Azure Cosmos DB operations and troubleshooting?&lt;br /&gt;
* A. Querying and analyzing diagnostic logs and metrics in Azure Monitor Log Analytics to troubleshoot issues like throttling, hot partitions, and expensive queries&lt;br /&gt;
* B. Defining server-side stored procedures and triggers directly in Cosmos DB containers&lt;br /&gt;
* C. Querying JSON documents via the Cosmos DB API for NoSQL endpoint&lt;br /&gt;
* D. Creating and managing Cosmos DB indexing policies declaratively&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q2.&#039;&#039;&#039; In a KQL query for Azure Cosmos DB logs, what does the pipe (|) operator represent?&lt;br /&gt;
* A. It pipes the tabular output of the preceding operator as the input to the next operator in a data-flow pipeline&lt;br /&gt;
* B. It performs a logical bitwise OR between two numeric fields&lt;br /&gt;
* C. It defines a primary key constraint on the diagnostic table&lt;br /&gt;
* D. It separates alternative partition key values in a point read&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q3.&#039;&#039;&#039; Which resource-specific table would you query using KQL to inspect RU charges and HTTP status codes for individual data operations?&lt;br /&gt;
* A. CDBDataPlaneRequests&lt;br /&gt;
* B. CDBControlPlaneRequests&lt;br /&gt;
* C. CDBPartitionKeyStatistics&lt;br /&gt;
* D. AzureMetrics&lt;br /&gt;
&lt;br /&gt;
== Answer Key ==&lt;br /&gt;
&#039;&#039;Answers are listed at the very end so you can attempt the questions first.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Q1 (KQL (Kusto Query Language)):&#039;&#039;&#039; A. Querying and analyzing diagnostic logs and metrics in Azure Monitor Log Analytics to troubleshoot issues like throttling, hot partitions, and expensive queries — KQL is the read-only query language for Azure Monitor Log Analytics used to analyze diagnostic logs like CDBDataPlaneRequests and CDBPartitionKeyRUConsumption.&lt;br /&gt;
* &#039;&#039;&#039;Q2 (KQL (Kusto Query Language)):&#039;&#039;&#039; A. It pipes the tabular output of the preceding operator as the input to the next operator in a data-flow pipeline — KQL uses the pipe (|) operator to pass data sequentially from one tabular expression/operator to another (e.g., filtering with where, then aggregating with summarize).&lt;br /&gt;
* &#039;&#039;&#039;Q3 (KQL (Kusto Query Language)):&#039;&#039;&#039; A. CDBDataPlaneRequests — CDBDataPlaneRequests logs individual data-plane operations along with RequestCharge, StatusCode, DurationMs, and ActivityId.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — term detail page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:DP-420 Terminology]]&lt;br /&gt;
[[Category:Maintenance &amp;amp; Security]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=IsTombstone&amp;diff=6248</id>
		<title>IsTombstone</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=IsTombstone&amp;diff=6248"/>
		<updated>2026-10-26T15:07:46Z</updated>

		<summary type="html">&lt;p&gt;Anko: Recreated DP-420 term page: isTombstone (Client Connectivity &amp;amp; SDK)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;larr; Back to [[DP-420: Azure Cosmos DB Developer Specialty|DP-420 Terminology Reference]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Client Connectivity &amp;amp; SDK&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Tombstone in Azure Cosmos DB: When an item is deleted from a container, Azure Cosmos DB marks the item as a &amp;quot;tombstone&amp;quot; to ensure that the deletion is propagated correctly across all replicas in a distributed system. This ensures that the deleted item does not reappear after a replica catches up or after a period of network partition.   For DP-420, if you see tombstones, think:  Change Feed  Delete notifications  All Versions and Deletes mode  CDC (similar to SQL Server Change Data Capture)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| Mode                          | Creates | Updates | Deletes        |&lt;br /&gt;
| ----------------------------- | ------- | ------- | -------------- |&lt;br /&gt;
| Latest Version Mode           | ✅       | ✅       | ❌              |&lt;br /&gt;
| All Versions and Deletes Mode | ✅       | ✅       | ✅ (tombstones) |&lt;br /&gt;
&lt;br /&gt;
      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== More Info &amp;amp; Links ==&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/conceptual-resilient-sdk-applications Microsoft Learn: Handling rate limiting / request rate too large]&lt;br /&gt;
&lt;br /&gt;
== DP-420 Style Practice Questions ==&lt;br /&gt;
&#039;&#039;&#039;Q1.&#039;&#039;&#039; What does a 429 error from Azure Cosmos DB typically indicate?&lt;br /&gt;
* A. The request was throttled because provisioned throughput (RU/s) was exceeded&lt;br /&gt;
* B. The requested item does not exist&lt;br /&gt;
* C. An authentication failure occurred&lt;br /&gt;
* D. A conflict occurred during multi-region writes&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q2.&#039;&#039;&#039; Which of these could help reduce the frequency of 429 errors?&lt;br /&gt;
* A. Improving partition key distribution to avoid hot partitions, or increasing provisioned RU/s&lt;br /&gt;
* B. Disabling the SDK&#039;s automatic retry policy&lt;br /&gt;
* C. Switching to gateway mode exclusively&lt;br /&gt;
* D. Reducing the number of properties indexed&lt;br /&gt;
&lt;br /&gt;
== Answer Key ==&lt;br /&gt;
&#039;&#039;Answers are listed at the very end so you can attempt the questions first.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Q1 (429 Throttling Error):&#039;&#039;&#039; A. The request was throttled because provisioned throughput (RU/s) was exceeded — A 429 status code means the request rate exceeded the provisioned RU/s, triggering throttling.&lt;br /&gt;
* &#039;&#039;&#039;Q2 (429 Throttling Error):&#039;&#039;&#039; A. Improving partition key distribution to avoid hot partitions, or increasing provisioned RU/s — Better partition key distribution and/or higher provisioned throughput both help reduce 429 throttling errors.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — term detail page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:DP-420 Terminology]]&lt;br /&gt;
[[Category:Client Connectivity &amp;amp; SDK]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=ARM_Templates_(Infrastructure_as_Code)&amp;diff=6247</id>
		<title>ARM Templates (Infrastructure as Code)</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=ARM_Templates_(Infrastructure_as_Code)&amp;diff=6247"/>
		<updated>2026-10-26T15:07:45Z</updated>

		<summary type="html">&lt;p&gt;Anko: Recreated DP-420 term page: ARM Templates (Infrastructure as Code) (Maintenance &amp;amp; Security)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;larr; Back to [[DP-420: Azure Cosmos DB Developer Specialty|DP-420 Terminology Reference]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Maintenance &amp;amp; Security&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Declarative, version-controlled provisioning of Cosmos DB resources as code.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Azure Resource Manager (ARM) templates (and equivalents like Bicep) allow you to declaratively define and provision Azure Cosmos DB resources — accounts, databases, containers, throughput settings, and indexing policies — as code, enabling repeatable, version-controlled deployments as part of a DevOps process, as opposed to imperative, manual configuration through the Azure portal or CLI commands.&lt;br /&gt;
&lt;br /&gt;
== More Info &amp;amp; Links ==&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/cosmos-db/manage-with-templates Microsoft Learn: Manage Azure Cosmos DB resources with ARM templates]&lt;br /&gt;
&lt;br /&gt;
== DP-420 Style Practice Questions ==&lt;br /&gt;
&#039;&#039;&#039;Q1.&#039;&#039;&#039; What is the main advantage of provisioning Azure Cosmos DB resources using ARM templates instead of the Azure portal?&lt;br /&gt;
* A. Declarative, repeatable, and version-controlled infrastructure as code&lt;br /&gt;
* B. Lower RU cost for provisioned throughput&lt;br /&gt;
* C. Automatic point-in-time restore&lt;br /&gt;
* D. Elimination of the need for a partition key&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q2.&#039;&#039;&#039; Which of these can be maintained in production using ARM templates, per the DP-420 objectives?&lt;br /&gt;
* A. Indexing policies&lt;br /&gt;
* B. The account&#039;s region priority list only&lt;br /&gt;
* C. The change feed estimator&lt;br /&gt;
* D. The integrated cache&lt;br /&gt;
&lt;br /&gt;
== Answer Key ==&lt;br /&gt;
&#039;&#039;Answers are listed at the very end so you can attempt the questions first.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Q1 (ARM Templates (Infrastructure as Code)):&#039;&#039;&#039; A. Declarative, repeatable, and version-controlled infrastructure as code — ARM templates provide declarative, repeatable infrastructure-as-code deployments suitable for DevOps pipelines.&lt;br /&gt;
* &#039;&#039;&#039;Q2 (ARM Templates (Infrastructure as Code)):&#039;&#039;&#039; A. Indexing policies — The DP-420 objectives specifically call out maintaining indexing policies in production using ARM templates.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — term detail page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:DP-420 Terminology]]&lt;br /&gt;
[[Category:Maintenance &amp;amp; Security]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Azure_Data_Factory_(Data_Movement)&amp;diff=6246</id>
		<title>Azure Data Factory (Data Movement)</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Azure_Data_Factory_(Data_Movement)&amp;diff=6246"/>
		<updated>2026-10-26T15:07:45Z</updated>

		<summary type="html">&lt;p&gt;Anko: Recreated DP-420 term page: Azure Data Factory (Data Movement) (Maintenance &amp;amp; Security)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;larr; Back to [[DP-420: Azure Cosmos DB Developer Specialty|DP-420 Terminology Reference]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Maintenance &amp;amp; Security&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Pipeline-based ETL/ELT service for moving data into/out of Cosmos DB.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Azure Data Factory is a cloud ETL/ELT service that can be used to move data into or out of Azure Cosmos DB as part of pipeline-based data movement strategies — such as bulk-loading data from other sources, or migrating/copying data between Cosmos DB accounts or containers — as an alternative to using SDK bulk operations, Kafka connectors, or Stream Analytics for data movement.&lt;br /&gt;
&lt;br /&gt;
== More Info &amp;amp; Links ==&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/data-factory/connector-azure-cosmos-db Microsoft Learn: Copy data to/from Azure Cosmos DB using ADF]&lt;br /&gt;
&lt;br /&gt;
== DP-420 Style Practice Questions ==&lt;br /&gt;
&#039;&#039;&#039;Q1.&#039;&#039;&#039; Which Azure service provides pipeline-based ETL/ELT capabilities for moving data into or out of Azure Cosmos DB?&lt;br /&gt;
* A. Azure Data Factory&lt;br /&gt;
* B. Azure Bastion&lt;br /&gt;
* C. Azure Front Door&lt;br /&gt;
* D. Azure DNS&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q2.&#039;&#039;&#039; Besides Azure Data Factory, which of these is also a valid data movement option for Azure Cosmos DB mentioned in the DP-420 objectives?&lt;br /&gt;
* A. A Kafka connector&lt;br /&gt;
* B. Always Encrypted&lt;br /&gt;
* C. A composite index&lt;br /&gt;
* D. A trigger&lt;br /&gt;
&lt;br /&gt;
== Answer Key ==&lt;br /&gt;
&#039;&#039;Answers are listed at the very end so you can attempt the questions first.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Q1 (Azure Data Factory (Data Movement)):&#039;&#039;&#039; A. Azure Data Factory — Azure Data Factory (and Azure Synapse pipelines) provide pipeline-based data movement capabilities for Cosmos DB.&lt;br /&gt;
* &#039;&#039;&#039;Q2 (Azure Data Factory (Data Movement)):&#039;&#039;&#039; A. A Kafka connector — The DP-420 objectives list SDK bulk operations, ADF/Synapse pipelines, a Kafka connector, Stream Analytics, and the Spark connector as data movement options.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — term detail page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:DP-420 Terminology]]&lt;br /&gt;
[[Category:Maintenance &amp;amp; Security]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Always_Encrypted&amp;diff=6245</id>
		<title>Always Encrypted</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Always_Encrypted&amp;diff=6245"/>
		<updated>2026-10-26T15:07:45Z</updated>

		<summary type="html">&lt;p&gt;Anko: Recreated DP-420 term page: Always Encrypted (Maintenance &amp;amp; Security)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;larr; Back to [[DP-420: Azure Cosmos DB Developer Specialty|DP-420 Terminology Reference]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Maintenance &amp;amp; Security&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Client-side encryption ensuring Cosmos DB never sees plaintext values of protected properties.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Always Encrypted for Azure Cosmos DB is a client-side encryption feature that encrypts sensitive data (specific properties) before it leaves the client application, ensuring that even Azure Cosmos DB itself never sees the plaintext values. Encryption and decryption happen using keys managed by the client, typically backed by Azure Key Vault, providing strong protection for highly sensitive fields.&lt;br /&gt;
&lt;br /&gt;
== More Info &amp;amp; Links ==&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/cosmos-db/how-to-always-encrypted Microsoft Learn: Always Encrypted for Azure Cosmos DB]&lt;br /&gt;
&lt;br /&gt;
== DP-420 Style Practice Questions ==&lt;br /&gt;
&#039;&#039;&#039;Q1.&#039;&#039;&#039; What does Always Encrypted for Azure Cosmos DB protect against?&lt;br /&gt;
* A. Azure Cosmos DB (and anyone with access to the service) ever seeing plaintext values of protected properties&lt;br /&gt;
* B. Network-level attacks only&lt;br /&gt;
* C. Only attacks that occur during backup and restore&lt;br /&gt;
* D. Loss of the primary account key only&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q2.&#039;&#039;&#039; Where does encryption/decryption occur when using Always Encrypted?&lt;br /&gt;
* A. On the client side, before data leaves the application&lt;br /&gt;
* B. On the Cosmos DB server, before storage&lt;br /&gt;
* C. In transit only, using TLS&lt;br /&gt;
* D. Only during backup operations&lt;br /&gt;
&lt;br /&gt;
== Answer Key ==&lt;br /&gt;
&#039;&#039;Answers are listed at the very end so you can attempt the questions first.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Q1 (Always Encrypted):&#039;&#039;&#039; A. Azure Cosmos DB (and anyone with access to the service) ever seeing plaintext values of protected properties — Always Encrypted ensures the database service itself never has access to plaintext values, protecting against server-side exposure.&lt;br /&gt;
* &#039;&#039;&#039;Q2 (Always Encrypted):&#039;&#039;&#039; A. On the client side, before data leaves the application — Always Encrypted performs client-side encryption/decryption, so sensitive data is never exposed in plaintext to the service.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — term detail page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:DP-420 Terminology]]&lt;br /&gt;
[[Category:Maintenance &amp;amp; Security]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=CosmosRestoreOperator&amp;diff=6244</id>
		<title>CosmosRestoreOperator</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=CosmosRestoreOperator&amp;diff=6244"/>
		<updated>2026-10-26T15:07:44Z</updated>

		<summary type="html">&lt;p&gt;Anko: Recreated DP-420 term page: CosmosRestoreOperator (Maintenance &amp;amp; Security)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;larr; Back to [[DP-420: Azure Cosmos DB Developer Specialty|DP-420 Terminology Reference]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Maintenance &amp;amp; Security&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Performs the restore action for an account in continuous backup mode.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
CosmosRestoreOperator is a built-in Azure RBAC (control-plane) role that can perform a restore action for an Azure Cosmos DB account in continuous backup mode, without granting broader account management or item data access permissions. This complements Cosmos Backup Operator, which instead submits restore requests for periodic backup-enabled databases/containers — the appropriate role depends on which backup mode (Periodic Backup or Continuous Backup &amp;amp; Point-in-Time Restore) the account uses.&lt;br /&gt;
&lt;br /&gt;
== More Info &amp;amp; Links ==&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles/databases#cosmosrestoreoperator Microsoft Learn: Azure built-in roles for Azure Cosmos DB]&lt;br /&gt;
&lt;br /&gt;
== DP-420 Style Practice Questions ==&lt;br /&gt;
&#039;&#039;&#039;Q1.&#039;&#039;&#039; What permission does the CosmosRestoreOperator role grant?&lt;br /&gt;
* A. The ability to perform a restore action for an account in continuous backup mode&lt;br /&gt;
* B. The ability to submit a periodic backup restore request&lt;br /&gt;
* C. The ability to read item data using Data Explorer&lt;br /&gt;
* D. The ability to provision new databases and containers&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q2.&#039;&#039;&#039; Which role would you assign to submit a restore request for a periodic backup-enabled container instead?&lt;br /&gt;
* A. Cosmos Backup Operator&lt;br /&gt;
* B. Cosmos DB Operator&lt;br /&gt;
* C. Cosmos DB Account Reader Role&lt;br /&gt;
* D. CosmosRestoreOperator&lt;br /&gt;
&lt;br /&gt;
== Answer Key ==&lt;br /&gt;
&#039;&#039;Answers are listed at the very end so you can attempt the questions first.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Q1 (CosmosRestoreOperator):&#039;&#039;&#039; A. The ability to perform a restore action for an account in continuous backup mode — CosmosRestoreOperator specifically enables restoring an account that has continuous backup mode enabled.&lt;br /&gt;
* &#039;&#039;&#039;Q2 (CosmosRestoreOperator):&#039;&#039;&#039; A. Cosmos Backup Operator — Cosmos Backup Operator is used for periodic backup restore requests, while CosmosRestoreOperator applies to continuous backup mode.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — term detail page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:DP-420 Terminology]]&lt;br /&gt;
[[Category:Maintenance &amp;amp; Security]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Cosmos_Backup_Operator&amp;diff=6243</id>
		<title>Cosmos Backup Operator</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Cosmos_Backup_Operator&amp;diff=6243"/>
		<updated>2026-10-26T15:07:44Z</updated>

		<summary type="html">&lt;p&gt;Anko: Recreated DP-420 term page: Cosmos Backup Operator (Maintenance &amp;amp; Security)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;larr; Back to [[DP-420: Azure Cosmos DB Developer Specialty|DP-420 Terminology Reference]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Maintenance &amp;amp; Security&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Submits a restore request for a periodic backup-enabled database or container.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Cosmos Backup Operator is a built-in Azure RBAC (control-plane) role that can submit a restore request from the Azure portal for a periodic backup-enabled database or container, without granting the ability to read or write item data. This is distinct from CosmosRestoreOperator, which instead performs a restore action for an account configured in continuous backup mode — the two roles apply to the two different backup modes (Periodic Backup vs. Continuous Backup &amp;amp; Point-in-Time Restore).&lt;br /&gt;
&lt;br /&gt;
== More Info &amp;amp; Links ==&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles/databases#cosmos-backup-operator Microsoft Learn: Azure built-in roles for Azure Cosmos DB]&lt;br /&gt;
&lt;br /&gt;
== DP-420 Style Practice Questions ==&lt;br /&gt;
&#039;&#039;&#039;Q1.&#039;&#039;&#039; What does the Cosmos Backup Operator built-in role allow?&lt;br /&gt;
* A. Submitting a restore request from the Azure portal for a periodic backup-enabled database or container&lt;br /&gt;
* B. Restoring a continuous-backup-enabled account directly&lt;br /&gt;
* C. Reading and writing items directly&lt;br /&gt;
* D. Provisioning new Azure Cosmos DB accounts&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q2.&#039;&#039;&#039; How does Cosmos Backup Operator differ from CosmosRestoreOperator?&lt;br /&gt;
* A. Backup Operator submits restore requests for periodic backup, while CosmosRestoreOperator performs restores for continuous backup accounts&lt;br /&gt;
* B. They are the same role with two names&lt;br /&gt;
* C. Backup Operator can read item data, but CosmosRestoreOperator cannot&lt;br /&gt;
* D. CosmosRestoreOperator only works with periodic backup mode&lt;br /&gt;
&lt;br /&gt;
== Answer Key ==&lt;br /&gt;
&#039;&#039;Answers are listed at the very end so you can attempt the questions first.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Q1 (Cosmos Backup Operator):&#039;&#039;&#039; A. Submitting a restore request from the Azure portal for a periodic backup-enabled database or container — Cosmos Backup Operator submits restore requests for periodic backup-enabled databases/containers, not for continuous backup accounts.&lt;br /&gt;
* &#039;&#039;&#039;Q2 (Cosmos Backup Operator):&#039;&#039;&#039; A. Backup Operator submits restore requests for periodic backup, while CosmosRestoreOperator performs restores for continuous backup accounts — Cosmos Backup Operator handles periodic backup restore requests, whereas CosmosRestoreOperator restores accounts in continuous backup mode.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — term detail page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:DP-420 Terminology]]&lt;br /&gt;
[[Category:Maintenance &amp;amp; Security]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Cosmos_DB_Account_Reader_Role&amp;diff=6242</id>
		<title>Cosmos DB Account Reader Role</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Cosmos_DB_Account_Reader_Role&amp;diff=6242"/>
		<updated>2026-10-26T15:07:44Z</updated>

		<summary type="html">&lt;p&gt;Anko: Recreated DP-420 term page: Cosmos DB Account Reader Role (Maintenance &amp;amp; Security)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;larr; Back to [[DP-420: Azure Cosmos DB Developer Specialty|DP-420 Terminology Reference]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Maintenance &amp;amp; Security&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Can read Azure Cosmos DB account data; cannot provision resources or make changes.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Cosmos DB Account Reader Role is a built-in Azure RBAC (control-plane) role that can read Azure Cosmos DB account data — including viewing account configuration and reading item data — without permission to make any changes to the account or its resources. It is commonly assigned to auditors, monitoring tools, or team members who need read visibility into an account without provisioning rights (contrast with Cosmos DB Operator, which can provision resources but not read data).&lt;br /&gt;
&lt;br /&gt;
== More Info &amp;amp; Links ==&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles/databases#cosmosdb-account-reader-role Microsoft Learn: Azure built-in roles for Azure Cosmos DB]&lt;br /&gt;
&lt;br /&gt;
== DP-420 Style Practice Questions ==&lt;br /&gt;
&#039;&#039;&#039;Q1.&#039;&#039;&#039; What does the Cosmos DB Account Reader Role permit?&lt;br /&gt;
* A. Reading Azure Cosmos DB account data and configuration, without making changes&lt;br /&gt;
* B. Provisioning new databases and containers&lt;br /&gt;
* C. Restoring a deleted account from continuous backup&lt;br /&gt;
* D. Submitting a periodic backup restore request&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q2.&#039;&#039;&#039; How does Cosmos DB Account Reader Role differ from Cosmos DB Operator?&lt;br /&gt;
* A. Account Reader can read account data but cannot provision resources, while Cosmos DB Operator can provision resources but cannot access data&lt;br /&gt;
* B. They are identical roles with different names&lt;br /&gt;
* C. Account Reader can restore accounts, while Cosmos DB Operator cannot&lt;br /&gt;
* D. Cosmos DB Operator can read data but not provision resources&lt;br /&gt;
&lt;br /&gt;
== Answer Key ==&lt;br /&gt;
&#039;&#039;Answers are listed at the very end so you can attempt the questions first.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Q1 (Cosmos DB Account Reader Role):&#039;&#039;&#039; A. Reading Azure Cosmos DB account data and configuration, without making changes — This role provides read access to account data/configuration but no ability to modify resources or provision new ones.&lt;br /&gt;
* &#039;&#039;&#039;Q2 (Cosmos DB Account Reader Role):&#039;&#039;&#039; A. Account Reader can read account data but cannot provision resources, while Cosmos DB Operator can provision resources but cannot access data — Account Reader is read-focused on data/configuration, whereas Cosmos DB Operator is focused on provisioning without data access.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — term detail page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:DP-420 Terminology]]&lt;br /&gt;
[[Category:Maintenance &amp;amp; Security]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Cosmos_DB_Operator&amp;diff=6241</id>
		<title>Cosmos DB Operator</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Cosmos_DB_Operator&amp;diff=6241"/>
		<updated>2026-10-26T15:07:43Z</updated>

		<summary type="html">&lt;p&gt;Anko: Recreated DP-420 term page: Cosmos DB Operator (Maintenance &amp;amp; Security)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;larr; Back to [[DP-420: Azure Cosmos DB Developer Specialty|DP-420 Terminology Reference]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Maintenance &amp;amp; Security&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Provisions accounts, databases, and containers; cannot access data or use Data Explorer.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Cosmos DB Operator is a built-in Azure RBAC (control-plane/ARM) role that lets you provision Azure Cosmos DB accounts, databases, and containers, but cannot access any data (item reads/writes) or use Data Explorer, and cannot read account keys/connection strings. It is distinct from Cosmos DB Account Reader Role (which can read account data), Cosmos Backup Operator (which manages periodic backup restore requests), and CosmosRestoreOperator (which restores continuous-backup accounts) — Cosmos DB Operator is purely about provisioning infrastructure.&lt;br /&gt;
&lt;br /&gt;
== More Info &amp;amp; Links ==&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles/databases#cosmos-db-operator Microsoft Learn: Azure built-in roles for Azure Cosmos DB]&lt;br /&gt;
&lt;br /&gt;
== DP-420 Style Practice Questions ==&lt;br /&gt;
&#039;&#039;&#039;Q1.&#039;&#039;&#039; What can the Cosmos DB Operator built-in role do?&lt;br /&gt;
* A. Provision Azure Cosmos DB accounts, databases, and containers, without accessing data or using Data Explorer&lt;br /&gt;
* B. Read item data using Data Explorer&lt;br /&gt;
* C. Restore a deleted Azure Cosmos DB account&lt;br /&gt;
* D. Submit a periodic backup restore request&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q2.&#039;&#039;&#039; Why does the Cosmos DB Operator role exclude access to Data Explorer and account data?&lt;br /&gt;
* A. To enforce least privilege, separating infrastructure provisioning from data access&lt;br /&gt;
* B. Because it is a deprecated role&lt;br /&gt;
* C. Because it only applies to the MongoDB API&lt;br /&gt;
* D. Because data access is managed exclusively through Cosmos Backup Operator&lt;br /&gt;
&lt;br /&gt;
== Answer Key ==&lt;br /&gt;
&#039;&#039;Answers are listed at the very end so you can attempt the questions first.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Q1 (Cosmos DB Operator):&#039;&#039;&#039; A. Provision Azure Cosmos DB accounts, databases, and containers, without accessing data or using Data Explorer — Cosmos DB Operator can provision accounts, databases, and containers, but explicitly cannot access data or use Data Explorer.&lt;br /&gt;
* &#039;&#039;&#039;Q2 (Cosmos DB Operator):&#039;&#039;&#039; A. To enforce least privilege, separating infrastructure provisioning from data access — Excluding Data Explorer/data access lets an operator provision resources (control plane) without being able to read or modify the actual data (data plane).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — term detail page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:DP-420 Terminology]]&lt;br /&gt;
[[Category:Maintenance &amp;amp; Security]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=RBAC_for_Data_Plane&amp;diff=6240</id>
		<title>RBAC for Data Plane</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=RBAC_for_Data_Plane&amp;diff=6240"/>
		<updated>2026-10-26T15:07:43Z</updated>

		<summary type="html">&lt;p&gt;Anko: Recreated DP-420 term page: RBAC for Data Plane (Maintenance &amp;amp; Security)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;larr; Back to [[DP-420: Azure Cosmos DB Developer Specialty|DP-420 Terminology Reference]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Maintenance &amp;amp; Security&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Fine-grained Microsoft Entra ID permissions for data operations, avoiding shared account keys.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Azure Cosmos DB supports Azure role-based access control (RBAC) for data plane operations, allowing you to grant fine-grained permissions (read, write, specific operations) to Microsoft Entra ID identities for accessing data within containers, as an alternative or complement to using primary/secondary account keys, improving security by avoiding shared-secret key distribution.&lt;br /&gt;
&lt;br /&gt;
== More Info &amp;amp; Links ==&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/security/how-to-grant-data-plane-role-based-access Microsoft Learn: Configure RBAC for data plane]&lt;br /&gt;
&lt;br /&gt;
== DP-420 Style Practice Questions ==&lt;br /&gt;
&#039;&#039;&#039;Q1.&#039;&#039;&#039; What does data plane RBAC allow you to control in Azure Cosmos DB?&lt;br /&gt;
* A. Fine-grained permissions for Microsoft Entra ID identities to access and operate on data&lt;br /&gt;
* B. Which Azure regions data is replicated to&lt;br /&gt;
* C. The container&#039;s indexing policy&lt;br /&gt;
* D. The account&#039;s consistency level&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q2.&#039;&#039;&#039; What is an advantage of using Microsoft Entra ID-based data plane RBAC over primary/secondary account keys?&lt;br /&gt;
* A. It avoids distributing shared-secret keys and enables fine-grained, identity-based permissions&lt;br /&gt;
* B. It automatically enables multi-region writes&lt;br /&gt;
* C. It removes the need for TLS encryption&lt;br /&gt;
* D. It disables the need for a partition key&lt;br /&gt;
&lt;br /&gt;
== Answer Key ==&lt;br /&gt;
&#039;&#039;Answers are listed at the very end so you can attempt the questions first.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Q1 (RBAC for Data Plane):&#039;&#039;&#039; A. Fine-grained permissions for Microsoft Entra ID identities to access and operate on data — Data plane RBAC controls what data operations specific Microsoft Entra ID identities are permitted to perform.&lt;br /&gt;
* &#039;&#039;&#039;Q2 (RBAC for Data Plane):&#039;&#039;&#039; A. It avoids distributing shared-secret keys and enables fine-grained, identity-based permissions — RBAC with Microsoft Entra ID avoids shared-secret key distribution and allows more granular, auditable access control.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — term detail page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:DP-420 Terminology]]&lt;br /&gt;
[[Category:Maintenance &amp;amp; Security]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Data_Encryption_Key_(DEK)&amp;diff=6239</id>
		<title>Data Encryption Key (DEK)</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Data_Encryption_Key_(DEK)&amp;diff=6239"/>
		<updated>2026-10-26T15:07:43Z</updated>

		<summary type="html">&lt;p&gt;Anko: Recreated DP-420 term page: Data Encryption Key (DEK) (Maintenance &amp;amp; Security)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;larr; Back to [[DP-420: Azure Cosmos DB Developer Specialty|DP-420 Terminology Reference]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Maintenance &amp;amp; Security&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; for Always Encrypted in Azure Cosmos DB, you must use the Azure Cosmos DB SDK (C#, Java, or Node.js).&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Here is the sequence to create and use a Data Encryption Key (DEK):&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Create the Key Encryption Key (KEK):&#039;&#039;&#039; Before creating a DEK, you must create a master key in Azure Key Vault to protect it. Create a new RSA key in your vault, navigate to its current version, and copy the full Key Identifier (URI).&lt;br /&gt;
# &#039;&#039;&#039;Grant the Client Application Access to the KEK:&#039;&#039;&#039; The application running the Cosmos DB SDK needs permission to wrap and unwrap the DEK. Assign your application&#039;s Managed Identity permissions to the Key Vault to grant Get, List, Wrap Key, Unwrap Key, Verify, and Sign access.&lt;br /&gt;
# &#039;&#039;&#039;Initialize the Cosmos DB Client with a Key Resolver:&#039;&#039;&#039; In your application code, attach a Key Resolver to your Cosmos DB client instance so it can authenticate with Key Vault using the DefaultAzureCredential.&lt;br /&gt;
** &#039;&#039;&#039;C#:&#039;&#039;&#039; Use KeyResolver and .WithEncryption() when building the CosmosClient.&lt;br /&gt;
** &#039;&#039;&#039;Java:&#039;&#039;&#039; Use KeyEncryptionKeyClientBuilder.&lt;br /&gt;
** &#039;&#039;&#039;JavaScript/TypeScript:&#039;&#039;&#039; Pass an AzureKeyVaultEncryptionKeyResolver into the clientEncryptionOptions.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Create the DEK via the SDK:&#039;&#039;&#039; Call the CreateClientEncryptionKey method on your Cosmos DB Database object, passing:&lt;br /&gt;
** A unique string identifier for this DEK.&lt;br /&gt;
** The encryption algorithm (AEAD_AES_256_CBC_HMAC_SHA256).&lt;br /&gt;
** The KEK URI you copied in the first step.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Apply the DEK to a Container:&#039;&#039;&#039; When creating a new Cosmos DB container, define a ClientEncryptionPolicy. Specify which exact JSON properties should be encrypted, map them to your DEK&#039;s string identifier, and choose either Deterministic or Randomized encryption.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once configured, your application will automatically request the wrapped DEK from Cosmos DB, decrypt it locally using Azure Key Vault, and seamlessly encrypt your properties before sending the data.&lt;br /&gt;
&lt;br /&gt;
# Create DEK&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
await database.CreateClientEncryptionKeyAsync(&lt;br /&gt;
    id: &amp;quot;dek1&amp;quot;,&lt;br /&gt;
    encryptionAlgorithm:&lt;br /&gt;
        DataEncryptionKeyEncryptionAlgorithm&lt;br /&gt;
            .AeadAes256CbcHmacSha256,&lt;br /&gt;
    encryptionKeyWrapMetadata: metadata);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Use encryption&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
new CosmosClientBuilder(endpoint, credential)&lt;br /&gt;
    .WithEncryption(keyResolver, keyStoreProvider)&lt;br /&gt;
    .Build();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Create DEK&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
await database.CreateClientEncryptionKeyAsync(&lt;br /&gt;
    id: &amp;quot;dek1&amp;quot;,&lt;br /&gt;
    encryptionAlgorithm:&lt;br /&gt;
        DataEncryptionKeyEncryptionAlgorithm&lt;br /&gt;
            .AeadAes256CbcHmacSha256,&lt;br /&gt;
    encryptionKeyWrapMetadata: metadata);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# C# ClientEncryptionPolicy&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ClientEncryptionPolicy encryptionPolicy =&lt;br /&gt;
    new ClientEncryptionPolicy(&lt;br /&gt;
        new List&lt;br /&gt;
        {&lt;br /&gt;
            new ClientEncryptionIncludedPath&lt;br /&gt;
            {&lt;br /&gt;
                Path = &amp;quot;/email&amp;quot;,&lt;br /&gt;
                ClientEncryptionKeyId = &amp;quot;dek1&amp;quot;,&lt;br /&gt;
                EncryptionType =&lt;br /&gt;
                    ClientEncryptionEncryptionType.Deterministic,&lt;br /&gt;
                EncryptionAlgorithm =&lt;br /&gt;
                    DataEncryptionKeyEncryptionAlgorithm&lt;br /&gt;
                        .AeadAes256CbcHmacSha256&lt;br /&gt;
            },&lt;br /&gt;
            new ClientEncryptionIncludedPath&lt;br /&gt;
            {&lt;br /&gt;
                Path = &amp;quot;/ssn&amp;quot;,&lt;br /&gt;
                ClientEncryptionKeyId = &amp;quot;dek1&amp;quot;,&lt;br /&gt;
                EncryptionType =&lt;br /&gt;
                    ClientEncryptionEncryptionType.Randomized,&lt;br /&gt;
                EncryptionAlgorithm =&lt;br /&gt;
                    DataEncryptionKeyEncryptionAlgorithm&lt;br /&gt;
                        .AeadAes256CbcHmacSha256&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        ContainerProperties properties =&lt;br /&gt;
    new ContainerProperties(&lt;br /&gt;
        id: &amp;quot;Customers&amp;quot;,&lt;br /&gt;
        partitionKeyPath: &amp;quot;/customerId&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
properties.ClientEncryptionPolicy = encryptionPolicy;&lt;br /&gt;
&lt;br /&gt;
await database.CreateContainerAsync(properties);&lt;br /&gt;
&lt;br /&gt;
//If the policy contains: Plain Text&lt;br /&gt;
// /email -&amp;amp;gt; Deterministic&lt;br /&gt;
// SELECT * FROM c WHERE c.email = &amp;quot;john@contoso.com&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Create DEK&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CreateClientEncryptionKeyAsync()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1. Create KEK&lt;br /&gt;
2. Grant Key Vault permissions&lt;br /&gt;
3. Configure Cosmos Client&lt;br /&gt;
4. Create DEK&lt;br /&gt;
5. Create Encryption Policy&lt;br /&gt;
6. Create Container&lt;br /&gt;
7. Read/Write encrypted data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== More Info &amp;amp; Links ==&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/cosmos-db/how-to-setup-cmk Microsoft Learn: Customer-managed keys]&lt;br /&gt;
&lt;br /&gt;
== DP-420 Style Practice Questions ==&lt;br /&gt;
&#039;&#039;&#039;Q1.&#039;&#039;&#039; What is the main advantage of using customer-managed keys (CMK) over platform-managed keys?&lt;br /&gt;
* A. Full control over encryption key management, rotation, and revocation via Azure Key Vault&lt;br /&gt;
* B. Lower cost than platform-managed keys&lt;br /&gt;
* C. Elimination of the need to configure network access control&lt;br /&gt;
* D. Automatic multi-region writes&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q2.&#039;&#039;&#039; Where are customer-managed keys typically stored and managed for Azure Cosmos DB?&lt;br /&gt;
* A. Azure Key Vault&lt;br /&gt;
* B. Inside the Cosmos DB container itself&lt;br /&gt;
* C. In the application&#039;s source code&lt;br /&gt;
* D. In Azure Active Directory Connect&lt;br /&gt;
&lt;br /&gt;
== Answer Key ==&lt;br /&gt;
&#039;&#039;Answers are listed at the very end so you can attempt the questions first.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Q1 (Customer-Managed Keys):&#039;&#039;&#039; A. Full control over encryption key management, rotation, and revocation via Azure Key Vault — CMK gives the customer control over key lifecycle management, useful for meeting specific compliance requirements.&lt;br /&gt;
* &#039;&#039;&#039;Q2 (Customer-Managed Keys):&#039;&#039;&#039; A. Azure Key Vault — Customer-managed keys are stored and managed in Azure Key Vault, which Azure Cosmos DB references for encryption operations.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — term detail page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:DP-420 Terminology]]&lt;br /&gt;
[[Category:Maintenance &amp;amp; Security]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Customer-Managed_Keys&amp;diff=6238</id>
		<title>Customer-Managed Keys</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Customer-Managed_Keys&amp;diff=6238"/>
		<updated>2026-10-26T15:07:42Z</updated>

		<summary type="html">&lt;p&gt;Anko: Recreated DP-420 term page: Customer-Managed Keys (Maintenance &amp;amp; Security)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;larr; Back to [[DP-420: Azure Cosmos DB Developer Specialty|DP-420 Terminology Reference]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Maintenance &amp;amp; Security&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Encrypt data at rest using a key you control in Azure Key Vault.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Customer-managed keys (CMK) allow you to encrypt Azure Cosmos DB data at rest using an encryption key that you control and manage in Azure Key Vault, rather than relying solely on Microsoft&#039;s platform-managed keys. This gives organizations control over key rotation, revocation, and compliance requirements, at the cost of additional operational responsibility for key management.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Step 1: Prepare the Azure Key Vault&#039;&#039;&#039; Create or select an Azure Key Vault. You must ensure three specific settings are configured on the vault:&lt;br /&gt;
** Soft Delete and Purge Protection must be enabled (required by Cosmos DB to prevent accidental key loss).&lt;br /&gt;
** Permission model must be set to Azure role-based access control (RBAC) (required to grant permissions to a specific key rather than the whole vault).&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Step 2: Generate the Key and Assign Granular Permissions&#039;&#039;&#039; Inside your Key Vault, generate the encryption key and immediately lock down who can use it:&lt;br /&gt;
** Generate a new key (an RSA key size of 3072 or higher is recommended).&lt;br /&gt;
** Once generated, select that specific key, click on its Access control (IAM) menu, and add a role assignment.&lt;br /&gt;
** Assign the Key Vault Crypto Service Encryption User role to the Azure Cosmos DB principal.&lt;br /&gt;
** Before leaving the screen, copy the key&#039;s Key Identifier (URI).&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Step 3: Create the Azure Cosmos DB Account&#039;&#039;&#039; During the creation of your new Azure Cosmos DB account in the Azure portal, navigate to the Encryption tab. Select Customer-managed key and paste the Key URI you copied in Step 2. Cosmos DB will validate its access to that specific key and encrypt the new account.&lt;br /&gt;
&lt;br /&gt;
== More Info &amp;amp; Links ==&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/cosmos-db/how-to-setup-cmk Microsoft Learn: Customer-managed keys]&lt;br /&gt;
&lt;br /&gt;
== DP-420 Style Practice Questions ==&lt;br /&gt;
&#039;&#039;&#039;Q1.&#039;&#039;&#039; What is the main advantage of using customer-managed keys (CMK) over platform-managed keys?&lt;br /&gt;
* A. Full control over encryption key management, rotation, and revocation via Azure Key Vault&lt;br /&gt;
* B. Lower cost than platform-managed keys&lt;br /&gt;
* C. Elimination of the need to configure network access control&lt;br /&gt;
* D. Automatic multi-region writes&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q2.&#039;&#039;&#039; Where are customer-managed keys typically stored and managed for Azure Cosmos DB?&lt;br /&gt;
* A. Azure Key Vault&lt;br /&gt;
* B. Inside the Cosmos DB container itself&lt;br /&gt;
* C. In the application&#039;s source code&lt;br /&gt;
* D. In Azure Active Directory Connect&lt;br /&gt;
&lt;br /&gt;
== Answer Key ==&lt;br /&gt;
&#039;&#039;Answers are listed at the very end so you can attempt the questions first.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Q1 (Customer-Managed Keys):&#039;&#039;&#039; A. Full control over encryption key management, rotation, and revocation via Azure Key Vault — CMK gives the customer control over key lifecycle management, useful for meeting specific compliance requirements.&lt;br /&gt;
* &#039;&#039;&#039;Q2 (Customer-Managed Keys):&#039;&#039;&#039; A. Azure Key Vault — Customer-managed keys are stored and managed in Azure Key Vault, which Azure Cosmos DB references for encryption operations.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — term detail page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:DP-420 Terminology]]&lt;br /&gt;
[[Category:Maintenance &amp;amp; Security]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Continuous_Backup_%26_Point-in-Time_Restore&amp;diff=6237</id>
		<title>Continuous Backup &amp; Point-in-Time Restore</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Continuous_Backup_%26_Point-in-Time_Restore&amp;diff=6237"/>
		<updated>2026-10-26T15:07:42Z</updated>

		<summary type="html">&lt;p&gt;Anko: Recreated DP-420 term page: Continuous Backup &amp;amp; Point-in-Time Restore (Maintenance &amp;amp; Security)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;larr; Back to [[DP-420: Azure Cosmos DB Developer Specialty|DP-420 Terminology Reference]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Maintenance &amp;amp; Security&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Continuous backups enabling self-service restore to any timestamp in the retention window.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Continuous backup mode continuously backs up Azure Cosmos DB data, enabling self-service point-in-time restore (PITR) to any timestamp within the retention period (7 or 30 days depending on tier), without needing to contact support. This is useful for recovering from accidental data deletion/corruption or application bugs with much finer granularity than periodic backup.&lt;br /&gt;
&lt;br /&gt;
Azure Cosmos DB accounts with periodic mode backup policy can be migrated to continuous mode using the Azure portal, Azure CLI, Azure PowerShell, or Bicep templates. Migration from periodic to continuous mode is one-way and isn&#039;t reversible. After you migrate from periodic to continuous mode, you get the benefits of continuous mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Set the backup policy for the Azure Cosmos DB account&lt;br /&gt;
AccountUpdateParameters accountUpdateParameters = new AccountUpdateParameters()&lt;br /&gt;
{ &lt;br /&gt;
    BackupPolicy = new ContinuousBackupPolicy()&lt;br /&gt;
    { &lt;br /&gt;
        Type = BackupPolicyType.Continuous,&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
await databaseAccount.ReplaceAccountAsync(accountUpdateParameters);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
az cosmosdb update --resource-group &amp;quot;&amp;quot; --name &amp;quot;&amp;quot; \&lt;br /&gt;
  --backup-policy-type &amp;quot;Continuous&amp;quot; --continuous-tier &amp;quot;Continuous7Days&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
   &#039;&#039;&#039;Feature / Configuration&#039;&#039;&#039; &#039;&#039;&#039;Periodic Backup (Default)&#039;&#039;&#039; &#039;&#039;&#039;Continuous Backup (Point-in-Time)&#039;&#039;&#039;     &#039;&#039;&#039;Restore Mechanism&#039;&#039;&#039; Requires submitting an Azure support ticket. Self-service Point-in-Time Restore (PITR) via portal/CLI.   &#039;&#039;&#039;Retention Window&#039;&#039;&#039; Configurable up to 1 month (720 hours). Fixed tiers: 7-day, 30-day, or 35-day.   &#039;&#039;&#039;Backup Interval&#039;&#039;&#039; Configurable (minimum 1 hour). Continuous ongoing backup (no interval required).   &#039;&#039;&#039;Storage Redundancy&#039;&#039;&#039; Replicated to a paired region via Geo-Redundant Storage (GRS). Stored locally in the account&#039;s existing regions (not automatically geo-resistant).   &#039;&#039;&#039;Supported APIs&#039;&#039;&#039; All Azure Cosmos DB APIs. SQL, MongoDB, Gremlin, and Table (Cassandra is not supported).   &#039;&#039;&#039;Cost Structure&#039;&#039;&#039; Default (2 copies) is free. Billed for additional copies/retention. 7-day storage is free. 30/35-day tiers incur storage costs. All restores incur a fee.   &#039;&#039;&#039;Migration&#039;&#039;&#039; Can be migrated to Continuous mode. &#039;&#039;&#039;One-way only:&#039;&#039;&#039; Cannot revert back to Periodic.   &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Restored&lt;br /&gt;
Data plane&lt;br /&gt;
Databases&lt;br /&gt;
Containers&lt;br /&gt;
Items/documents&lt;br /&gt;
Throughput&lt;br /&gt;
&lt;br /&gt;
❌ Not restored&lt;br /&gt;
Control plane&lt;br /&gt;
Networking&lt;br /&gt;
Security&lt;br /&gt;
Regional settings&lt;br /&gt;
Consistency settings&lt;br /&gt;
Programmability objects (Sprocs, Triggers, UDFs)&lt;br /&gt;
External integrations&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== More Info &amp;amp; Links ==&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/cosmos-db/continuous-backup-restore-introduction Microsoft Learn: Continuous backup and point-in-time restore]&lt;br /&gt;
&lt;br /&gt;
== DP-420 Style Practice Questions ==&lt;br /&gt;
&#039;&#039;&#039;Q1.&#039;&#039;&#039; What capability does continuous backup mode enable that periodic backup does not?&lt;br /&gt;
* A. Self-service point-in-time restore to any timestamp within the retention window&lt;br /&gt;
* B. Multi-region writes&lt;br /&gt;
* C. Automatic index optimization&lt;br /&gt;
* D. Free throughput&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q2.&#039;&#039;&#039; Do you need to contact Microsoft support to perform a restore under continuous backup mode?&lt;br /&gt;
* A. No, restores can be self-service, initiated by the account owner&lt;br /&gt;
* B. Yes, a support ticket is always required&lt;br /&gt;
* C. Only for restores older than 24 hours&lt;br /&gt;
* D. Only when using the Cassandra API&lt;br /&gt;
&lt;br /&gt;
== Answer Key ==&lt;br /&gt;
&#039;&#039;Answers are listed at the very end so you can attempt the questions first.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Q1 (Continuous Backup &amp;amp; Point-in-Time Restore):&#039;&#039;&#039; A. Self-service point-in-time restore to any timestamp within the retention window — Continuous backup enables self-service point-in-time restore to virtually any moment within the retention period.&lt;br /&gt;
* &#039;&#039;&#039;Q2 (Continuous Backup &amp;amp; Point-in-Time Restore):&#039;&#039;&#039; A. No, restores can be self-service, initiated by the account owner — Continuous backup allows account owners to self-service restore without needing to open a support request.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — term detail page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:DP-420 Terminology]]&lt;br /&gt;
[[Category:Maintenance &amp;amp; Security]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=Periodic_Backup&amp;diff=6236</id>
		<title>Periodic Backup</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=Periodic_Backup&amp;diff=6236"/>
		<updated>2026-10-26T15:07:41Z</updated>

		<summary type="html">&lt;p&gt;Anko: Recreated DP-420 term page: Periodic Backup (Maintenance &amp;amp; Security)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;larr; Back to [[DP-420: Azure Cosmos DB Developer Specialty|DP-420 Terminology Reference]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Maintenance &amp;amp; Security&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Original backup mode; scheduled snapshots, typically restored via a support request.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Periodic backup is Azure Cosmos DB&#039;s original backup mode, which automatically takes backups of the account at a configurable interval (default every 4 hours) and retains a configurable number of backups, allowing restoration of an entire account to a previous backup point — typically requiring a support request to restore, and offering less granularity than continuous backup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Exam shortcut:&#039;&#039;&#039; &amp;quot;Where are Periodic Backup backups stored by default?&amp;quot; → In the write region and geo-replicated to the Azure paired region (GRS).&lt;br /&gt;
&lt;br /&gt;
* Periodic Backup → Contact Microsoft/Azure Support ✅&lt;br /&gt;
* Continuous Backup → Use self-service restore (RBAC permissions required) ✅&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| Backup type | CosmosRestoreOperator needed? |&lt;br /&gt;
| ----------- | ----------------------------- |&lt;br /&gt;
| Periodic    | **No**                        |&lt;br /&gt;
| Continuous  | **Yes**                       |&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== More Info &amp;amp; Links ==&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/cosmos-db/periodic-backup-restore-introduction Microsoft Learn: Periodic backup mode]&lt;br /&gt;
&lt;br /&gt;
== DP-420 Style Practice Questions ==&lt;br /&gt;
&#039;&#039;&#039;Q1.&#039;&#039;&#039; How does periodic backup mode restore data?&lt;br /&gt;
* A. By restoring from the most recent scheduled backup snapshot, typically via a support request&lt;br /&gt;
* B. Automatically, to any exact second within the retention window, without support involvement&lt;br /&gt;
* C. Only by exporting a manual snapshot triggered by the developer&lt;br /&gt;
* D. By replaying the change feed from the beginning&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q2.&#039;&#039;&#039; What is a key limitation of periodic backup compared to continuous backup?&lt;br /&gt;
* A. Restores are limited to the granularity of the scheduled backup interval, not an exact point in time&lt;br /&gt;
* B. Periodic backup cannot be configured with any retention period&lt;br /&gt;
* C. Periodic backup only works with the MongoDB API&lt;br /&gt;
* D. Periodic backup requires multi-region writes to be enabled&lt;br /&gt;
&lt;br /&gt;
== Answer Key ==&lt;br /&gt;
&#039;&#039;Answers are listed at the very end so you can attempt the questions first.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Q1 (Periodic Backup):&#039;&#039;&#039; A. By restoring from the most recent scheduled backup snapshot, typically via a support request — Periodic backup restores from scheduled backup snapshots and traditionally requires contacting support to initiate.&lt;br /&gt;
* &#039;&#039;&#039;Q2 (Periodic Backup):&#039;&#039;&#039; A. Restores are limited to the granularity of the scheduled backup interval, not an exact point in time — Periodic backup only allows restoring to backup snapshot points, unlike continuous backup&#039;s fine-grained point-in-time restore.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — term detail page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:DP-420 Terminology]]&lt;br /&gt;
[[Category:Maintenance &amp;amp; Security]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
	<entry>
		<id>https://ilianko.com/index.php?title=KQL_(Kusto_Query_Language)&amp;diff=6235</id>
		<title>KQL (Kusto Query Language)</title>
		<link rel="alternate" type="text/html" href="https://ilianko.com/index.php?title=KQL_(Kusto_Query_Language)&amp;diff=6235"/>
		<updated>2026-10-26T15:07:41Z</updated>

		<summary type="html">&lt;p&gt;Anko: Recreated DP-420 term page: KQL (Kusto Query Language) (Maintenance &amp;amp; Security)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;larr; Back to [[DP-420: Azure Cosmos DB Developer Specialty|DP-420 Terminology Reference]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Category:&#039;&#039;&#039; Maintenance &amp;amp; Security&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Summary:&#039;&#039;&#039; Query language used in Azure Monitor Log Analytics to analyze Cosmos DB diagnostic logs and metrics.&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
KQL (Kusto Query Language) is the read-only query language used to explore, analyze, and aggregate telemetry and diagnostic data in Azure Monitor Log Analytics, Azure Data Explorer, and Microsoft Fabric Real-Time Intelligence. In the context of Azure Cosmos DB and the DP-420 exam, KQL is used to query diagnostic log tables — such as CDBDataPlaneRequests, CDBQueryRuntimeStatistics, CDBPartitionKeyRUConsumption, and CDBControlPlaneRequests (or legacy AzureDiagnostics) — to analyze RU consumption patterns, troubleshoot HTTP 429 throttling errors, identify hot partitions, and pinpoint high-cost or slow queries. KQL queries are built using a pipeline model where data flows from left to right through tabular operators separated by the pipe (|) character, such as where, project, summarize, join, order by, and render.&lt;br /&gt;
&lt;br /&gt;
Example 1 (KQL): Find operations throttled with HTTP 429 status code&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDBDataPlaneRequests&lt;br /&gt;
| where TimeGenerated &amp;amp;gt; ago(24h)&lt;br /&gt;
| where StatusCode == 429&lt;br /&gt;
| summarize Count429 = count() by bin(TimeGenerated, 5m), OperationName, PartitionKey&lt;br /&gt;
| order by Count429 desc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This query identifies requests that were rate-limited (HTTP 429) across 5-minute intervals in the last 24 hours, grouping by operation and partition key to isolate hot partitions causing throttling.&lt;br /&gt;
&lt;br /&gt;
Example 2 (KQL): Correlate high RU queries with query text&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDBDataPlaneRequests&lt;br /&gt;
| where TimeGenerated &amp;amp;gt; ago(1h) and todouble(RequestCharge) &amp;amp;gt; 50.0&lt;br /&gt;
| project TimeGenerated, ActivityId, RequestCharge, DurationMs&lt;br /&gt;
| join kind=inner (&lt;br /&gt;
    CDBQueryRuntimeStatistics&lt;br /&gt;
    | project ActivityId, QueryText&lt;br /&gt;
) on $left.ActivityId == $right.ActivityId&lt;br /&gt;
| order by RequestCharge desc&lt;br /&gt;
| limit 20&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This query correlates request execution telemetry from &amp;lt;code&amp;gt;CDBDataPlaneRequests&amp;lt;/code&amp;gt; with query text from &amp;lt;code&amp;gt;CDBQueryRuntimeStatistics&amp;lt;/code&amp;gt; via &amp;lt;code&amp;gt;ActivityId&amp;lt;/code&amp;gt; to find the top 20 most expensive queries.&lt;br /&gt;
&lt;br /&gt;
== More Info &amp;amp; Links ==&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/log-analytics/tutorial-kql Microsoft Learn: Tutorial - Write KQL queries to monitor Azure Cosmos DB]&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query/ Microsoft Learn: Overview of Kusto Query Language (KQL)]&lt;br /&gt;
* [https://learn.microsoft.com/en-us/azure/cosmos-db/monitor-resource-logs Microsoft Learn: Monitor and troubleshoot Azure Cosmos DB using diagnostic logs]&lt;br /&gt;
&lt;br /&gt;
== DP-420 Style Practice Questions ==&lt;br /&gt;
&#039;&#039;&#039;Q1.&#039;&#039;&#039; What is the primary role of KQL (Kusto Query Language) in Azure Cosmos DB operations and troubleshooting?&lt;br /&gt;
* A. Querying and analyzing diagnostic logs and metrics in Azure Monitor Log Analytics to troubleshoot issues like throttling, hot partitions, and expensive queries&lt;br /&gt;
* B. Defining server-side stored procedures and triggers directly in Cosmos DB containers&lt;br /&gt;
* C. Querying JSON documents via the Cosmos DB API for NoSQL endpoint&lt;br /&gt;
* D. Creating and managing Cosmos DB indexing policies declaratively&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q2.&#039;&#039;&#039; In a KQL query for Azure Cosmos DB logs, what does the pipe (|) operator represent?&lt;br /&gt;
* A. It pipes the tabular output of the preceding operator as the input to the next operator in a data-flow pipeline&lt;br /&gt;
* B. It performs a logical bitwise OR between two numeric fields&lt;br /&gt;
* C. It defines a primary key constraint on the diagnostic table&lt;br /&gt;
* D. It separates alternative partition key values in a point read&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Q3.&#039;&#039;&#039; Which resource-specific table would you query using KQL to inspect RU charges and HTTP status codes for individual data operations?&lt;br /&gt;
* A. CDBDataPlaneRequests&lt;br /&gt;
* B. CDBControlPlaneRequests&lt;br /&gt;
* C. CDBPartitionKeyStatistics&lt;br /&gt;
* D. AzureMetrics&lt;br /&gt;
&lt;br /&gt;
== Answer Key ==&lt;br /&gt;
&#039;&#039;Answers are listed at the very end so you can attempt the questions first.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Q1 (KQL (Kusto Query Language)):&#039;&#039;&#039; A. Querying and analyzing diagnostic logs and metrics in Azure Monitor Log Analytics to troubleshoot issues like throttling, hot partitions, and expensive queries — KQL is the read-only query language for Azure Monitor Log Analytics used to analyze diagnostic logs like CDBDataPlaneRequests and CDBPartitionKeyRUConsumption.&lt;br /&gt;
* &#039;&#039;&#039;Q2 (KQL (Kusto Query Language)):&#039;&#039;&#039; A. It pipes the tabular output of the preceding operator as the input to the next operator in a data-flow pipeline — KQL uses the pipe (|) operator to pass data sequentially from one tabular expression/operator to another (e.g., filtering with where, then aggregating with summarize).&lt;br /&gt;
* &#039;&#039;&#039;Q3 (KQL (Kusto Query Language)):&#039;&#039;&#039; A. CDBDataPlaneRequests — CDBDataPlaneRequests logs individual data-plane operations along with RequestCharge, StatusCode, DurationMs, and ActivityId.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;DP-420: Designing and Implementing Cloud-Native Applications Using Microsoft Azure Cosmos DB — term detail page&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:DP-420 Terminology]]&lt;br /&gt;
[[Category:Maintenance &amp;amp; Security]]&lt;/div&gt;</summary>
		<author><name>Anko</name></author>
	</entry>
</feed>