You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: guides/code-signing/code-signing-windows.md
+135-4
Original file line number
Diff line number
Diff line change
@@ -6,19 +6,21 @@ description: >-
6
6
7
7
# Signing a Windows app
8
8
9
+
## Using traditional certificates
10
+
9
11
{% hint style="warning" %}
10
12
Starting June 1, 2023 at 00:00 UTC, private keys for code signing certificates need to be stored on a hardware storage module compliant with FIPS 140 Level 2, Common Criteria EAL 4+ or equivalent.\
11
13
\
12
14
In practice, this means that software-based OV certificates used in the steps below will no longer be available for purchase. For instructions on how to sign applications with newer token-based certificates, consult your Certificate Authority's documentation.
13
15
{% endhint %}
14
16
15
-
## Prerequisites
17
+
###Prerequisites
16
18
17
-
### Installing Visual Studio
19
+
####Installing Visual Studio
18
20
19
21
On Windows, apps are signed using [Sign Tool](https://learn.microsoft.com/en-us/dotnet/framework/tools/signtool-exe), which is included in Visual Studio. Install Visual Studio to get the signing utility (the free [Community Edition](https://visualstudio.microsoft.com/vs/community/) is enough).
20
22
21
-
### Acquiring a certificate
23
+
####Acquiring a certificate
22
24
23
25
You can get a [Windows Authenticode](https://learn.microsoft.com/en-us/windows-hardware/drivers/install/authenticode) code signing certificate from many vendors. Prices vary, so it may be worth your time to shop around. Popular vendors include:
24
26
@@ -32,7 +34,7 @@ You can get a [Windows Authenticode](https://learn.microsoft.com/en-us/windows-h
32
34
Your certificate password should be a **secret**. Do not share it publicly or commit it to your source code.
33
35
{% endhint %}
34
36
35
-
## Configuring Electron Forge
37
+
###Configuring Electron Forge
36
38
37
39
On Windows, Electron apps are signed on the installer level at the **Make** step.
38
40
@@ -56,3 +58,132 @@ module.exports = {
56
58
};
57
59
```
58
60
{% endcode %}
61
+
62
+
## Using Azure Trusted Signing
63
+
64
+
[Azure Trusted Signing](https://azure.microsoft.com/en-us/products/trusted-signing) is Microsoft's modern cloud-based alternative to EV certificates. It is the cheapest option for code signing on Windows, and it gets rid of SmartScreen warnings.
65
+
66
+
As of November 2024, Azure Trusted Signing is available to organizations with 3+ years of verifiable business history and to individuals. Microsoft is [looking to make the program available](https://github.com/Azure/trusted-signing-action/issues/42#issuecomment-2488402061) to organizations with a shorter history, too. If you're reading this at a later point, it could make sense to check.
67
+
68
+
### Prerequisites
69
+
70
+
First, create an Azure account and set up Azure Trusted Signing in your account as described [here](https://melatonin.dev/blog/code-signing-on-windows-with-azure-trusted-signing/).
71
+
72
+
Then install the dependencies for local code signing as described [here](https://melatonin.dev/blog/code-signing-on-windows-with-azure-trusted-signing/#step-8-signing-locally). Also create the required `metadata.json` file in an arbitrary location on your computer.
73
+
74
+
### Configuring Electron Forge
75
+
76
+
#### Installing npm dependencies
77
+
78
+
In your project directory, do the following:
79
+
80
+
1. Install the `dotenv-cli` package: `npm i -D dotenv-cli`
81
+
2. Update `@electron/windows-sign` to version 1.2.0 or later: `npm update @electron/windows-sign`
82
+
83
+
#### Creating the `.env.trustedsigning` file
84
+
85
+
Create a file `.env.trustedsigning` in your project root with the following content:
Fill in the credentials for your Azure App Registration user into the first three variables.
99
+
100
+
Adjust the other variables to be the absolute paths to the `metadata.json`, `Azure.CodeSigning.Dlib.dll` and `signtool.exe` files that you created or installed as part of the prerequisites.
101
+
102
+
{% hint style="warning" %}
103
+
Ensure that none of the paths have spaces in them. Otherwise, signing will fail. (`@electron/windows-sign` issue [#45](https://github.com/electron/windows-sign/issues/45) currently prevents quoting of paths with spaces.)
104
+
{% endhint %}
105
+
106
+
#### Adjusting your `.gitignore`
107
+
108
+
Add `.env.trustedsigning` to your `.gitignore` file. You should never commit login credentials to version control.
109
+
110
+
In addition, add `electron-windows-sign.log` to `.gitignore`. This file will be created automatically during the signing process.
111
+
112
+
{% code title=".gitignore" %}
113
+
```gitignore
114
+
.env.trustedsigning
115
+
electron-windows-sign.log
116
+
```
117
+
{% endcode %}
118
+
119
+
#### Creating the `windowsSign.ts` file
120
+
121
+
Create a file `windowsSign.ts` in your project root with the following content:
If you are using JavaScript for your configuration instead of TypeScript, adjust the file accordingly. Name the file `windowsSign.js` and remove the type information.
141
+
{% endhint %}
142
+
143
+
Some notes:
144
+
145
+
We specify the `/v` and `/debug` parameters even though they aren't technically required. This ensures that warnings are logged if timestamping fails.
146
+
147
+
**Do not** use the `debug` parameter on the `WindowsSignOptions`. Similarly, **do not** enable the `DEBUG` environment variable for `electron-windows-sign`. (If you do either of them, the `debug` npm package will log all debug messages to stderr. An executable in `@electron/windows-sign` will interpret the existence of messages printed to stderr as a signing failure. Then your build will fail.)
// @ts-expect-error - incorrect types exported by MakerSquirrel
167
+
windowsSign,
168
+
}),
169
+
],
170
+
};
171
+
```
172
+
{% endcode %}
173
+
174
+
#### Updating your npm scripts
175
+
176
+
When you call scripts such as `electron-forge make` or `electron-forge publish`, you will now have to prefix them with `dotenv -e .env.trustedsigning -- `. This loads the environment variables from the `.env.trustedsigning` file.
177
+
178
+
For example, your npm scripts in your `package.json` might then look like this:
0 commit comments