Keyless signing

키 없는 서명

Bind an ephemeral signing key to an identity certificate instead of managing a long-lived private key.

···
html
<div class="sd"><div class="sd-head"><strong>KEYLESS SIGNING</strong><span id="state">live check</span></div><div class="sd-stage"><div class="ks-flow"><div id="k0">OIDC<br>identity</div><div id="k1">short-lived<br>certificate</div><div id="k2">artifact<br>signature</div><div id="k3">verify<br>identity</div></div><div class="ks-track"><b id="ks-progress"></b></div></div><div class="sd-foot"><span id="caption">checking boundary</span><span>tap to step</span></div></div>
css
.sd{box-sizing:border-box;width:min(94vw,700px);height:min(86vh,318px);padding:clamp(9px,2.3vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);color:var(--fg);display:flex;flex-direction:column;gap:clamp(6px,1.8vmin,12px);font:600 clamp(12px,2.6vmin,16px)/1.25 var(--font-sans, sans-serif)}.sd *{box-sizing:border-box}.sd-head,.sd-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:1.25em}.sd-head strong{color:var(--accent);letter-spacing:.06em}.sd-head span,.sd-foot{color:var(--muted)}.sd-foot{font-size:clamp(12px,2.4vmin,14px)}.sd-stage{position:relative;flex:1;min-height:0;display:flex;align-items:center;justify-content:center;gap:clamp(6px,2vmin,18px);overflow:hidden}.sd .mono{font-family:ui-monospace,monospace}.sd .tile{border:1px solid var(--line);border-radius:8px;background:var(--bg);padding:clamp(5px,1.5vmin,10px);text-align:center}.sd .good{color:var(--accent);border-color:var(--accent)}.sd .bad{color:var(--accent-3);border-color:var(--accent-3)}.sd .arrow{color:var(--muted);font-size:clamp(15px,4vmin,28px)}.sd .active{background:color-mix(in srgb,var(--accent) 16%,var(--surface));border-color:var(--accent)}.sd .blocked{background:color-mix(in srgb,var(--accent-3) 13%,var(--surface));border-color:var(--accent-3)}.sd-stage{flex-direction:column}.ks-flow{display:flex;width:100%;gap:clamp(4px,1.2vmin,9px)}.ks-flow div{flex:1;min-width:0;padding:clamp(5px,1.5vmin,11px) 2px;border:1px solid var(--line);border-radius:7px;text-align:center;background:var(--bg);transition:all .2s}.ks-flow div.on{border-color:var(--accent);color:var(--accent);background:color-mix(in srgb,var(--accent) 14%,var(--surface))}.ks-track{width:90%;height:clamp(7px,1.8vmin,12px);background:var(--bg);border-radius:20px;overflow:hidden}.ks-track b{display:block;height:100%;background:var(--accent);transition:width .25s}
js
let n=-1;function advance(){n=(n+1)%4;for(let i=0;i<4;i++)document.getElementById('k'+i).classList.toggle('on',i<=n);document.getElementById('ks-progress').style.width=(n+1)*25+'%';document.getElementById('state').textContent=['identify','certify','sign','verify'][n];document.getElementById('caption').textContent=['identify CI workload','bind temporary key to identity','sign artifact digest','check signature and identity'][n]}advance();setInterval(advance,750);
document.querySelector('.sd').addEventListener('pointerdown',advance);

Keyless signing creates an ephemeral signing key and obtains a short-lived certificate that binds it to an OIDC identity. A verifier checks the signature, certificate identity, and transparency record.

The demo steps through identity, certificate, and artifact verification. Avoiding a long-lived private key does not remove the need to verify who signed.

When to use

Use it when signing CI artifacts with a verifiable workload identity.

Open as page ↗