<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><atom:link href="https://www.finalbuilder.com/DesktopModules/LiveBlog/API/Syndication/GetRssFeeds?Category=devops&amp;mid=632&amp;PortalId=0&amp;tid=181&amp;ItemCount=20" rel="self" type="application/rss+xml" /><title>VSoft Technologies Blogs</title><description>VSoft Technologies Blogs - posts about our products and software development.</description><link>https://www.finalbuilder.com/resources/blogs</link><item><title>Signotaur 2.0: managing certificates, not just signing with them</title><link>https://www.finalbuilder.com/resources/blogs/postid/886/signotaur-20-managing-certificates-not-just-signing-with-them</link><category>.NET,Code Signing,DelphiDevOps,Signotaur</category><pubDate>Fri, 26 Jun 2026 01:39:43 GMT</pubDate><description>&lt;style type="text/css"&gt;div.blog_content h1 { font-size: 1.9rem; margin-bottom: 0.3rem; }
    div.blog_content h2 { font-size: 1.4rem; margin-top: 2.2rem; border-bottom: 1px solid #e0e0e0; padding-bottom: 0.4rem; }
    div.blog_content h3 { font-size: 1.15rem; margin-top: 1.6rem; color: #222;}
    div.blog_content strong {  font-weight: 600;  color: #888;}
    div.blog_content .meta { color: #777; font-size: 0.9rem; margin-bottom: 2rem; }
    div.blog_content code { background: #f4f4f4; padding: 0.15em 0.4em; border-radius: 3px; font-size: 0.92em; }
    div.blog_content pre { background: #f4f4f4; padding: 1rem; border-radius: 5px; overflow-x: auto; }
    div.blog_content pre code { background: none; padding: 0; }
    div.blog_content a { color: #0066cc; }
    div.blog_content img { max-width: 100%; border: 1px solid #ddd; border-radius: 4px; margin: 1rem 0; }
    div.blog_content .note { background: #eef6ff; border-left: 4px solid #0066cc; padding: 0.8rem 1rem; margin: 1.2rem 0; border-radius: 0 4px 4px 0; }
    div.blog_content ol { margin: 1rem 0 1.5rem 1.5rem; padding-left: 0.5rem;}
    div.blog_content ol li {  margin-bottom: 0.7rem;  line-height: 1.6;}
    div.blog_content ol li strong {  font-weight: 600;}
    div.blog_content ul li {  margin-bottom: 0.45rem;}
&lt;/style&gt;
&lt;div class="note"&gt;&lt;strong&gt;In this article:&lt;/strong&gt;
&lt;ul&gt;
    &lt;li&gt;A brief introduction to certificates and Certificate Authorities&lt;/li&gt;
    &lt;li&gt;Signotaur's built-in Certificate Authority and Microsoft AD CS integration&lt;/li&gt;
    &lt;li&gt;Management of the TLS certificate used by the web interface&lt;/li&gt;
    &lt;li&gt;Encrypted backups and stronger protection for secrets at rest&lt;/li&gt;
    &lt;li&gt;Rate limiting and other administration improvements&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;The first release of Signotaur focused on one central task: keeping code-signing private keys on a server you control and signing files without exposing those keys to build agents or users.&lt;/p&gt;
&lt;p&gt;Signotaur 2.0 extends that approach to certificate management. It can now issue and renew certificates through its own internal Certificate Authority, or request them from an existing Microsoft Active Directory Certificate Services deployment. It can also manage the TLS certificate presented by its own web interface.&lt;/p&gt;
&lt;p&gt;The release also introduces encrypted backups and easier server migration, machine-bound protection for stored secrets, per-API-key rate limiting and a range of administration improvements. This article covers the main changes, beginning with a short introduction to the PKI concepts behind the new certificate-management features.&lt;/p&gt;

&lt;h2&gt;A brief PKI refresher&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;certificate&lt;/strong&gt; associates an identity, such as a person, organisation or server name, with a public key. Its authenticity is established by a digital signature from a recognised &lt;strong&gt;Certificate Authority&lt;/strong&gt; (CA).&lt;/p&gt;
&lt;p&gt;When software verifies a signed file or establishes a TLS connection, it checks the certificate chain from the certificate in use back to a trusted CA certificate. If the chain is valid and terminates at a root certificate trusted by the machine, the certificate can be accepted.&lt;/p&gt;
&lt;p&gt;Certificate Authorities are commonly organised as a hierarchy. A &lt;strong&gt;root CA&lt;/strong&gt; forms the trust anchor and is normally kept offline or used only rarely. One or more &lt;strong&gt;intermediate CAs&lt;/strong&gt; then issue certificates for everyday use. Machines trust the root certificate, and that trust extends through the signed chain to certificates issued by the intermediate CA.&lt;/p&gt;
&lt;p&gt;Certificates that must be trusted publicly, such as those used by public websites or widely distributed software, are generally issued by a commercial CA whose root certificates are already included in operating systems and browsers. Internal services, build infrastructure and private signing systems often need trust only within an organisation. In those cases, an internally managed CA can provide greater control without requiring a publicly trusted certificate.&lt;/p&gt;
&lt;h2&gt;Built-in Certificate Authority&lt;/h2&gt;
&lt;p&gt;Signotaur can now create and manage its own CA hierarchy, consisting of a root CA and an intermediate CA. It can use that hierarchy to issue &lt;strong&gt;code-signing certificates&lt;/strong&gt; for build pipelines and &lt;strong&gt;web certificates&lt;/strong&gt; for internal services.&lt;/p&gt;
&lt;p&gt;The CA private keys are generated and stored on the Signotaur server and are protected using the same server-side key-custody model as signing keys. They do not need to be copied to build agents or administrator workstations.&lt;/p&gt;
&lt;p&gt;The managed-certificate features include:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;On-demand issuance.&lt;/strong&gt; Administrators can issue certificates from the admin web interface without using separate command-line tools or manually maintained configuration files.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Automatic renewal.&lt;/strong&gt; Managed certificates can be renewed before they expire, reducing the risk of failed builds or unavailable internal services.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Expiry notifications.&lt;/strong&gt; Email notifications provide advance warning when a certificate requires attention.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Centralised tracking.&lt;/strong&gt; The managed-certificate list records current certificates and the certificates they replace, providing a single view of issued certificates and their status.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The CA hierarchy is created only when it is first needed. Enabling the feature does not immediately generate or store CA keys. The root and intermediate certificates are created when the first certificate is issued.&lt;/p&gt;
&lt;p&gt;Once the hierarchy exists, the root certificate must be added to the trust stores of the machines that need to trust certificates issued by Signotaur.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="https://cdn.finalbuilder.com/blog/daves/signotaur-2-0/managed-certificates-list.png" alt="The Managed Certificates admin page in Signotaur, listing issued code-signing and web certificates with their status and expiry."&gt;&lt;/p&gt;

&lt;h2&gt;Issuing certificates through Microsoft AD CS&lt;/h2&gt;
&lt;p&gt;Organisations that already use Active Directory Certificate Services can issue Signotaur-managed certificates through their existing PKI instead of creating a separate CA hierarchy.&lt;/p&gt;
&lt;p&gt;Signotaur can connect to an AD CS server through either the DCOM interface or the Certificate Services web enrolment service, and request certificates using selected enterprise certificate templates. Certificates issued by AD CS appear in the same managed-certificate list and can use the same tracking and renewal features as certificates issued by Signotaur's internal CA.&lt;/p&gt;
&lt;p&gt;This allows organisations to retain their existing templates, policies and trust chain while using Signotaur to manage certificate enrolment and renewal.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="https://cdn.finalbuilder.com/blog/daves/signotaur-2-0/adcs-settings.png" alt="The Microsoft AD CS settings tab in Signotaur, showing the server, transport, and certificate template configuration."&gt;&lt;/p&gt;

&lt;h2&gt;Managing the web certificate&lt;/h2&gt;
&lt;p&gt;Signotaur 2.0 adds a dedicated administration page for the TLS certificate presented by the web interface.&lt;/p&gt;
&lt;p&gt;The certificate can come from several sources:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;a self-signed certificate;&lt;/li&gt;
    &lt;li&gt;an existing PFX file;&lt;/li&gt;
    &lt;li&gt;a certificate in the Windows certificate store; or&lt;/li&gt;
    &lt;li&gt;a certificate issued through Signotaur's managed-certificate system.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The administration page displays the active certificate, its certificate chain and its expiry date. Administrators can also download the chain anchor in PEM or DER format for distribution to client trust stores.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="https://cdn.finalbuilder.com/blog/daves/signotaur-2-0/web-certificate-tab.png" alt="The web certificate admin area in Signotaur, showing the active certificate source, its chain, expiry, and a download option for the chain anchor."&gt;&lt;/p&gt;
&lt;h2&gt;Enterprise licensing&lt;/h2&gt;
&lt;p&gt;The internal CA, AD CS issuance, code-signing with managed certificates, and use of a managed certificate as the ongoing web-certificate source are included in the new &lt;strong&gt;Enterprise&lt;/strong&gt; licence.&lt;/p&gt;
&lt;p&gt;Every Signotaur server can issue one managed web certificate during installation without an Enterprise licence. This certificate can be valid for up to &lt;strong&gt;90 days&lt;/strong&gt;. After that period, the server reverts to a self-signed certificate unless an Enterprise licence is installed.&lt;/p&gt;
&lt;p&gt;The allowance applies only to the single web certificate. Issuing or signing with managed code-signing certificates, and continuing to renew the web certificate after 90 days, require an Enterprise licence. The other features described in this article remain available in the existing editions.&lt;/p&gt;

&lt;h2&gt;Encrypted, portable backups&lt;/h2&gt;
&lt;p&gt;Signotaur 2.0 introduces encrypted backups for the server configuration, database and certificates.&lt;/p&gt;
&lt;p&gt;The new &lt;code&gt;archive&lt;/code&gt; command creates a passphrase-protected &lt;code&gt;.sigbak&lt;/code&gt; file and supports creating, verifying, restoring and extracting backups:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;archive create   -- create a .sigbak bundle
archive verify   -- verify a bundle and its passphrase
archive restore  -- restore a bundle to a server
archive extract  -- extract individual files from a bundle&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Backups are portable between servers. When restored on another machine, protected secrets are automatically re-encrypted using that machine's key, making the same format suitable for both disaster recovery and server migration.&lt;/p&gt;
&lt;p&gt;Scheduled backups can also create complete &lt;code&gt;.sigbak&lt;/code&gt; archives automatically when a backup passphrase is configured. The command runs locally through the Signotaur server executable.&lt;/p&gt;

&lt;h2&gt;Protecting secrets at rest&lt;/h2&gt;
&lt;p&gt;Signotaur now protects its master encryption key using machine-bound Data Protection API (DPAPI) encryption.&lt;/p&gt;
&lt;p&gt;As a result, a copy of the server files cannot simply be moved to another machine and decrypted there. Configuration secrets, CA private keys and other protected data remain bound to the machine that stored them. A supported &lt;code&gt;.sigbak&lt;/code&gt; restore deliberately re-protects those secrets for the destination machine.&lt;/p&gt;
&lt;h2&gt;Per-API-key rate limiting&lt;/h2&gt;
&lt;p&gt;Signotaur 2.0 can apply an optional fixed-window rate limit to gRPC signing requests on a per-API-key basis.&lt;/p&gt;
&lt;p&gt;Administrators specify the permitted number of requests and the length of the window. When an API key exceeds that limit, further requests are throttled until the next window begins. Rate limiting is disabled by default, so existing installations retain their current behaviour unless it is explicitly enabled.&lt;/p&gt;

&lt;h2&gt;Administration improvements&lt;/h2&gt;
&lt;p&gt;The release also includes a number of changes intended to make the server easier to configure and maintain:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;More settings apply immediately.&lt;/strong&gt; Changes to email, event retention, password policy, session and login expiry, update checks, the PKCS#11 PIN-failure limit, and enabling or disabling rate limiting can take effect without restarting the server. Other settings that require a restart, including hostname and port, OAuth provider, log-file changes, and changes to an already-running rate limiter, now display a clear restart-pending notification.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Configurable session lifetimes.&lt;/strong&gt; A login with "Remember me" left unticked can be given a shorter idle timeout than a remembered one, so unattended sessions expire sooner. Administrators can also decide whether sign-ins via external providers (Google, GitHub) stay signed in or last only for the browser session.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Concurrent-edit protection.&lt;/strong&gt; Configuration changes use optimistic concurrency. If another administrator changes the same settings before they are saved, Signotaur displays a conflict rather than silently overwriting the newer values.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Clearer save behaviour.&lt;/strong&gt; The web interface warns about unsaved changes before navigation and displays a summary of proposed changes before they are saved, including when each change will take effect.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Improved installer certificate setup.&lt;/strong&gt; The installer provides separate configuration paths for an existing PFX, a Windows certificate-store certificate, a self-signed certificate, the built-in CA and external AD CS. It validates certificate details, subject names and AD CS connectivity before continuing. It also respects the configured backup directory and creates a pre-upgrade backup.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;Signotaur 1.0 concentrated on protecting signing keys and keeping them on a server under your control. Signotaur 2.0 extends that model to the certificates associated with those keys by adding issuance, renewal and centralised tracking.&lt;/p&gt;
&lt;p&gt;It also strengthens server administration through encrypted portable backups, machine-bound protection for stored secrets, rate limiting and clearer configuration management. The underlying signing model remains the same: private keys stay on the Signotaur server, and signing operations do not expose them to build agents or users.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Further information is available in the &lt;a href="https://docs.finalbuilder.com/sn/2.0/"&gt;Signotaur 2.0 documentation&lt;/a&gt;, including the managed-certificate, web-certificate and &lt;code&gt;archive&lt;/code&gt; command reference pages.&lt;/p&gt;
</description><guid isPermaLink="false">886</guid></item><item><title>Signing files that can't carry a signature: detached CMS for ZIPs, ISOs and more</title><link>https://www.finalbuilder.com/resources/blogs/postid/885/signing-files-that-cant-carry-a-signature-detached-cms-for-zips-isos-and-more</link><category>.NET,Code Signing,DelphiDevOps,Signotaur</category><pubDate>Fri, 12 Jun 2026 02:25:05 GMT</pubDate><description>&lt;style type="text/css"&gt;div.blog_content h1 { font-size: 1.9rem; margin-bottom: 0.3rem; }
    div.blog_content h2 { font-size: 1.4rem; margin-top: 2.2rem; border-bottom: 1px solid #e0e0e0; padding-bottom: 0.4rem; }
    div.blog_content h3 { font-size: 1.15rem; margin-top: 1.6rem; color: #222;}
    div.blog_content strong {  font-weight: 600;  color: #888;}
    div.blog_content .meta { color: #777; font-size: 0.9rem; margin-bottom: 2rem; }
    div.blog_content code { background: #f4f4f4; padding: 0.15em 0.4em; border-radius: 3px; font-size: 0.92em; }
    div.blog_content pre { background: #f4f4f4; padding: 1rem; border-radius: 5px; overflow-x: auto; }
    div.blog_content pre code { background: none; padding: 0; }
    div.blog_content a { color: #0066cc; }
    div.blog_content img { max-width: 100%; border: 1px solid #ddd; border-radius: 4px; margin: 1rem 0; }
    div.blog_content .note { background: #eef6ff; border-left: 4px solid #0066cc; padding: 0.8rem 1rem; margin: 1.2rem 0; border-radius: 0 4px 4px 0; }
    div.blog_content ol { margin: 1rem 0 1.5rem 1.5rem; padding-left: 0.5rem;}
    div.blog_content ol li {  margin-bottom: 0.7rem;  line-height: 1.6;}
    div.blog_content ol li strong {  font-weight: 600;}
    div.blog_content ul li {  margin-bottom: 0.45rem;}
&lt;/style&gt;
&lt;div class="note"&gt;&lt;strong&gt;In this article:&lt;/strong&gt;
&lt;ul&gt;
	&lt;li&gt;Why some files can't carry an embedded signature&lt;/li&gt;
	&lt;li&gt;What a detached &lt;code&gt;.p7s&lt;/code&gt; signature is, and when Signotaur writes one&lt;/li&gt;
	&lt;li&gt;Signing archives and disk images with no extra flags&lt;/li&gt;
	&lt;li&gt;Extending detached signing to arbitrary files with &lt;code&gt;--detached&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;Controlling the output path, and verifying with Signotaur or OpenSSL&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p&gt;Most of the file types Signotaur signs have somewhere to &lt;em&gt;put&lt;/em&gt; the signature. A PE binary has a certificate table, an MSI has a digital-signature stream, a NuGet package has a reserved ZIP entry. You sign the file, the signature goes inside it, and the file still works exactly as before.&lt;/p&gt;
&lt;p&gt;Plenty of files people need to sign have no standard embedded-signature format. A &lt;code&gt;.zip&lt;/code&gt;, a &lt;code&gt;.tar.gz&lt;/code&gt;, an &lt;code&gt;.iso&lt;/code&gt;, a firmware blob, a plain &lt;code&gt;.json&lt;/code&gt; manifest — several of these do have comment or metadata areas you could stash bytes in, but there's no agreed-upon signing format that other tools would recognise. You can wrap the whole file inside a signature structure, but that changes the file itself: your zip is no longer a zip, it's a CMS structure containing the zip.&lt;/p&gt;
&lt;p&gt;The standard answer to this is a &lt;strong&gt;detached signature&lt;/strong&gt;: sign the bytes, leave the original artifact untouched, and write the signature to a separate file. Signotaur now supports this directly, producing a standard CMS/PKCS#7 &lt;code&gt;.p7s&lt;/code&gt; signature next to the file it signed.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;CMS&lt;/em&gt; (Cryptographic Message Syntax, &lt;a href="https://datatracker.ietf.org/doc/html/rfc5652"&gt;RFC 5652&lt;/a&gt;) is the IETF standard format for digitally signed data; &lt;em&gt;PKCS#7&lt;/em&gt; is the older format CMS was based on, and the names are still often used interchangeably. The &lt;code&gt;.p7s&lt;/code&gt; extension is the conventional one for a detached CMS signature, which is why you'll see it throughout this post.&lt;/p&gt;
&lt;h2&gt;Archives and disk images: nothing to do&lt;/h2&gt;
&lt;p&gt;Signing a zip while keeping it usable is by far the most common case, so Signotaur &lt;strong&gt;automatically&lt;/strong&gt; uses detached signatures for common archive and disk-image formats, with no extra flags:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SignotaurTool.exe sign -a [APIKey] -s [SignServer] -t [Thumbprint] release.zip&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That signs &lt;code&gt;release.zip&lt;/code&gt; and writes the signature to &lt;code&gt;release.zip.p7s&lt;/code&gt; alongside it. &lt;code&gt;release.zip&lt;/code&gt; itself is not touched — same bytes, same hash, still opens in any zip tool. The formats handled this way are &lt;code&gt;.zip&lt;/code&gt;, &lt;code&gt;.7z&lt;/code&gt;, &lt;code&gt;.tar&lt;/code&gt;, &lt;code&gt;.gz&lt;/code&gt;, &lt;code&gt;.tgz&lt;/code&gt;, &lt;code&gt;.bz2&lt;/code&gt;, &lt;code&gt;.xz&lt;/code&gt;, &lt;code&gt;.iso&lt;/code&gt;, &lt;code&gt;.img&lt;/code&gt;, &lt;code&gt;.vhd&lt;/code&gt; and &lt;code&gt;.vhdx&lt;/code&gt;.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="https://cdn.finalbuilder.com/blog/daves/signotaur-detached-cms/detached-sign-output.png" alt="Command Prompt output of SignotaurTool signing a zip with a detached CMS/PKCS#7 signature; the final line shows the signature written to the matching .p7s file alongside the untouched original."&gt;&lt;/p&gt;
&lt;p&gt;Files that &lt;em&gt;do&lt;/em&gt; have a native embedded format — PE, MSI, NuGet, VSIX, RDP, ClickOnce manifests, &lt;code&gt;.mobileconfig&lt;/code&gt; — keep using it. You don't have to think about which is which; the &lt;code&gt;sign&lt;/code&gt; command routes each file by its type.&lt;/p&gt;
&lt;h2&gt;Other file types: &lt;code&gt;--detached&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;To produce a detached signature for a file type that Signotaur would not otherwise sign as an embedded format — for example a &lt;code&gt;.txt&lt;/code&gt;, a &lt;code&gt;.json&lt;/code&gt;, an arbitrary binary — add &lt;code&gt;--detached&lt;/code&gt; (&lt;code&gt;--dt&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SignotaurTool.exe sign -a [APIKey] -s [SignServer] -t [Thumbprint] --detached manifest.json&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This writes &lt;code&gt;manifest.json.p7s&lt;/code&gt; and leaves &lt;code&gt;manifest.json&lt;/code&gt; alone. The flag is ignored for file types that have their own embedded signature, so it's harmless to leave on in a script that signs a mix of things.&lt;/p&gt;
&lt;h2&gt;Choosing where the signature lands&lt;/h2&gt;
&lt;p&gt;By default the signature is written next to each signed file as &lt;code&gt;[file].p7s&lt;/code&gt;. To put signatures somewhere else, use &lt;code&gt;--signature-file&lt;/code&gt; (&lt;code&gt;--sf&lt;/code&gt;). For a single file you can give an exact path:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SignotaurTool.exe sign release.zip --signature-file C:\sigs\release.sig ...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When signing many files at once, use placeholders so each output is distinct:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;{name}&lt;/code&gt; — the file name including extension (&lt;code&gt;archive.zip&lt;/code&gt; → &lt;code&gt;archive.zip.p7s&lt;/code&gt;).&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;{name-no-ext}&lt;/code&gt; — the file name without extension (&lt;code&gt;archive.zip&lt;/code&gt; → &lt;code&gt;archive.p7s&lt;/code&gt;).&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;{rel-path}&lt;/code&gt; — the file path relative to the current directory, or to &lt;code&gt;--base-directory&lt;/code&gt; if specified. This avoids collisions when different folders contain files with the same name.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;SignotaurTool.exe sign src\**\*.zip --signature-file sigs\{rel-path}.p7s ...&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Any directories in the output path are created for you. An exact (placeholder-free) path is only valid when signing a single file — otherwise every file would write to the same signature file.&lt;/p&gt;
&lt;h2&gt;Verifying&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;.p7s&lt;/code&gt; file is a plain CMS/PKCS#7 SignedData structure, so it's not locked to Signotaur. Point &lt;code&gt;verify&lt;/code&gt; at either the original or its &lt;code&gt;.p7s&lt;/code&gt; signature and it auto-detects the pairing:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SignotaurTool.exe verify release.zip&lt;/code&gt;&lt;/pre&gt;
&lt;p style="text-align: center;"&gt;&lt;img src="https://cdn.finalbuilder.com/blog/daves/signotaur-detached-cms/detached-verify-output.png" alt="Terminal output from SignotaurTool verify confirming a valid detached signature, showing the signer certificate and a verified result."&gt;&lt;/p&gt;
&lt;p&gt;And because it's standards-compliant, OpenSSL — or anything else that speaks CMS — can verify it too:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openssl cms -verify -binary -inform DER -in release.zip.p7s -content release.zip -CAfile root.pem -out NUL&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That example assumes a signer certificate issued directly by the root in &lt;code&gt;root.pem&lt;/code&gt;; in practice, use whichever CA bundle or certificate chain is appropriate for the signer certificate. (&lt;code&gt;-out NUL&lt;/code&gt; just discards the recovered content so the zip isn't dumped to the console.)&lt;/p&gt;
&lt;p&gt;If you only need an integrity check — confirm the signature matches the content, without deciding whether the signer is trusted — add &lt;code&gt;-noverify&lt;/code&gt;. It skips chain validation, so no &lt;code&gt;root.pem&lt;/code&gt; is required:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;openssl cms -verify -noverify -binary -inform DER -in release.zip.p7s -content release.zip -out NUL&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This confirms the bytes haven't changed since signing, but it does &lt;em&gt;not&lt;/em&gt; establish that you trust the signer — for that, use the chain-validating form above.&lt;/p&gt;
&lt;p&gt;RFC 3161 timestamping works on detached signatures the same as everywhere else — pass &lt;code&gt;--tr&lt;/code&gt; (and optionally &lt;code&gt;--st&lt;/code&gt;) and the timestamp is embedded into the &lt;code&gt;.p7s&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Detached signing extends Signotaur beyond formats with a built-in signature slot. Where a file has a native signing format, Signotaur continues to use it. Where it does not, Signotaur can write a clean &lt;code&gt;.p7s&lt;/code&gt; signature alongside the untouched original.&lt;/p&gt;
&lt;p&gt;The result is still standards-compliant CMS/PKCS#7, so consumers are not tied to Signotaur for verification. More to come, but this removes a "you can't sign that" answer we'd rather not give.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;For the full option reference see the &lt;code&gt;sign&lt;/code&gt; and &lt;code&gt;verify&lt;/code&gt; command pages in the &lt;a href="https://docs.finalbuilder.com/sn/1.0/"&gt;Signotaur documentation&lt;/a&gt;. As always, the private key never leaves your signing server — detached or embedded, only the digest is ever sent for signing.&lt;/p&gt;
</description><guid isPermaLink="false">885</guid></item></channel></rss>