version: 2024-02
Prerequisites |
---|
View our About Google Workspace Client-Side Encryption guide. |
This software allows you to protect your organization’s Google Workspace data with strong Client-Side Encryption (CSE).
The Google Workspace Key Manager (WKM) is a server software service that wraps and unwraps (encrypts and decrypts) Data Encryption Keys (DEKs) for use in Google Workspace web and native applications, such as Google Drive, Google Docs, and more.
Your company deploys the software to a server, running either on your premises or in the cloud. You don’t need to install any special programs or add-ons on user workstations, and no regular actions are required by users, only regular maintenance of the server by your IT department. Additionally, FlowCrypt offers this software as a SaaS solution, where you don’t need to worry about maintaining servers, as we manage everything for you.
The app is based on Key Encryption Keys (KEKs) derived on the fly using a set of master secrets, which, in turn, may be stored using your existing infrastructure on any PKCS#11 or KMIP-compatible Hardware Security Module (HSM) or software Key Management System (KMS). KEK-encrypted Data Encryption Keys (DEKs) are then uploaded to GSuite along with the encrypted data.
The API is a REST API with JSON body requests and responses, accessed by the Google Workspace web app and Google Workspace
client software. SSL connections can be either terminated in the WKM or by using an SSL terminating reverse proxy. In the
latter case, you can set the api.https.enabled
property to false
in the config file.
Requirements
All the requirements described in the Enterprise Server Deployment Requirements plus the following:
Type | Requirement |
---|---|
Key Storage | The WKM derives keys on the fly from master secrets. You have a choice on how to load master secrets during the startup process, from a properties file, stdin, a PKCS#11, or a KMIP-1.0 compatible key store, such as Gemalto Safenet KeySecure over KMIP, Fortanix SDKMS, and Equinix SmartKey over PKCS#11. |
Networking | The WKM must be accessible on an internal URL from the client’s devices, with a TLS certificate trusted by the client. The instance shouldn’t be accessible from the public internet, but it needs limited outward access to the internet to fetch IdP JWK for user authentication and Google JWK for request authorization. |
Distribution and deployment
FlowCrypt WKM is distributed as a zip file containing:
Filename | Description |
---|---|
flowcrypt-workspace-key-manager.jar |
Runnable Java JAR |
flowcrypt-workspace-key-manager.properties |
Default config |
flowcrypt-workspace-key-manager-docs.md |
Documentation |
LICENSE.txt |
License file (proprietary) |
For deployment, install OpenJDK 17, copy the .jar
and the .properties
files, and edit the latter before running.
Windows only: If your OS doesn’t use a UTF-8 file encoding by default, you should ensure that the app uses the UTF-8
encoding. UTF-8 support is required by the Google Workspace CSE KACLS. The easiest way to do this is to set the JAVA_TOOL_OPTIONS
environment variable to -Dfile.encoding=UTF8
. Alternatively, when starting the application, you can add the encoding
system property to the java -Dfile.encoding=UTF-8 -jar flowcrypt-workspace-key-manager.jar
startup command.
How to run the application
Before you run the application, you have to set up your master secrets. See the section on how to generate master secrets for this purpose.
Once your master secrets and other properties are configured, start the WKM by running the java -jar flowcrypt-workspace-key-manager.jar
command.
The default command is to start the server at the localhost:32567
address. Other commands are:
Command | Description |
---|---|
--version |
Print application version. |
--help |
Print application help. |
--create-master-key |
Generates a master key and prints it out if the store.master.key.source is set to either stdin or properties . If store.master.key.source is set to either kmip or pkcs11 , the newly generated key will also be automatically stored at the configured KMIP or PKCS#11 store. This should be done one time during the initial configuration. |
--create-migration-key |
Generates a migration key allowing certs and privileged unwrap KACLS calls to remain consistent over multiple servers and between restarts. |
--upload-mail-certificate |
Extracts a private key from an S/MIME certificate, wraps it, and uploads it along with the certificate to Gmail. |
--test-store-connection |
This will test that you have a master key retrieval properly configured. It may ask for the master key in case you set store.master.key.source to stdin . |
Command line options:
Argument | Default | Description |
---|---|---|
--config=<cfg.properties> |
flowcrypt-workspace-key-manager.properties |
Config file path or an HTTP(S) URL |
Configuration
The sample configuration file, appropriate for your software version, will come distributed along with the jar file. It consists of several sections: Common, Store, Logger, Authentication, Google Workspace, and ACL. Each section is described in detail below:
Configuration: Common
Property | Description |
---|---|
api.url |
The full URL where the service can be reached. Example: https://wkm.evaluation.org
|
api.url.add.to.accept.hosts |
Set to true if you want the host from the api.url property to be added to the list of allowed hosts.Example: true
|
See the Enterprise Server General Configuration and HTTPS guide for more detailed information.
Configuration: Store
The WKM needs to be set up with a master key and a test vector. All individual object (cloud file) keys are then derived from these master secrets on the fly. To generate your master secrets, run the following command:
$ java -jar flowcrypt-workspace-key-manager.jar --create-master-key
This command will generate a master key and print out the associated test vector for you:
Output | Description |
---|---|
Master Key |
Base64 encoded 32 bytes (256 bits) random value used for key derivation. Keep this strictly secret. It’s only required if store.master.key.source is set to either stdin or properties . |
Test Vector |
Base64 encoded 32 bytes (256 bits) test value encoded as Base64 that’s used to verify the correctness of the supplied master key. This is especially useful when the sysadmin chooses to enter secrets from stdin manually. |
Secret retrieval option | Description |
---|---|
properties |
Store the master key in the properties file. |
stdin |
Sysadmin needs to supply the master key manually during app startup, through a command-line prompt. |
pkcs11 |
The master key retrieved automatically from a PKCS11-compatible secret storage. |
kmip |
The master key retrieved automatically from a KMIP-compatible secret storage. |
The retrieval options can and should be combined. For example, for high security, you could have one secret stored over KMIP and another one supplied manually during WKM startup. On the other end of the spectrum, for ease of setup and convenience, you could supply both values in the properties file.
Property | Description |
---|---|
store.type |
This is the default and recommended option. Example: MasterKeyStore
|
store.master.derivation.scheme |
Derivation scheme. The current only option is sha256-aes-ecb , which uses AES256-ECB-ENCRYPT(key=MasterKey, data=SHA256(entry_id)) to derive individual keys from the master key.Example: sha256-aes-ecb
|
store.master.key.source |
How to retrieve the master key. Options are properties , stdin , kmip , and pkcs11 .Example: stdin
|
store.master.key.value |
(for store.master.key.source=properties ) Set this property if you wish to set the master key in the properties file. Regardless of the ‘source’ you choose, you must ensure a safe backup of the master key for disaster recovery. If you lose the master key, all of the encrypted data will become unreadable.Example: from --create-master-key
|
store.test.vector.source |
The only option. Set the test vector directly in the properties file. Example: properties
|
store.test.vector.value |
This is used to cross-check the entered master key. Example: from --create-master-key
|
If you’ve chosen kmip
or pkcs11
for any of the source
properties, you also need to tell WKM how to connect to such
a store to retrieve the master key.
KMIP integration
Our implementation is tested against the PyKMIP server. While KMIP is a vendor-agnostic protocol, implementations do vary from vendor to vendor. When planning a PoC, please allocate sufficient time for us to test against and integrate with your particular KMIP vendor.
Property | Description |
---|---|
store.kmip.hostname |
(for store.master.key.source=kmip ) The hostname of the KMIP server.Example: kmipserver
|
store.kmip.port |
(for store.master.key.source=kmip ) The listening port of the KMIP server.Example: 5696
|
store.kmip.master.key.identifier |
(for store.master.key.source=kmip ) The unique identifier of the master key stored in the KMIP server.Example: 2005
|
store.kmip.master.key.name |
(for store.master.key.source=kmip ) The name of the master key stored in the KMIP server.Example: flowcrypt-workspace-km-master-key
|
store.kmip.key.file |
(for store.master.key.source=kmip ) The keystore file containing the certificate to present to the KMIP server on TLS handshake.Example: keystore.p12
|
store.kmip.key.password |
(for store.master.key.source=kmip ) The password to access the KMIP keystore file.Example: changeit
|
KMIP authentication
KMIP authentication operates as follows. The server (your key store or HSM) as well as the client (in this case, WKM)
possess their own TLS certificates. Each certificate must be mutually trusted to establish a connection. When configuring
WKM, you can use the truststore.file
property to point to a file containing trusted certificates. These certificates
are used to validate the KMIP server’s credentials, preventing man-in-the-middle (MITM) attacks. Likewise, your KMIP
server should be configured to strictly verify the client’s certificate.
PKCS#11 integration
We develop and test our implementation against Equinix SmartKey (Fortanix SDKMS). For this purpose, we used their PKCS#11
shared .so
library module, accessed through the iaik.pkcs.pkcs11.wrapper
Java library. To connect our software to your
PKCS#11 HSM, update the store.pkcs11.module
property to point to the module provided by your HSM vendor.
To test your PKCS module, you can use the pkcs11-tool utility on Ubuntu:
$ sudo apt-get -y install opensc
$ pkcs11-tool --module vendor-pkcs11.so --show-info
After, set the following properties in the properties file:
Property | Description |
---|---|
store.pkcs11.module |
(for store.master.key.source=pkcs11 ) Path to a PKCS#11 shared library. The library can be obtained from your HSM vendor.Example: ./vendor-pkcs11.so
|
store.pkcs11.pin |
(for store.master.key.source=pkcs11 ) PKCS#11 token pin. In the case of Fortanix and possibly other vendors, this is actually a path to a PKCS#11 config file.Example: file://vendor-pkcs11.cfg
|
Test store connection
To test that the WKM can retrieve master secrets and they’re valid, run this command:
java -jar flowcrypt-workspace-key-manager.jar --test-store-connection
This will validate a test vector to make sure the Store is properly set up. The command returns status 0
on Unix systems
when successful.
The successful output looks like the following:
Registering StdoutLogger as a Logger implementation
INFO Reflection - Registering MasterKeyStore as Store implementation
INFO MasterKeyStore - Successfully validated MasterKeyStore Test Vector
INFO c.f.keymanager.TestStoreConnection - initiating test
INFO c.f.keymanager.TestStoreConnection - success
Configuration: Authenticator
The authenticator component configures an OpenId Connect service which verifies non-Google-issued JWTs (JSON web tokens), asserting the identity of the user who accesses an object.
First, you need to decide if you want to use Google as your IdP or if you want to use your own. Then, set up an OpenID Connect (OIDC) authentication app on your IdP as follows:
IdP App property | Value |
---|---|
App Type |
Open ID Connect , OIDC , Web Application , or oAuth2 . The exact choice depends on your IdP. |
Name |
FlowCrypt WKM (customizable). |
Rectangular icon | Download the icon. |
Square icon | Download the icon. |
Authorized JavaScript origins |
drive.google.com , docs.google.com . More origins will be added over time as Google implements them. |
Redirect/callback URLs |
https://krahsc.google.com/callback https://krahsc.google.com/oidc/cse/callback https://krahsc.google.com/oidc/drive/callback https://krahsc.google.com/oidc/gmail/callback https://krahsc.google.com/oidc/meet/callback https://krahsc.google.com/oidc/calendar/callback https://krahsc.google.com/oidc/docs/callback https://krahsc.google.com/oidc/sheets/callback https://krahsc.google.com/oidc/slides/callback https://client-side-encryption.google.com/callback https://client-side-encryption.google.com/oidc/cse/callback https://client-side-encryption.google.com/oidc/drive/callback https://client-side-encryption.google.com/oidc/gmail/callback https://client-side-encryption.google.com/oidc/meet/callback https://client-side-encryption.google.com/oidc/calendar/callback https://client-side-encryption.google.com/oidc/docs/callback https://client-side-encryption.google.com/oidc/sheets/callback https://client-side-encryption.google.com/oidc/slides/callback
|
Login URL | Leave blank if you’re using OneLogin. |
Grant Type |
Authorization Code with PKCE . Implicit will also work but is less secure. Please note that the app must be set up to NOT use a client secret. Google has no option for a client secret and authentication will fail. |
Refresh Tokens | Leave this disabled as they are not supported. |
IdP-specific instructions:
-
OneLogin: Applications ⮕ Add App ⮕ find and choose the
OpenId Connect (OIDC) app from OneLogin, Inc. ⮕ name it FlowCrypt WKM App ⮕
Save. When done, go to Applications ⮕ select FlowCrypt WKM App from the list of apps
⮕ on the left menu, select Configuration, and fill in the Redirect URI’s field with the
Redirect/callback URLs mentioned above ⮕ Next, click on the SSO on the left menu and take
note of the pre-generated client ID and Issuer URL for your app. There are the fields to put into the WKM properties file:
Client ID
(put intoauth.enduser.default.audience
andauth.admin.default.audience
),Issuer URL V2
(put intoauth.enduser.default.issuer
andauth.admin.default.issuer
), andV2 .well-known URL
. Make sure all of your users can access this newly created application by implementing a rule, policy, or another such mechanism on OneLogin. -
Google Developer Console:
console.developers.google.com
⮕ the top left project selector ⮕ NEW PROJECT ⮕ FlowCrypt-WKM. Next, new OAuth Consent Screen ⮕ internal, add a name and logo as above, authorized domains:google.com
. Finally, in the left menu choose Credentials ⮕ + CREATE CREDENTIALS ⮕ OAuth Client ID ⮕ Web Application ⮕ fill in the JavaScript origins and redirect URI as above ⮕ CREATE. You’ll get your Client ID on the next screen (the client secret isn’t needed).
Next, connect your IdP with Workspace CSE. You have two options to choose from, either hosting a /.well-known/cse-configuration
file or connecting to your IdP using the Admin console. For more information, please refer to
the Connect to your identity provider for client-side encryption guide.
Property | Description |
---|---|
auth.enduser.idps |
A comma-separated list of Identity Providers’ names for standard users. Example: default
|
auth.enduser.<idp>.issuer |
Substitute <idp> for the IdP name above. The expected issuer of the authentication JWT token.Example: https://accounts.google.com/
|
auth.enduser.<idp>.audience |
Substitute <idp> for the IdP name. The expected JWT token aud claim. If you use Google as your IdP, then this should be your oAuth Client ID. Accepts a comma-separated list of client IDs for Google mobile/desktop apps.Example: audience
|
auth.enduser.<idp>.jwks optional |
Substitute <idp> for the IdP name. The JWKS (JSON Web Key Set) containing the public keys to validate the authentication JWTs against. When not provided, WKM will attempt to poll [issuer]/.well-known/openid-configuration to retrieve the JWKS URL during the startup process.Example: https://www.googleapis.com/oauth2/v3/certs
|
auth.admin.idps |
A comma-separated list of Identity Providers’ names for admins. Example: default
|
auth.admin.<idp>.issuer |
Substitute <idp> for the IdP name. The expected issuer of the authentication JWT token.Example: https://accounts.google.com/
|
auth.admin.<idp>.audience |
Substitute <idp> for the IdP name. The expected JWT token aud claim. If you use Google as your IdP, this should be your oAuth Client ID. Accepts a comma-separated list of client IDs for Google mobile/desktop apps.Example: audience
|
auth.admin.<idp>.jwks optional |
Substitute <idp> for the IdP name. The JWKS (JSON Web Key Set) containing the public keys to validate the authentication JWTs against. When not provided, WKM will attempt to poll [issuer]/.well-known/openid-configuration to retrieve the JWKS URL during the startup process.Example: https://www.googleapis.com/oauth2/v3/certs
|
If you choose to connect to your IdP using a hosted /.well-known/cse-configuration
file, you need to add the following
CORS headers:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET
To verify that you’ve added CORS headers properly, you can use the curl utility as follows:
curl -Is https://cse.subdomain.domain.tld/.well-known/cse-configuration
Make sure to adjust the path to match your own.
Configuration: Authenticator for Google Desktop and Mobile apps
With the IdP connection, you can also enable client-side encryption for Google Drive Desktop and selected mobile applications such as Google Drive, Google Calendar, Gmail, and Google Meet. These applications can be downloaded from the Google Play Store and Apple App Store.
Redirect/callback URLs for Desktop and Mobile apps:
Application | Redirect/Callback URL |
---|---|
Drive for Desktop |
localhost (the IdP needs to support allowing the listing of ephemeral ports for Drive for desktop to work) |
Drive for Android and iOS | https://client-side-encryption.google.com/oidc/drive/native/callback |
Calendar for Android and iOS | https://client-side-encryption.google.com/oidc/calendar/native/callback |
Gmail for Android and iOS |
https://client-side-encryption.google.com/oidc/gmail/meet/native/callback ,https://client-side-encryption.google.com/oidc/gmail/native/callback
|
Meet for Android and iOS | https://client-side-encryption.google.com/oidc/meet/native/callback |
Please make sure to set the Authentication Method of the authentication app to (None) PKCE.
If you’re using a third-party IdP, your .well-known
file should look like this:
{
"name": "name of your IdP",
"client_id": "ID from IdP",
"discovery_uri": "https://your_idp.com/.well-known/openid-configuration",
"applications": {
"drivefs": {
"client_id": "ID from IdP"
},
"drive-android": {
"client_id": "ID from IdP"
},
"drive-ios": {
"client_id": "ID from IdP"
},
"calendar-android": {
"client_id": "ID from IdP"
},
"calendar-ios": {
"client_id": "ID from IdP"
},
"gmail-android": {
"client_id": "ID from IdP"
},
"gmail-ios": {
"client_id": "ID from IdP"
},
"meet-android": {
"client_id": "ID from IdP"
},
"meet-ios": {
"client_id": "ID from IdP"
}
}
}
Otherwise, you can set it in the IdP fallback settings on Google Admin. To access it, go to Security ⮕ Client-Side Encryption ⮕ IdP fallback settings. Scroll down to the Authentication for Google desktop and mobile apps section, tick the checkboxes for each Google app, and set the client ID that you created for each Google app.
For detailed instructions, please check the corresponding guide by Google.
Configuration: Google Workspace
The GSuite authorization component configures the Google OpenId Connect service which verifies Google-issued JWTs, making sure the user requesting access to a particular object is allowed to access it.
Property | Description |
---|---|
google.workspace.privileged.users |
The list of legal admins (different from technical admins) who may perform privileged operations on data that belongs to other users. Example: admin@org.com,admin2@org.com
|
google.workspace.products |
A comma-separated list of Google Workspace products to integrate with WKM. Example: drive,meet,calendar,gmail,migration
|
google.workspace.<product>.product.family optional |
The Google CSE product family. Options are default and gmail . The default value is set to default .Example: default
|
google.workspace.<product>.issuer |
Substitute <product> for the Workspace product above. The expected issuer of the authorization JWT token. This is the only accepted value.Example: See the default properties file |
google.workspace.<product>.audience |
Substitute <product> for the Workspace product above. This is the only accepted value.Example: cse-authorization
|
google.workspace.<product>.jwks |
Substitute <product> for the Workspace product above. The JWKS (JSON Web Key Set) containing the public keys to validate the authorization JWTs against. This is the only accepted value.Example: See the default properties file |
google.workspace.<product>.enduser.idps optional |
A comma-separated list of IdP which must match values as defined in auth.enduser.idps . This is a whitelist of acceptable IdPs. If not defined, then all end-user IdPs are allowed.Example: okta,auth0
|
Configuration: Gmail CSE
To use Google Workspace Client-side encryption (CSE) for Gmail, you need to upload an S/MIME certificate and private key metadata for each user using the Gmail API. You can find a full guide for configuring the Gmail CSE on the Google Workspace Admin Help portal.
.p12
or .pfx
extension.
To simplify this process, we created a script that extracts a private key from an S/MIME certificate, wraps it, and uploads
it along with the certificate to Gmail. You can use it by running the --upload-mail-certificate
command:
$ java -jar flowcrypt-workspace-key-manager.jar --upload-mail-certificate --pfx-path PFX_CERTIFICATE_PATH --pfx-password PFX_CERTIFICATE_PASSWORD --config=CONFIG_FILE_PATH
For Gmail API authorization, we need a Google service account key. You can get it by creating a service account and adding a service account key to it. After you’ve downloaded the JSON file with a service account key, please update your configuration file with these properties:
Property | Description |
---|---|
google.service.account.client.id |
client_id : The property from a service account key JSON |
google.service.account.client.email |
client_email : The property from a service account key JSON |
google.service.account.private.key.pkcs8 |
private_key : The property from a service account key JSON |
google.service.account.private.key.id |
private_key_id : The property from a service account key JSON |
Configuration: Migration
The GSuite KACLS interaction component configures which other KACLS servers can be accessed and accessed by.
Property | Description |
---|---|
kacls.incoming.url.whitelist optional |
A comma-separated list of KACLS server URLs that can access this server. Currently, this is for verifying incoming Privileged Unwrap requests against the server’s JWKS certificates. The default value is set to empty (no incoming KACLS server requests allowed). Example: https://incoming.kacls.test
|
kacls.outgoing.url.whitelist optional |
A comma-separated list of KACLS server URLs that this server can access. Currently, this is for outgoing Privileged Unwrap requests. The default value is set to empty (no outgoing KACLS server requests allowed). Example: https://outgoing.kacls.test
|
kacls.migration.key optional |
A base 64 encoded key to keep certs and privileged unwrap calls consistent over multiple servers and between restarts. If not defined, then a random key will be created when the server starts. Example: from --create-migration-key
|
Configuration: ACL
The ACL component allows third-party implementations to further protect resources.
Property | Description |
---|---|
acl.type |
Currently, the NoThirdPartyAcl is the only ACL option.Example: NoThirdPartyAcl
|
Troubleshooting
Because the Google CSE combines its own systems with your existing IdP and our WKM, which in turn may rely on your KMIP or PKCS11 store, each with various configuration options, you may run into issues the first time you attempt to configure all these together.
To troubleshoot the WKM startup, it’s recommended to first read the Troubleshooting guide.
Troubleshooting Google Alpha CSE
In this early stage of Google CSE, you may encounter unintuitive errors with no clear resolution guidance, such as the ones described below:
-
Error 404 (Not Found) on the callback URL. If during testing you’re facing an
Error 404
when your IdP redirects to this URL after the login (for example, when you’re uploading a new file), this can have one of the following causes:- (during Google Alpha) Google needs to whitelist your user or issuer.
- (during Google Alpha) You signed in to multiple Google accounts, and the test user isn’t the default user on your browser. Try to log out of all accounts and sign in only to the target test account. Alternatively, use Incognito mode in Chrome and log in with only the target test account.
-
An error occurred with the identity provider service. This can manifest as an error saying “An error occurred with the identity provider service”, or “Can’t decrypt the file (Something went wrong and your file wasn’t downloaded)”, or “An error occurred with identity provider service”. There are two possible causes:
- (during Google Alpha) Your browser hasn’t authenticated with your IdP within
drive.google.com
yet. To authenticate during Alpha, upload a drive file first instead, go through an Upload failure, and force re-authentication as described below. Then you can go back to your original task (opening file, updating doc, etc.). - Your IdP is misconfigured, such as the user you’re logged in with wasn’t assigned to the IdP app, or the wrong Client ID
in the
cse-configuration
, etc. To debug, you can observe the browser network tab, or ask Google.
- (during Google Alpha) Your browser hasn’t authenticated with your IdP within
-
Upload failure. You can see an Upload failure on
drive.google.com
when you’re uploading an encrypted file and haven’t been authenticated on this browser yet. To resolve, click the ! exclamation mark in a red circle shown with this error. This will force to start a re-authentication process. Re-authenticating through the upload flow of the encrypted file will fix other authentication issues around the Drive/Docs apps that don’t have their own robust authentication error handling mechanism yet.
Sample config file
# docs:
# https://flowcrypt.com/docs/technical/workspace-key-manager/latest/technical-overview.html
### General ###
org.id=evaluation.org
api.hostname=0.0.0.0
api.port=32567
api.accept.hosts=localhost:32567
api.https.enabled=true
api.https.key.file=wkm-https-cert.p12
api.https.key.password=password
api.cors.origins=https://admin.google.com,https://krahsc.google.com,https://client-side-encryption.google.com
api.url=https://wkm.evaluation.org
api.url.add.to.accept.hosts=true
#api.error.format=detailed|short|id_only
api.error.format=id_only
api.openapi.enabled=false
# The truststore is optional. If you want to override the default JRE truststore,
# use this to verify the KMIP server with a custom certificate.
#truststore.file=wkm-dev-rootca.p12
#truststore.password=password
#truststore.include.default=true
### Store ###
# The options for the "key.source" field are: properties | stdin | kmip | pkcs11
# The only option for "test.vector.source" is: properties
# The required key format is 32 bytes (256 bits) of random data encoded as base64
# Generate master secrets, and test vector by running: --create-master-key (uses Java SecureRandom, or KMS over KMIP)
store.type=MasterKeyStore
store.master.derivation.scheme=sha256-aes-ecb
store.master.key.source=properties
# Enter the "--create-master-key" output (master key) here to set the master key in the properties file.
store.master.key.value=
store.test.vector.source=properties
# Enter the "--create-master-key" output (test vector) here either way. This is used to cross-check the entered key.
store.test.vector.value=
# The master key stored in secure key storage over KMIP protocol (e.g. Gemalto Safenet KeySecure).
# Remember to also set the `truststore.file` above if the KMIP server uses certificates with custom CA.
#store.kmip.hostname=localhost
#store.kmip.port=5696
#store.kmip.key.file=localhost.p12
#store.kmip.key.password=password
#store.kmip.master.key.name=flowcrypt-workspace-km-master-key
#store.kmip.master.key.identifier=
# The master key stored over PKCS#11 protocol such as Fortanix SDKMS, Equinix SmartKey, or any compatible HSM.
#store.pkcs11.module=./vendor-pkcs11.so
#store.pkcs11.pin=file://vendor-pkcs11.cfg
### Logger ###
# A comma-separated list. Can have any combination of StdoutLogger, FileLogger, StackdriverLogger, SplunkHttpLogger
logger.types=StdoutLogger
# trace, debug, info, warn, error
logger.default.level=info
#logger.stdout.include.datetime=true
#logger.file.folder=/var/logs
#logger.file.history.size=14
#logger.file.history.compression=false
#logger.file.include.datetime=true
#logger.stackdriver.credentials.file=/etc/google/auth/application_default_credentials.json
#logger.splunk.url=https://splunk-instance:8088
#logger.splunk.token=327bfa46-...
#logger.splunk.disable.certificate.validation=true
### Authentication ###
# Use the defaults provided below, if you intend to use Google as your IdP. In that case, set up an
# oAuth Screen on Google Developer Console, and provide an oAuth Client ID in the audience field.
# Otherwise, change the issuer and the JWKS to your custom company IdP.
auth.enduser.idps=default
auth.enduser.default.issuer=https://accounts.google.com
auth.enduser.default.audience=SET_YOUR_GOOGLE_OAUTH_CLIENT_ID_HERE
auth.enduser.default.jwks=https://www.googleapis.com/oauth2/v3/certs
auth.admin.idps=default
auth.admin.default.issuer=https://accounts.google.com
auth.admin.default.audience=SET_YOUR_GOOGLE_OAUTH_CLIENT_ID_HERE
auth.admin.default.jwks=https://www.googleapis.com/oauth2/v3/certs
### Authorization ###
### privileged users for requests requiring authentication without Google authorization ###
google.workspace.privileged.users=
### Google Workspace Products ###
google.workspace.products=drive,meet,calendar,gmail,migration
### Google Workspace Authorization (Docs & Drive) ###
google.workspace.drive.product.family=default
google.workspace.drive.issuer=gsuitecse-tokenissuer-drive@system.gserviceaccount.com
google.workspace.drive.audience=cse-authorization
google.workspace.drive.jwks=https://www.googleapis.com/service_accounts/v1/jwk/gsuitecse-tokenissuer-drive@system.gserviceaccount.com
### Google Workspace Authorization (Meet) ###
google.workspace.meet.product.family=default
google.workspace.meet.issuer=gsuitecse-tokenissuer-meet@system.gserviceaccount.com
google.workspace.meet.audience=cse-authorization
google.workspace.meet.jwks=https://www.googleapis.com/service_accounts/v1/jwk/gsuitecse-tokenissuer-meet@system.gserviceaccount.com
### Google Workspace Authorization (Calendar) ###
google.workspace.calendar.product.family=default
google.workspace.calendar.issuer=gsuitecse-tokenissuer-calendar@system.gserviceaccount.com
google.workspace.calendar.audience=cse-authorization
google.workspace.calendar.jwks=https://www.googleapis.com/service_accounts/v1/jwk/gsuitecse-tokenissuer-calendar@system.gserviceaccount.com
### Google Workspace Authorization (Gmail) ###
google.workspace.gmail.product.family=gmail
google.workspace.gmail.issuer=gsuitecse-tokenissuer-gmail@system.gserviceaccount.com
google.workspace.gmail.audience=cse-authorization
google.workspace.gmail.jwks=https://www.googleapis.com/service_accounts/v1/jwk/gsuitecse-tokenissuer-gmail@system.gserviceaccount.com
### Google Workspace Authorization (migration) ###
google.workspace.migration.product.family=default
google.workspace.migration.issuer=apps-security-cse-kaclscommunication@system.gserviceaccount.com
google.workspace.migration.audience=cse-authorization
google.workspace.migration.jwks=https://www.googleapis.com/service_accounts/v1/jwk/apps-security-cse-kaclscommunication@system.gserviceaccount.com
### Google Service Account ###
google.service.account.client.id=
google.service.account.client.email=
google.service.account.private.key.pkcs8=
google.service.account.private.key.id=
### ACL ###
acl.type=NoThirdPartyAcl
### Migration ###
# Only KACLS URLs defined in these properties will be allowed incoming and outgoing access.
# It is recommended to leave these undefined until there is a need to migrate from one instance to another.
#kacls.incoming.url.whitelist=https://incoming.kacls.test
#kacls.outgoing.url.whitelist=https://outgoing.kacls.test
# Allows /certs and privileged unwrap KACLS calls to remain consistent over multiple servers & between restarts.
# Create using the --create-migration-key console command.
#kacls.migration.key=