Form.io Digital Signature - Coming Soon
Introduction
Form.io Digital Signature is designed to confirm that the signed piece of data and its context (the form, custom properties, etc.) have not changed since it was signed.
Key aspects of the Digital Signature solution provided by Form.io:
Zero-trust. It exists entirely within the app, in your environment; you don't have to trust 3rd-party providers with your Digital Signatures. The Digital Signatures are stored in your database.
API-driven. You can access any signed data/form via API, using its native submission ID.
Decoupled from PDFs. Form.io Digital Signatures lets you take an immutable snapshot of data within your app without relying on PDFs (but still export to PDF if you need).
Full control on Digital Signature private key. Signature data is stored in the databased as a token signed with the private key provided by you. You can store your keys outside of your deployment (e.g. using AWS KMS) or set it as the Form.io enterprise server environment variable.
Sign using any field type, any context. Any input field can be used as a signature: checkbox, email, signature, text field and so on. Your signature can sign the whole form data or just a part of it.
Customize the Digital Signature stamp. Use your custom templates for the Digital Signature stamp.
Licensing
After Digital Signatures are enabled for the license key, the Digital Signatures tab is available under the Modify section in the navigation bar of any form.
Enabling Digitial Signature
The Digital Signature configuration is available after the form has the following settings enabled:
Submission Revisions
Form Revisions set to 'Use original form revisions when viewing submissions'.
Digital Signature Settings
To implement Digital Signatures in a form, first decide what form components will be used as signatures in the form. Different components can serve as a Digital Signature. To set a component as a Digital Signature:
Add the component(s) to the form.
Click Add Digital Signature to attach Digital Signature functionality to the desired components. A form can have one or more components that serve as Digital Signatures.
Digital Signature Component Settings
When a component is set to be a Digital Signature, the following settings are configurable:
Digital Signature Component - The form component that will be used as a signature.
Digital Signature Data - Select the form components on which the data will be confirmed by the Digital Signature. If the signed value of these fields changes, the Digital Signature becomes invalid and the data is expected to sign again.
Include all form data in Digital Signature - When this setting is enabled, the Digital Signature will be responsible for all form data. If the value of some form component is changed, the Digital Signature will be invalid and the data is expected to sign again.
Submission properties to include in Digital Signature - A comma separated path to the data inside the submission object that will be used for the Digital Signature verification. This setting selects the submission properties (except for submission data) that will invalidate the Digital Signature when they are changed.
Do not disable signed data - By default, the signed data is disabled in the UI to protect it from modifications. Enable this setting to leave signed data enabled.
The Templates settings sets the default template of the Digital Signature stamp and tooltip.
Digital Signature Templates
The Templates settings enables users to customize UI for Digital Signature stamp and tooltip using the JavaScript Lodash library.
Several variables are available inside templates:
esign
The form.io Digital Signature object
esignTooltip
The markup of the Digital Signature tooltip represented as a string (available only for the stamp template).
esignInvalidMessage
The default message for invalid Digital Signature (available only for the stamp template).
esignIconClass
The class of the Digital Signature default stamp icon (available only for the stamp template).
form
The complete form JSON object
submission
The complete submission object.
data
The complete submission data object.
row
Contextual "row" data, used within DataGrid, EditGrid, and Container components
component
The current component JSON
instance
The current component instance.
value
The current value of the component.
moment
The moment.js library for date manipulation.
_
An instance of Lodash.
utils
An instance of the FormioUtils object.
util
An alias for "utils".
esign object
The esign variable is available in both stamp and tooltip templates and contains main information about the Digital Signature.
The esign object typically has the following properties:
created - the ISO formatted date of Digital Sigature creation;
valid - if Digital Signature is valid it has a true value, if not - the massage why Digital Signature is not valid;
_id - Digital Signature ID;
_sid - ID of the submission that contains this Digital Signature;
signature - the object with Digital Signature data that has the following properties:
compPath - path to Digital Signature component inside the form JSON;
valuePath - path to the value of the Digital Signature component in submission data;
user - the id and email of the user who signs the Digital Signature field;
submission - the submission revision object (without submission data) created together with Digital Signature.
Digital Signature Stamp Template
Example of a custom stamp template:
{% if (esign.valid === true) { %}
<span class="formio-esign-stamp">
<i ref="esignTooltip" style="cursor:pointer" data-tooltip="{{esignTooltip}}" class='{{esignIconClass}}' aria-hidden='true'></i>
<span class="formio-esign-stamp-description">
Signed on {{new Date(esign.created).toLocaleString()}}
</span>
</span>
{% } %}
{% if (esign.valid !== true) { %}
<span class="formio-esign-stamp formio-esign-stamp-invalid formio-esign-stamp-description">
<i ref="esignTooltip" style="cursor:pointer" data-tooltip="{{esignTooltip}}" class='{{esignIconClass}}' aria-hidden='true'></i>
Invalid eSignature
</span>
{% } %}Tips:
To use a tooltip with your Digital Signature stamp, add the following attributes to some HTML element inside the stamp template:
ref="esignTooltip" data-tooltip="{{esignTooltip}}.
An example of this attribute inserted in a HTML is:
<i ref="esignTooltip" data-tooltip="{{esignTooltip}}" class='{{esignIconClass}}'></i>< ref="esignTooltip" style="cursor:poer" data-tooltip="{{esignTooltip}}" class='{{esignIconClass}}' aria-hidden='true'></i>To use a different stamp template for the form and printed PDF (when viewing the submission as a PDF), check if instance.options.pdf is true:
{% if (instance.options.pdf) { %}
// stamp template for printed PDF
{% } %}
{% if (!instance.options.pdf) { %}
// stamp template for the form
{% } %}To use different stamp template to differntiate between valid and invalid Digital Signatures, check if esign.valid is equal to true or not:
{% if (esign.valid === true) { %}
// stamp template for valid eSignature
{% } %}
{% if (esign.valid !== true) { %}
// stamp template for invalid eSignatrue
{% } %}Digital Signature Tooltip Template
The following code snippet provides an example of a custom tooltip template:
<div class="formio-esign-tooltip">
<span class="{{esign.valid !== true ? 'formio-esign-tooltip-header-invalid' : ''}} formio-esign-tooltip-header">
<span>eSignature</span>
<span class="formio-esign-tooltip-status" >{{esign.valid !== true ? 'invalid' : 'verified'}}</span>
</span>
<ul class="formio-esign-tooltip-info">
<li class="formio-esign-tooltip-info-item"><span class="formio-esign-tooltip-info-item-title">ID:</span><<span>{{esign?._id || '-'}}</span></li>
<li class="formio-esign-tooltip-info-item"><span class="formio-esign-tooltip-info-item-title">Path:</span><span>{{esign?.signature?.valuePath || '-'}}</span></li>
</ul>
</div>
Digital Signature Cryptography
Digital Signature uses asymmetric cryptographic keys to sign and verify a snapshot of the data. The required key is supplied by the form builder.
There are 2 ways to provide keys for Digital Signature cryptographic operations:
Set ESIGN_PRIVATE_KEY variable for the form.io server deployment;
Add integration with third-party key management service (e.g. AWS KMS).
ESIGN_PRIVATE_KEY server variable
The simplest way to provide your keys for Digital Signature is to set the ESIGN_PRIVATE_KEY variable for your deployment of the formio/formio-enterprise. It is not recommended to set the public key as an environment variable, as it can be easily extracted from the private key.
Requirements for a private key set to ESIGN_PRIVATE_KEY:
Key type: RSA
Key size: 2048-bit
Public key:
type: 'spki'
format - 'pem';
Private key:
type - 'pkcs8'
format - 'pem'
An example of RSA2048 key generation using the node:crypto module:
const crypto = require('crypto');
const { privateKey } = crypto.generateKeyPair(
'rsa',
{
modulusLength: 2048,
publicKeyEncoding: {
type: 'spki',
format: 'pem',
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
},
}
);Integration with Key Management Services (KMS)
To use a third party provider to store and manage Digital Signature keys, add Digital Signature integration settings on the project level.
AWS KMS
The Form.io Digital Signature can use AWS KMS API to sign and verify the Digital Signature data.
To begin by creating an RSA2048 key available for 'sign and verify' operations in AWS KMS:
Log in to your AWS account;
Open Services > Security, Identity, & Compliance > Key Management Service
Click on the Create a key button on the main AWS KMS page or Select Customer managed keys on the left-hand sidebar, then click on the Create a key button on the top of the keys list:
Follow the key setup wizard to create your key. The step 1 key settings should resemble the following:
In the Customer managed keys list, open the key that was just created from the key list section and copy the Key ID:

Create an Access Key for your AWS account, and copy the Access Key ID and Secret Key. Check AWS documentation to create the access key for your account:
https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html
Next, add AWS KMS integration settings to the Form.io project settings through the Developer Portal:
Open the intended project on the Form.io Developer Portal.
Open the project's Settings, and click Digital Signature.
Add the AWS KMS settings:

Save the project settings.
From this point, the AWS KMS API will be used for the Digital Signature cryptographic operations for this project.
Digital Signature Examples
Create a new form and add components as shown in the example below:
This form is expected to have 3 signatures:
The signature of the purchase initiator, who is to fill in fields 1-3 and sign this data by adding the name in field 4.
The signature of the head of department, who approves the purchase in field 5.
The signature of the accountant who fills in the budget field and confirms it by adding a signature in field 7.
Configure the example Digital Signature:
Once the form described above has been created, configure the form settings as follows:
Enable submission revisions and original form revisions for the form:
From the toolbar, go to Modify > Digital Signature. Click the Add Digital Signature button and configure Digital Signature for Field 4:
Click Save.
Repeat these steps to add Digital Signatures for Field 5 and Field 7, being sure to save them:
Save the Digital Signature settings by clicking on Save Settings.
To see the Digital Signatures in action:
Go to the Use tab, fill in fields 1-4 and submit the form.
Go tot he Data tab and open the submission that was just made.
When viewing/editing this submission, note that the green Digital Signature stamp is displayed under field 4. This stamp confirms that the Digital Signature was created, and that neither the Digital Signature data (fields 1-4) nor the form have been changed since it was signed. Hovering the cursor above the signature stamp reveals the signature metadata.
Edit the submission. Note that fields 1-4, protected by the signature, are disabled.
Fill in field 5 and Submit the form. Note that a Digital Signature is created for field 5.
Fill in fields 6 and 7, then Submit the form. Note that Digital Signatures are created for all signature fields:
Digital Signature validation when 'Do not disable signed data' is enabled
When the signed fields are not disabled from modification, Digital Signature data is validated on the client side. If some signed value is changed, Digital Signature becomes invalid and the signature field is cleared. That means the changed data is must be signed again.
To see this in action:
Follow steps 1-2 from the previous example.
Open Digital Signature settings and enable Do not disable signed data. Click the Save Settings button to save this change.
Sign the form following steps 3-5 from the previous example. Note that signed fields are not disabled and can be edited.
Edit the submission and change the quantity field from 1 to 2. As a consequence, the Digital Signatures for fields 4 and 5 become invalid and signature values are reset.
The Digital Signature for Field 7 is still valid, as it is only responsible for the data in field 6. If there is a change to Field 6, the Field 7 value will be cleared and the Digital Signature will become invalid. These fields will need to be signed again and new Digital Signatures will be created for the form.
Digital Signature and PDF
PDF-First Form
Digital Signatures with PDF-first forms function in the same way as with web forms.
PDF View of Webform Submissions
The PDF of the webform submission on a form that contains Digital Signatures will displays a Digital Signature stamp on any signed fields.
Render Digital Signatures in an application
Use @formio/esignature module to render Digital Signatures in an application by completing the following steps:
Use one of the following terminal commands to install the @formio/esignature module into your application:
npm i --save @formio/esignatureor
yarn add @formio/esignatureConnect the Digital Signature module in your application:
import {Formio} from 'formiojs';
import esignature from '@formio/esignature';
Formio.use(esignature);
Import the Digital Signature module styles in your application:
import '@formio/esignature/esignature.css';Last updated
Was this helpful?
