OpenVPN Access Server Web API v0.1
This API is everything a web API needs to implement the functionality of downloading profiles/clients etc and implement the admin interface.
In this document we use the following convention for naming:
field names - snake case
URLs - dashes
everything else - camel case
The API allows proxying requests to different servers of an Access Server cluster. This is only needed for the ADMIN interface.
Please that this API is still in development and stability is not guaranteed. API endpoints and parameters can change without notice.
Also note that while great care has been taken that this API documentation matches the implementation, some differences to the implemented API can exist as well.
Viewing this API documentation in swagger via https://access-server.examples.com/api/docs can be enabled by using setting the configuration variable openapi.web_access
to 1 e.g. by using
or setting the variable via the admin UI configuration editor.
For more information about the API of OpenVPN Access Server see also https://openvpn.net/static-links/documentation-access-server-web-api
Base URLs:
/api
https://access-server.example.com/api/
sacli --key "openapi.web_access" --value 1 ConfigPut
Authentication
API Key (AuthToken)
Parameter Name: X-OpenVPN-As-AuthToken, in: header. This is an opaque token that allows using the authenticated method. The token will expire after a certain amount of time unless it is renewed through the renewal API. While we might use a JWT for this, the API consumer should not assume anything about the format or content of this string. JWT with default encryption/authentication appears not to be FIPS compatible.
API Key (ProfileDownloadToken)
Parameter Name: token, in: query. This is a string-token that can be used to download OpenVPN Connection Profile or installer file. Typically, e.g. for installer download and OpenVPN connection profile download, this token is generated as a token, that can be used only once.
HTTP Authentication, scheme: basic a basic auth with user and password. This methods uses a fairly non-standard challenge/resposne method if required that is documented under https://github.com/OpenVPN/openvpn3/blob/master/doc/webauth.md#challengeresponse-authentication
Default
servers__saml_acs
Responses
Status | Meaning | Description | Schema |
---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
servers__saml_metadata
Responses
Status | Meaning | Description | Schema |
---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
servers__saml_redirect
Responses
Status | Meaning | Description | Schema |
---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
servers__openvpn-api_profile
Responses
Status | Meaning | Description | Schema |
---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
servers__GetInstallerViaToken
Responses
Status | Meaning | Description | Schema |
---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
servers__GetProfileViaToken
Responses
Status | Meaning | Description | Schema |
---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
servers__GetAutologin
Responses
Status | Meaning | Description | Schema |
---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
servers__GetUserlogin
Responses
Status | Meaning | Description | Schema |
---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
servers__GetGeneric
Responses
Status | Meaning | Description | Schema |
---|
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
notificationCreate
Body parameter
{ "notification_type": "CLUSTER_RESTART_PENDING" }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none | |
» notification_type | body | string | true | the type of notification |
Enumerated Values
Parameter | Value |
---|---|
» notification_type | CLUSTER_RESTART_PENDING |
» notification_type | NODE_RESTARTED |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Successful operation | None | |
400 | notification creation failed | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const headers = { 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/saml/acs', { method: 'SERVERS', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
const headers = { 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/saml/metadata', { method: 'SERVERS', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
const headers = { 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/saml/redirect', { method: 'SERVERS', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
const headers = { 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/openvpn-api/profile', { method: 'SERVERS', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
const headers = { 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/GetInstallerViaToken', { method: 'SERVERS', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
const headers = { 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/GetProfileViaToken', { method: 'SERVERS', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
const headers = { 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/GetAutologin', { method: 'SERVERS', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
const headers = { 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/GetUserlogin', { method: 'SERVERS', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
const headers = { 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/GetGeneric', { method: 'SERVERS', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
const inputBody = '{ "notification_type": "CLUSTER_RESTART_PENDING" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/notification/create', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
auth
APIs directly related to authenticating to the API
authByUserAndPw
Body parameter
{ "username": "string", "password": "string", "totp": "string" }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none | |
» username | body | string | true | The user name for login. Note that if this is case-sensitive or not depends on the OpenVPN Access Server configuration. |
» password | body | string | true | The password for login in clear text |
» totp | body | string | false | Optional TOTP token for the user when wishing to do all MFA credentials in one go |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | successful auth | ||
401 | missing MFA or ask to login via SAML workflow | Inline | |
403 | wrong user and/or password or user access denied | ||
409 | MFA enrollment is required. The intermediate auth token will be returned. This auth token should be used for enrolllment. |
Response Schema
Status Code 401
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» MFAChallenge | false | none | none | |
»» echo | boolean | true | none | If true, the entered code should be displayed in cleartext. Otherwise masked like a password. |
»» challenge | string | true | none | The text presented to the user when asking for the challenge. |
»» challenge_context | string | true | none | Often authentication backends require the challenge to be answered in the same session as the initial user/password. This allows tying the MFA answer to the initial authentication attempt. |
This operation does not require authentication
authMFASession
Body parameter
{ "response": "pa$$word", "challenge_context": "FJAIIXMAIOFLGAK23", "username": "string" }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | true | none | |
» response | body | string(password) | false | the user’s response to the MFA challenge |
» challenge_context | body | string | false | The challenge context that was in the MFAChallenge. |
» username | body | string | true | The user name for login |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | successful auth | ||
403 | wrong authentication info |
This operation does not require authentication
authBySAMLAssertion
Body parameter
{ "assertion": "string", "relay_state": "vpnauth~nod1~Dfk3287761d" }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | true | none | |
» assertion | body | string(xml) | true | SAML Assertion in xml format , encoded as base64-string |
» relay_state | body | string | false | Optional relay state identifying the type of SAML request. If not passed or empty, defaults to cws |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | successful auth | ||
400 | Wrong RelayState parameter or Invalid SAML assertion | ||
401 | Invalid authentication assertion request. Returned when status of authentication was not handled or unknown. | ||
403 | User access denied or Account configuration problem or no valid SAML configuration or This profile requires web based SAML Authentication. |
This operation does not require authentication
authRenewToken
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | successful auth | ||
401 | the old token has expired and can no longer be renewed | ||
403 | Token renewal is no longer allowed. | None |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
changePasswordLocalUser
Body parameter
{ "username": "string", "new_password": "pa$$word" }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Password has changed successfully | Inline | |
401 | Login failed | Inline | |
403 | Forbidden. Auth token was not recent enough or security criteria of new password not met. |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» detail | string | false | none | none |
Status Code 401
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» detail | string | false | none | none |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
enrollUserMFA
Body parameter
{ "token": "string", "username": "niccolo@paganini.it" }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Successfully enrolled. | Inline | |
400 | Provided MFA token does not match secret or other error | ||
403 | only admin users are allowed to use this API |
Response Schema
Enumerated Values
Property | Value |
---|---|
user_type | admin |
user_type | user |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{ "username": "string", "password": "string", "totp": "string" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json' }; fetch('/api/auth/login/userpassword', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "user_properties": { "requires_mfa_enrollment": true, "user_type": "admin", "mfa_secret": "string", "allowed_profiles": [ "autologin" ], "enforce_strong_passwords": true, "allow_password_change": true }, "username": "string", "auth_token": "string", "expires_after": "string", "renewable_until": "string" }
const inputBody = '{ "response": "pa$$word", "challenge_context": "FJAIIXMAIOFLGAK23", "username": "string" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json' }; fetch('/api/auth/login/mfaauth', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "user_properties": { "requires_mfa_enrollment": true, "user_type": "admin", "mfa_secret": "string", "allowed_profiles": [ "autologin" ], "enforce_strong_passwords": true, "allow_password_change": true }, "username": "string", "auth_token": "string", "expires_after": "string", "renewable_until": "string" }
const inputBody = '{ "assertion": "string", "relay_state": "vpnauth~nod1~Dfk3287761d" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json' }; fetch('/api/auth/login/saml-assertion', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "user_properties": { "requires_mfa_enrollment": true, "user_type": "admin", "mfa_secret": "string", "allowed_profiles": [ "autologin" ], "enforce_strong_passwords": true, "allow_password_change": true }, "username": "string", "auth_token": "string", "expires_after": "string", "renewable_until": "string" }
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/auth/token/renew', { method: 'POST', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "auth_token": "string", "expires_after": "string", "renewable_until": "string" }
const inputBody = '{ "username": "string", "new_password": "pa$$word" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/auth/password/change', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "detail": "string" }
const inputBody = '{ "token": "string", "username": "niccolo@paganini.it" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/auth/mfa/enroll', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "user_properties": { "requires_mfa_enrollment": true, "user_type": "admin", "mfa_secret": "string", "allowed_profiles": [ "autologin" ], "enforce_strong_passwords": true, "allow_password_change": true }, "username": "string", "auth_token": "string", "expires_after": "string", "renewable_until": "string" }
client-import-api
The endpoints which are used on OpenVPN Access Server to import profiles into OpenVPN clients
get__GetInstallerViaToken
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Responds with installer file | string | |
400 | An XMLRPC style errors response. Some of the older API under /rest are using error responses in the form of XMLRPC error. For compatibility reasons, these endpoints continue to use this way of reporting errors | Inline | |
404 | “An error occurred while trying to download OpenVPN Connect from the server. The required client installer file was not found on the server” or another constant error in the case of unhandled error “Failed to download installer” | None |
get__GetProfileViaToken
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Responds with connection profile file | string | |
400 | An XMLRPC style errors response. Some of the older API under /rest are using error responses in the form of XMLRPC error. For compatibility reasons, these endpoints continue to use this way of reporting errors | Inline |
get__GetAutologin
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Responds with connection profile file | string | |
400 | An XMLRPC style errors response. Some of the older API under /rest are using error responses in the form of XMLRPC error. For compatibility reasons, these endpoints continue to use this way of reporting errors | Inline |
get__GetUserlogin
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Responds with connection profile file | string | |
400 | An XMLRPC style errors response. Some of the older API under /rest are using error responses in the form of XMLRPC error. For compatibility reasons, these endpoints continue to use this way of reporting errors | Inline |
get__GetGeneric
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Responds with connection profile file | string | |
400 | An XMLRPC style errors response. Some of the older API under /rest are using error responses in the form of XMLRPC error. For compatibility reasons, these endpoints continue to use this way of reporting errors | Inline |
const headers = { 'Accept':'application/octet-stream' }; fetch('/api/GetInstallerViaToken?token=string&installer_type=win_v3', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
const headers = { 'Accept':'application/x-openvpn-profile' }; fetch('/api/GetProfileViaToken?token=string', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
<?xml version="1.0" encoding="UTF-8" ?> <Error> <Type>Invalid Request</Type> <Synopsis>REST method failed</Synopsis> <Message>No permission to generate profile (9422)</Message> </Error>
const headers = { 'Accept':'application/x-openvpn-profile' }; fetch('/api/GetAutologin', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
<?xml version="1.0" encoding="UTF-8" ?> <Error> <Type>Invalid Request</Type> <Synopsis>REST method failed</Synopsis> <Message>No permission to generate profile (9422)</Message> </Error>
const headers = { 'Accept':'application/x-openvpn-profile' }; fetch('/api/GetUserlogin', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
<?xml version="1.0" encoding="UTF-8" ?> <Error> <Type>Invalid Request</Type> <Synopsis>REST method failed</Synopsis> <Message>No permission to generate profile (9422)</Message> </Error>
const headers = { 'Accept':'application/x-openvpn-profile' }; fetch('/api/GetGeneric', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
<?xml version="1.0" encoding="UTF-8" ?> <Error> <Type>Invalid Request</Type> <Synopsis>REST method failed</Synopsis> <Message>No permission to generate profile (9422)</Message> </Error>
profiletoken
APIs that manage the profile token that can be used to generate one time import URLs and are also used as part of the web-based profile import flow
bulktokenurldelete
Body parameter
[ "string" ]
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | array[string] | false | none |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | token were successfully deleted | None | |
403 | only admin users are allowed to use this API | ||
404 | token to be deleted was not found |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '[ "string" ]'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/token-url/delete', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
profile
APIs that are related to the management of client profiles
head__openvpn-api_profile
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
302 | Redirect to http://server_addres/ page with saml headers in response according to OpenVPN Api spec. | None |
Response Headers
Status | Header | Type | Format | Description |
---|---|---|---|---|
302 | Ovpn-WebAuth | string | Token identifying if Web Auth is used, based on which connect app decides, if to open browser-based import flow |
This operation does not require authentication
get__openvpn-api_profile
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
302 | Redirect to http://server_addres/login?relay_state=profile | None |
This operation does not require authentication
getprofilesuser
Body parameter
{ "page_size": 0, "offset": 0, "sort_by": "asc", "order_by": "serial", "filters": { "user": { "operation": "substring", "value": "vio" }, "serial_number": { "value": 400, "operation": "less_than" }, "tls_crypt_v2": { "value": true }, "last_used": { "start": "2019-08-24", "end": "2019-08-24" }, "not_before": { "start": "2019-08-24", "end": "2019-08-24" }, "not_after": { "start": "2019-08-24", "end": "2019-08-24" }, "comment": { "operation": "substring", "value": "vio" }, "signing_ca_cn": { "operation": "substring", "value": "vio" }, "anywhere": { "value": "bass", "fields": [] } } }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Success | Inline |
Response Schema
Status Code 200
A list of all or subset of profiles
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» total | integer | false | none | total number of profiles that match if pagination is not in effect, this matches the size of the provided array |
» profiles | [allOf] | false | none | none |
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | false | none | none | |
»»» serial | certificateSerial(int64) | true | none | A serial number representing a certificate or profile. Note, this API uses strings for the certificate serial numbers instead of integers as JavaScript is unable to (easily) handle anything larger than 52 bit integers due to its nature to represent all numbers as double. |
»»» common_name | true | none | The common name of the certificate. | |
»»» algorithm | true | none | This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072). | |
»»» not_before | string(date-time) | true | none | Earliest time the certificate is valid |
»»» not_after | string(date-time) | true | none | Latest time the certificate is valid |
»»» self_signed | boolean | false | none | Whether this certificate is self-signed. Typically only root CA certificates are self-signed. |
»»» signing_ca | string(int64) | false | none | The certificate authority that has signed this certificate. For self-signed certificate authorities this value is absent. This attribute is only present for certificates that are managed by the internal PKI of Access Server and the APIs that deal and return information about these. This is also represented as a string rather than integer to avoid problems with JavaScript numbers always being double. |
»»» signing_ca_cn | string | false | none | The common name of certificate authority that has signed this certificate. For self-signed certificate authorities this value is absent. This attribute is only present for certificates that are managed by the internal PKI of Access Server and the APIs that deal and return information about these. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | object | false | none | A profile for a user. |
»»» device_id | string,null | false | none | Device ID, only used for server-locked v1 profiles |
»»» comment | string,null | false | none | A user-defined comment |
»»» profile_type | false | none | none | |
»»» tls_crypt_v2 | boolean | false | none | This profile uses tls-crypt-v2 |
»»» last_used | string,null(date) | false | none | Last date this profile was used (only date is known, there is no more granular resolution) |
»»» username | string | false | none | User’s name |
Enumerated Values
Property | Value |
---|---|
profile_type | autologin |
profile_type | userlogin |
profile_type | generic |
profile_type | epki-generic |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
generateUserProfile
Body parameter
{ "user": "niccolo@paganini.it", "profile_type": "autologin", "tls_crypt_v2": true, "comment": "connected from my iPhone", "ignore_missing_user": null }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none | |
» user | body | false | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
» profile_type | body | true | none | |
» tls_crypt_v2 | body | boolean | false | The client is capable of TLS-Crypt v2 |
» comment | body | string | false | A user-defined comment |
» ignore_missing_user | body | any | false | if this is flag, which requires admin rights, is set, a profile will be created even if the specified user does not exist. |
Enumerated Values
Parameter | Value |
---|---|
» profile_type | autologin |
» profile_type | userlogin |
» profile_type | generic |
» profile_type | epki-generic |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Profile was successfully generated | string | |
403 | profile creation was not permitted |
Response Headers
Status | Header | Type | Format | Description |
---|---|---|---|---|
201 | Content-Disposition | string | none | |
201 | VPN-Session-User | string | none | |
201 | VPN-Session-Token | string | none |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
generateTokenUrl
Body parameter
{ "lifetime": 0, "usages": 0, "profile_type": "autologin", "username": "niccolo@paganini.it" }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none | |
» lifetime | body | integer | false | Optional lifetime in seconds that the token should be valid for. Longer lifetimes than default require admin privileges. |
» usages | body | integer | false | Optional number of usages that this token can be used to generate a profile. Defaults to a single use if not provided. Specifying more than more usage requires admin privileges. |
» profile_type | body | true | none | |
» username | body | false | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API |
Enumerated Values
Parameter | Value |
---|---|
» profile_type | autologin |
» profile_type | userlogin |
» profile_type | generic |
» profile_type | epki-generic |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Token URL has been successfully generated | string | |
400 | Token url was not generated | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
enumerateTokenIds
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | list of all still valid profile token urls | Inline | |
403 | only admin users are allowed to use this API |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» profileTokens | false | none | [this represent a (typically one-time) token that can be used to retrieve a profile from Access Server] | |
»» token | string | false | none | the unique string that identifies the token |
»» username | string | false | none | the username this token will generate the profile for |
»» expires | string(date-time) | false | none | the token is only valid until this time |
»» profile_type | false | none | none | |
»» usages | integer | false | none | how often this token can be used to retrieve a profile |
Enumerated Values
Property | Value |
---|---|
profile_type | autologin |
profile_type | userlogin |
profile_type | generic |
profile_type | epki-generic |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
deleteProfileSerial
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
serial | path | true | none |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | profile successfully deleted | Inline | |
400 | could not delete the profile |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» message | string | false | none | describes status of deletion |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
deleteProfileUser
Body parameter
{ "users": [ "niccolo@paganini.it" ], "filter": "string" }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
» users | body | [username] | false | users name list to delete connection profiles from. |
» filter | body | string | false | will delete all profiles that have the argument as a substring |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | profile successfully deleted | Inline | |
400 | User profiles were not deleted | ||
404 | User profiles were not found |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» message | string | false | none | describes status of deletion |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
deleteProfile
Body parameter
[ "1708464983752887'" ]
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Successfully executed. Status for each profile is in the response. | Inline | |
400 | could not delete the profile |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» message | any | false | none | describes status of deletion |
» response | object | true | none | hash map that maps the requested delete request to a result |
»» additionalProperties | false | none | none |
Enumerated Values
Property | Value |
---|---|
additionalProperties | {“204”:null,“description”:“profile successfully deleted”} |
additionalProperties | {“404”:null,“description”:“profile to be deleted was not found”} |
additionalProperties | {“403”:null,“description”:“profile to be deleted is not owned by the user or another error”} |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
fetch('/api/openvpn-api/profile', { method: 'HEAD' }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
fetch('/api/openvpn-api/profile', { method: 'GET' }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
const inputBody = '{ "page_size": 0, "offset": 0, "sort_by": "asc", "order_by": "serial", "filters": { "user": { "operation": "substring", "value": "vio" }, "serial_number": { "value": 400, "operation": "less_than" }, "tls_crypt_v2": { "value": true }, "last_used": { "start": "2019-08-24", "end": "2019-08-24" }, "not_before": { "start": "2019-08-24", "end": "2019-08-24" }, "not_after": { "start": "2019-08-24", "end": "2019-08-24" }, "comment": { "operation": "substring", "value": "vio" }, "signing_ca_cn": { "operation": "substring", "value": "vio" }, "anywhere": { "value": "bass", "fields": [] } } }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/profiles/list', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "total": 0, "profiles": [ { "serial": "1708464983752887'", "common_name": "OpenVPN VPN server CA", "algorithm": "rsa2048", "not_before": "2020-03-27", "not_after": "2030-03-26", "self_signed": true, "signing_ca": "123", "signing_ca_cn": "RootCA", "device_id": "string", "comment": "My toaster running Doom", "profile_type": "autologin", "tls_crypt_v2": true, "last_used": "2019-08-24", "username": "string" } ] }
const inputBody = '{ "user": "niccolo@paganini.it", "profile_type": "autologin", "tls_crypt_v2": true, "comment": "connected from my iPhone", "ignore_missing_user": null }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/x-openvpn-profile', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/profiles/create', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
const inputBody = '{ "lifetime": 0, "usages": 0, "profile_type": "autologin", "username": "niccolo@paganini.it" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/token-url', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/token-url/list', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "profileTokens": [ { "token": "a4aL62OFooAjPu4wu6MQCvcmY070hu8B", "username": "arne@openvpn.net", "expires": "2019-08-24T14:15:22Z", "profile_type": "autologin", "usages": 1 } ] }
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/profiles/delete/{serial}', { method: 'POST', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "string" }
const inputBody = '{ "users": [ "niccolo@paganini.it" ], "filter": "string" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/profiles/delete-user', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "string" }
const inputBody = '[ "1708464983752887'" ]'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/profiles/delete', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": null, "response": { "21": 204, "7127317": 404 } }
vpnca
endpoints that manage the CA(s) that is used to sign the VPN server certificate and the client certificates
getVPNCas
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Success | Inline | |
403 | only admin users are allowed to use this API |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | [allOf] | false | none | none |
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | false | none | none | |
»» serial | certificateSerial(int64) | true | none | A serial number representing a certificate or profile. Note, this API uses strings for the certificate serial numbers instead of integers as JavaScript is unable to (easily) handle anything larger than 52 bit integers due to its nature to represent all numbers as double. |
»» common_name | true | none | The common name of the certificate. | |
»» algorithm | true | none | This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072). | |
»» not_before | string(date-time) | true | none | Earliest time the certificate is valid |
»» not_after | string(date-time) | true | none | Latest time the certificate is valid |
»» self_signed | boolean | false | none | Whether this certificate is self-signed. Typically only root CA certificates are self-signed. |
»» signing_ca | string(int64) | false | none | The certificate authority that has signed this certificate. For self-signed certificate authorities this value is absent. This attribute is only present for certificates that are managed by the internal PKI of Access Server and the APIs that deal and return information about these. This is also represented as a string rather than integer to avoid problems with JavaScript numbers always being double. |
»» signing_ca_cn | string | false | none | The common name of certificate authority that has signed this certificate. For self-signed certificate authorities this value is absent. This attribute is only present for certificates that are managed by the internal PKI of Access Server and the APIs that deal and return information about these. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | object | false | none | none |
»» cert_type | true | none | The type of certificate. | |
»» client_profiles | integer | true | none | the number of VPN client profiles are issued by this CA. |
Enumerated Values
Property | Value |
---|---|
cert_type | ca |
cert_type | old_ca |
cert_type | cross_ca |
cert_type | client |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
addCaGeneration
Body parameter
{ "algorithm": "secp384r1", "common_name": "my shiny new CA" }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none | |
» algorithm | body | false | This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072). | |
» common_name | body | false | The common name of the certificate. |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | New CA has been successfully created | None | |
400 | the selected algorithm is not allowed or the common is too long or contains invalid characters or already exists | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
delete_ca_vpn{serial}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | CA has been successfully deleted | None | |
400 | the CA has still client certificates or is the only CA | ||
403 | only admin users are allowed to use this API | ||
404 | The CA to be deleted is not found |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
serial | path | true | none | |
delete_clients | query | boolean | false | will force the deletion of the CA (and all client certificates) |
standard response when there insufficient rights to use an API.
CaSupportedAlgorithms
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Success | Inline | |
403 | only admin users are allowed to use this API |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | [This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072).] |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/ca/vpn/list', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
[ { "serial": "1708464983752887'", "common_name": "OpenVPN VPN server CA", "algorithm": "rsa2048", "not_before": "2020-03-27", "not_after": "2030-03-26", "self_signed": true, "signing_ca": "123", "signing_ca_cn": "RootCA", "cert_type": "ca", "client_profiles": 0 } ]
const inputBody = '{ "algorithm": "secp384r1", "common_name": "my shiny new CA" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/ca/vpn/create', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "reason": "config values had errors", "detail": { "host.name": "Contains invalid character %", "server.port": "Must be an integer between 1 and 65335" } }
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/ca/vpn/{serial}', { method: 'DELETE', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
{ "message": "Insufficient privileges to use this API" }
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/ca/allowed-algorithms/list', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
[ "rsa2048", "rsa3072", "rsa4096", "ed448", "brainpoolP384r1", "brainpoolP512r1", "secp2256k1", "Ed25519" ]
info
endpoints that allow to query various aspects of the running server and its status
certificateInfo
Body parameter
{ "certificate": "string" }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
» certificate | body | false | An PEM encoded certificate. This the certificate representation that starts with —–BEGIN CERTIFICATE—– followed by base64 encoding and ends with —–END CERTIFICATE—– |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | information about the X509 certificate | ||
400 | the provided certificate could not be parsed or other problems. | ||
403 | only admin users are allowed to use this API | None |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
checkPrivateKey
Body parameter
{ "certificate": "string", "private_key": "string" }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | any | false | none |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Can parse both private key and certificate. The content will signal if the private key belongs to the certificate. | Inline | |
400 | there was some error parsing the certificate or key | ||
403 | only admin users are allowed to use this API |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» status | boolean | false | none | true if the private key matches the certificate |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
post__certificate_check-against-ca-roots
Body parameter
{ "certificate": "string", "chain": "string", "ca_roots": [ "string" ] }
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | The certificate has been verified against the provided CA certificate as trusted certificate. The response contains the trust chain that was found. | Inline | |
400 | The certificate failed verification. Details are provided in the errorReason. | ||
403 | only admin users are allowed to use this API |
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
» certificate | body | true | An PEM encoded certificate. This the certificate representation that starts with —–BEGIN CERTIFICATE—– followed by base64 encoding and ends with —–END CERTIFICATE—– | |
» chain | body | false | An PEM encoded certificate. This the certificate representation that starts with —–BEGIN CERTIFICATE—– followed by base64 encoding and ends with —–END CERTIFICATE—– | |
» ca_roots | body | false | a list of CA certificates that should be used as trusted certificate authorities. If left empty AS will use the system certificates root CAs. This are very similar but not always identical to a browser trust store. |
standard response when there insufficient rights to use an API.
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» chain | [allOf] | false | none | [Provides more information about a certificate] |
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | false | none | none | |
»»» serial | certificateSerial(int64) | true | none | A serial number representing a certificate or profile. Note, this API uses strings for the certificate serial numbers instead of integers as JavaScript is unable to (easily) handle anything larger than 52 bit integers due to its nature to represent all numbers as double. |
»»» common_name | true | none | The common name of the certificate. | |
»»» algorithm | true | none | This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072). | |
»»» not_before | string(date-time) | true | none | Earliest time the certificate is valid |
»»» not_after | string(date-time) | true | none | Latest time the certificate is valid |
»»» self_signed | boolean | false | none | Whether this certificate is self-signed. Typically only root CA certificates are self-signed. |
»»» signing_ca | string(int64) | false | none | The certificate authority that has signed this certificate. For self-signed certificate authorities this value is absent. This attribute is only present for certificates that are managed by the internal PKI of Access Server and the APIs that deal and return information about these. This is also represented as a string rather than integer to avoid problems with JavaScript numbers always being double. |
»»» signing_ca_cn | string | false | none | The common name of certificate authority that has signed this certificate. For self-signed certificate authorities this value is absent. This attribute is only present for certificates that are managed by the internal PKI of Access Server and the APIs that deal and return information about these. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | object | false | none | none |
»»» sha256fp | certificateFingerprint(sha256) | false | none | The SHA256 hash of the certificate body, also known as the fingerprint of the certificate. |
»»» subj_alt_names | [string] | false | none | provides a list of the subjectAlternative attributes of the certificate |
»»» subject | [string] | false | none | the full subject of the certificate and not only the CN |
»»» ca | boolean | false | none | Whether the certificate represents a certificate authority |
»»» self_signed | boolean | false | none | the signature of the certificate is valid against its own public key |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
get__eula
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Provides the current EULA and the status of the user accepting it. | Inline | |
403 | only admin users are allowed to use this API |
Response Schema
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
serverInterfaces
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
no_loopback | query | boolean | false | optionally for excluding localhost |
Responses
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | [describes a Linux network interface and the associated primary networks] | |
» name | any | false | none | the name identifying the interface |
» networks | [IPsubNet] | false | none | IP addresses assigned to the interface |
»» ipv6 | boolean | false | none | whether this describes an IPv4 or an IPv6 subnet |
»» netip | string | false | none | the network IP address. |
»» prefix_length | integer | false | none | length of the prefix in CIDR notation |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
get__server_info
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Information about the running Access Server instance | ||
403 | only admin users are allowed to use this API | None |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
get__vpn_dco-module
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | DCO Module status | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
post__helper_status-overview
Body parameter
{ "names": [ "vpn.server.cipher" ] }
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Success | Inline | |
400 | Something went wrong | ||
403 | only admin users are allowed to use this API |
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
» names | body | false | list of configuration items that should be retrieve from the active configuration |
standard response when there insufficient rights to use an API.
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» configuration_items | object | false | none | Response from the /config/{activeprofile}/items part of the query |
»» total | integer | false | none | total number of profiles that match if pagination is not in effect, this matches the size of the provided array |
»» items | [allOf] | false | none | [This represents a configuration item in the server configuration profile. To determine if this item has been user-set or not, check the value of derived_from.] |
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»» anonymous | object | false | none | none |
»»»» name | true | none | the configuration value’s key. | |
»»»» derived_from | true | none | the source that the current values has be derived from. | |
»»»» type | string | false | none | Determines the value type of this configuration item. This also implies which of the different value attributes are expected to be present on this configuration item. |
»»»» description | string | false | none | A user readable description of the configuration item that gives a user an understandable. This item can be absent for custom configuration values. |
»»»» category | string | true | none | Different items have different visibility/category that should be taken into account when presenting them to the user. This key informs the UI if a variable is deprecated but still evaluated (deprecated), deprecated and removed (removed), normal, advanced (a value that for normal operation of OpenVPN Access Server should need to be changed as it is typically reserved for some corner-case or speciality configurations) or is a calculated value that is readonly as it is calculated from other configuration items but is not modifiable by the user (derived). Items that have a type of required often do not have a default value but must be set in order for Access to correctly work (e.g. host.name). Removed values should be only shown by the UI if the are set by the user. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»» anonymous | any | false | none | none |
oneOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»»» anonymous | false | none | A configuration value that is expressed as an integer. | |
»»»»» value | integer | false | none | none |
»»»»» default_value | integer | false | none | The default value for the configuration. |
»»»»» max_value | integer | false | none | A hint of maximum allowed value |
»»»»» min_value | integer | false | none | A hint for minimum allowed value |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»»» anonymous | false | none | none | |
»»»»» value | boolean | false | none | none |
»»»»» default_value | boolean | false | none | The default value for the configuration. |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»»» anonymous | false | none | A configuration value that is expressed as a string. Either value or redacted_value is present | |
»»»»» value | string | false | none | the value of this string configuration |
»»»»» redacted_value | string | false | none | the real value of this configuration key is not present because it is a private key or password. The value of this string will give an indication of the redacted value. |
»»»»» default_value | string | false | none | The default value for the configuration. |
»»»»» allowed_values | [string] | false | none | if present this array has a list of the allowed values |
»»»»» type_hint | string | false | none | if present, this type hint denotes this configuration value to contain a special type of value, so the UI can do additional verification to ensure the user input matches this type |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»»» anonymous | false | none | This is a configuration value for which the backed does have no information. This is likely a custom configuration key that a user manually entered or a configuration value that is a result from a downgrade and is only present in newer Access Server versions. | |
»»»»» value | string | false | none | none |
continued
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» server_info | false | none | none | |
»» version | string | false | none | the version number of Access Server |
»» build | string | false | none | the build of Access Server. |
»» web_version | string | false | none | the build version number of Access Server UI |
»» web_override | boolean | false | none | if true the version of the web ui that is used comes from an override-web.zip instead of the bundled version |
»» client_version | string | false | none | version of the embedded client package |
»» os_distribution | string | false | none | a human readable identifier of the current (Linux) distribution like PRETTY_NAME from /etc/os-release |
»» architecture | string | false | none | the CPU architecture |
»» cores | integer | false | none | the number of cores visible to the operating system |
»» os_hostname | string | false | none | Operating system’s hostname |
» dco_module | false | none | none | |
»» available | boolean | true | none | whether AS detected an installed and working data channel offloading kernel module |
»» version | string | true | none | version of the module if available |
» eula_status | false | none | none | |
»» eula_version_as | integer | false | none | The version of the AS EULA |
»» eula_web_hash | string(sha256) | false | none | A SHA256 string in hex format without : separators |
»» eula_accepted | boolean | false | none | indicates whether the config setting (aui.eula_version) has the same value as eula_version_as |
Enumerated Values
Property | Value |
---|---|
derived_from | default |
derived_from | local_db |
derived_from | cluster_db |
derived_from | mysql_standalone_db |
derived_from | as_conf |
derived_from | environment |
derived_from | runtime |
derived_from | other |
type | custom |
type | integer |
type | boolean |
type | string |
category | deprecated |
category | removed |
category | normal |
category | required |
category | derived |
category | advanced |
category | custom |
type_hint | ipv4Address |
type_hint | ipv6Address |
type_hint | ipAddress |
type_hint | hostname |
type_hint | pemCertificate |
type_hint | pemPrivateKey |
architecture | arm64 |
architecture | amd64 |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{ "certificate": "string" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/certificate/info', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "serial": "1708464983752887'", "common_name": "OpenVPN VPN server CA", "algorithm": "rsa2048", "not_before": "2020-03-27", "not_after": "2030-03-26", "self_signed": true, "signing_ca": "123", "signing_ca_cn": "RootCA", "sha256fp": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C", "subj_alt_names": [ "DNS:foo.example.com", "DNS:www.openvpn.net", "IP:1.2.3.4" ], "subject": [ "C=US", "ST=Maryland", "L=Pasadena", "O=DevOrg", "OU=FreeSoft", "OU=non-free soft", "CN=rogue software department" ], "ca": true }
const inputBody = '{ "certificate": "string", "private_key": "string" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/certificate/check-private-key', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "status": true }
const inputBody = '{ "certificate": "string", "chain": "string", "ca_roots": [ "string" ] }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/certificate/check-against-ca-roots', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "chain": [ { "serial": "1708464983752887'", "common_name": "OpenVPN VPN server CA", "algorithm": "rsa2048", "not_before": "2020-03-27", "not_after": "2030-03-26", "self_signed": true, "signing_ca": "123", "signing_ca_cn": "RootCA", "sha256fp": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C", "subj_alt_names": [], "subject": [], "ca": true } ] }
{ "message": "Insufficient privileges to use this API" }
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/eula', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "eula": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ...", "eula_web": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ...", "eula_version_as": 7, "eula_web_hash": "36D7D51F474A84A2A30A41BC92CBA5D9D65F756484011D6F58B9D667F8DBBE9C", "eula_accepted": true }
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/server/interfaces', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
[ { "name": "eth0", "networks": [ {}, {}, {} ] } ]
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/server/info', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "version": "2.13.0-internal", "build": "18eba991", "web_version": "2.12.7-82fda2", "web_override": true, "client_version": [ "27" ], "os_distribution": "Ubuntu 24.04.6 LTS", "architecture": "arm64", "cores": 0, "os_hostname": "access-server-os-hostname" }
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/vpn/dco-module', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "available": true, "version": "0.2.20230323" }
const inputBody = '{ "names": [ "vpn.server.cipher" ] }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/helper/status-overview', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "configuration_items": { "total": 0, "items": [ {} ] }, "server_info": { "version": "2.13.0-internal", "build": "18eba991", "web_version": "2.12.7-82fda2", "web_override": true, "client_version": [ "27" ], "os_distribution": "Ubuntu 24.04.6 LTS", "architecture": "arm64", "cores": 0, "os_hostname": "access-server-os-hostname" }, "dco_module": { "available": true, "version": "0.2.20230323" }, "eula_status": { "eula_version_as": 7, "eula_web_hash": "36D7D51F474A84A2A30A41BC92CBA5D9D65F756484011D6F58B9D667F8DBBE9C", "eula_accepted": true } }
{ "message": "Insufficient privileges to use this API" }
license
APIs that allow examining and setting licensing of the AS instance
licenseInfo
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | the current status of the access Server licensing | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
checkSubscription
Body parameter
{ "subscription": "string" }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
» subscription | body | string | true | The subscription file. This is either a string containing a json object or a base64 encoding of the json object. |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | The result of the subscription test | ||
400 | format the license is not detected or other error with license. | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
loadSubscription
Body parameter
{ "subscription": "string" }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
» subscription | body | string | true | The subscription file. This is either a string containing a json object or a base64 encoding of the json object. |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Subscription has been successfully loaded. | None | |
400 | format the license is not detected or other error with license. | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
deactivateSubscription
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Subscription has been successfully deactivated. | None | |
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
activateFixedLicenseOnline
Body parameter
{ "license": "string" }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
» license | body | string | true | The license file |
format the license is not detected or other error with license.
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Online license has been successfully activated. | None | |
400 | format the license is not detected or other error with license. | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
activateFixedLicenseOffline
Body parameter
license: string
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
» license | body | string | true | The license file |
format the license is not detected or other error with license.
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Fix license has been successfully activated. | None | |
400 | format the license is not detected or other error with license. | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
licenseGetMachineId
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | machine id file is returned | string | |
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/license/info', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "licensing_type": "unlicensed", "current_cc": 3, "max_cc": 13, "fixed_licenses": [ { "expiry": "2019-08-24T14:15:22Z", "key": "string", "max_cc": 0 } ] }
const inputBody = '{ "subscription": "string" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/license/subscription/test', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "agent_id'": "13014502862141447248", "agent_disabled": true, "cc_limit": 13, "error": "string", "fallback_cc'": 2, "grace_period": 30, "last_successful_update": "2019-08-24T14:15:22Z", "total_cc": 0, "name": "Test subscription for development", "subkey": "ASUYHgkSWvVQFZhJXVdgtEa_AStctYuHirYZeFbZjLvQCWCaViVamXwL_7a289be35f6987c9aec4585c922a740c1b7620d5", "billing_id": "tctYuHirYZeFbZjLvQC", "next_update": "2019-08-24T14:15:22Z", "updates_failed": 0, "notes": [ "Subscription will expire on 1/2/3", "Maximum allowed concurrent connections might be limited to 23 by the 'subscription.local_cc_limit' setting" ], "overdraft": true, "server": "asb.sts.openvpn.net", "type": "-", "state": "SUBSCRIPTION_OK" }
const inputBody = '{ "subscription": "string" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/license/subscription', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/license/subscription', { method: 'DELETE', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
const inputBody = '{ "license": "string" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/license/fixed-license/online-activation', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "License not found on server" }
{ "message": "Insufficient privileges to use this API" }
const inputBody = '{ "license": "string" }'; const headers = { 'Content-Type':'multipart/form-data', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/license/fixed-license/offline-activation', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Fixed license already expired" }
{ "message": "Insufficient privileges to use this API" }
const headers = { 'Accept':'text/plain', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/license/machine-id', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
"string"
proxy
pseudo endpoint that explains the proxying mechanism to reach other AS backend servers in a clustered OpenVPN Access Server setup.
post__proxy
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
502 | there was some communication problems with the other backend node other than a timeout or the host specified in the X-OpenVPN-AS-Node header is not in the list of backend servers. | ||
504 | Proxying to the other node timed out | None |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
X-OpenVPN-AS-Node | header | string | false | This is an optional header that is used to determine the backend that this request should be redirected to. |
Detailed descriptions
X-OpenVPN-AS-Node: This is an optional header that is used to determine the backend that this request should be redirected to. Note this value of the name is the name of the node and not the api_endpoint of the node. See the /proxy pseudo endpoint to get a description of this mechanism.
const headers = { 'Accept':'application/json', 'X-OpenVPN-AS-Node':'string', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/proxy', { method: 'POST', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
cluster
APIs related to setting, querying status and managing an OpenVPN Access Server cluster
clusterListNodes
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Successful operation | Inline | |
403 | only admin users are allowed to use this API |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» nodes | object | false | none | holds a dictionary of all the nodes that are part of the cluster |
»» additionalProperties | any | false | none | none |
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»» anonymous | false | none | describes a node in the cluster. The certificate field is the certificate that the node will present on its api_endpoint and that is expected to be used to verify the identity of the node. | |
»»»» name | string | true | none | the name that uniquely identifies the cluster node [node_name] |
»»»» api_endpoint | false | none | the API endpoint to specifically address a node. Requires format https:ip/hostname:port. Note that https is necessary because certificateFingerprint is used by https client to verify it is indeed talking to the right node. | |
»»»» certificate_fingerprint | certificateFingerprint(sha256) | false | none | The SHA256 hash of the certificate body, also known as the fingerprint of the certificate. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»» anonymous | object | false | none | none |
»»»» restart_pending | boolean | false | none | Indicates if a node has a pending restart. |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
rrdnshostname
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Successful operation | None | |
400 | Setting the cluster properties failed | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
clustergetprops
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Successful operation | Inline | |
403 | only admin users are allowed to use this API |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» props | object | false | none | holds a dictionary of all props of the cluster |
»» additionalProperties | false | none | properties common to all nodes in the cluster. | |
»»» rr_dns_hostname | string | false | none | the Round-Robin hostname that uniquely identifies the cluster |
»»» rr_dns_new_nodes | boolean | false | none | if true, use rr_dns_hostname as node hostname for new nodes joining the cluster |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
clustersetprops
Body parameter
{ "rr_dns_hostname": "cluster.example.com", "rr_dns_new_nodes": true }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none | |
» rr_dns_hostname | body | string | false | the Round-Robin hostname that uniquely identifies the cluster |
» rr_dns_new_nodes | body | boolean | false | if true, use rr_dns_hostname as node hostname for new nodes joining the cluster |
Setting the cluster properties failed
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Properties on the cluster node have been successfully set. | None | |
400 | Setting the cluster properties failed | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
clusterset
Body parameter
{ "api_endpoint": "https://node1:945", "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C" }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
node | path | string | true | none |
body | body | object | false | none |
» api_endpoint | body | false | the API endpoint to specifically address a node. Requires format https:ip/hostname:port. Note that https is necessary because certificateFingerprint is used by https client to verify it is indeed talking to the right node. | |
» certificate_fingerprint | body | certificateFingerprint(sha256) | false | The SHA256 hash of the certificate body, also known as the fingerprint of the certificate. |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Properties on the cluster node have been successfully set. | None | |
400 | Error setting the cluster properties failed | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
post__cluster_join
Body parameter
{ "name": "vienna.example.com", "api_endpoint": "https://node1:945", "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C", "mysqluri": "mysql://user:password@mysql.example.com:3306/" }
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Successful operation | None | |
400 | joining the cluster failed | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none |
standard response when there insufficient rights to use an API.
post__cluster_create
Body parameter
{ "name": "vienna.example.com", "api_endpoint": "https://node1:945", "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C", "mysqluri": "mysql://user:password@mysql.example.com:3306/", "rr_dns_hostname": "cluster.example.com", "rr_dns_new_nodes": true, "rr_update_node": true }
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Successful operation | None | |
400 | creating the cluster failed | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none |
standard response when there insufficient rights to use an API.
post__cluster_leave
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Successful operation. Leaving the cluster succeeded | None | |
400 | leaving the cluster failed | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
put__database_convert
Body parameter
{ "mysqluri": "mysql://user:password@mysql.example.com:3306/" }
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Successful operation | None | |
400 | Converting the database failed. | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
» mysqluri | body | false | the URI of the mysql server. |
standard response when there insufficient rights to use an API.
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/cluster/nodes/list', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "nodes": { "property1": { "name": "vienna.example.com", "api_endpoint": "https://node1:945", "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C", "restart_pending": true }, "property2": { "name": "vienna.example.com", "api_endpoint": "https://node1:945", "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C", "restart_pending": true } } }
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/cluster/rr-dns-hostname', { method: 'PUT', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/cluster/props', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "props": { "property1": { "rr_dns_hostname": "cluster.example.com", "rr_dns_new_nodes": true }, "property2": { "rr_dns_hostname": "cluster.example.com", "rr_dns_new_nodes": true } } }
const inputBody = '{ "rr_dns_hostname": "cluster.example.com", "rr_dns_new_nodes": true }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/cluster/props', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "rr_dns_hostname has invalid characters in it" }
{ "message": "Insufficient privileges to use this API" }
const inputBody = '{ "api_endpoint": "https://node1:945", "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/cluster/{node}/set', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "invalidchars": { "value": { "message": "api_endpoint has invalid characters in it" } } }
const inputBody = '{ "name": "vienna.example.com", "api_endpoint": "https://node1:945", "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C", "mysqluri": "mysql://user:password@mysql.example.com:3306/" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/cluster/join', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
{ "message": "Insufficient privileges to use this API" }
const inputBody = '{ "name": "vienna.example.com", "api_endpoint": "https://node1:945", "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C", "mysqluri": "mysql://user:password@mysql.example.com:3306/", "rr_dns_hostname": "cluster.example.com", "rr_dns_new_nodes": true, "rr_update_node": true }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/cluster/create', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
{ "message": "Insufficient privileges to use this API" }
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/cluster/leave', { method: 'POST', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
const inputBody = '{ "mysqluri": "mysql://user:password@mysql.example.com:3306/" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/database/convert', { method: 'PUT', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
{ "message": "Insufficient privileges to use this API" }
maintenance
APIs used for server maintenance like restarting.
get__support_report
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | The report that is also generated by ‘sacli support’ | string | |
403 | only admin users are allowed to use this API | None |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
post__server_restart
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Server restart successfully scheduled | None | |
400 | Server has some misconfiguration and restart is not scheduled | ||
403 | User does not have admin permission | None |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
restartMode | query | false | none |
Enumerated Values
Parameter | Value |
---|---|
restartMode | cold |
restartMode | warm |
restartMode | dry_run |
restartMode | systemctl |
restartMode | server_agent |
serverStatus
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | the server status | ||
403 | User does not have admin permission | None |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const headers = { 'Accept':'text/plain', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/support/report', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
"string"
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/server/restart', { method: 'POST', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/server/status', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "last_restarted": "2019-08-24T14:15:22Z", "service_status": { "property1": { "status": "on", "error": [] }, "property2": { "status": "on", "error": [] } }, "auth_module_status": { "property1": "on", "property2": "on" } }
configurationProfile
API to manage OpenVPN Access Server’s main configuration database
enumerateConfigurationProfileList
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Success | Inline | |
403 | only admin users are allowed to use this API |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» active_profile | false | none | This is the configuration profile name. A typical access server uses the DEFAULT profile as the normal profile. Multiple profiles can be used to make a backup or to first edit an inactive profile and then apply all changes at once. | |
» profiles | false | none | A list of all configuration profiles on Access Server |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
configurationProfileDelete
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
profile | path | true | none |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | configuration profile successfully deleted | None | |
400 | profile deletion would violate some constraints like deleting the active profile | ||
403 | only admin users are allowed to use this API | ||
404 | configuration profile to be deleted was not found |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
configurationProfileCreate
Body parameter
{ "profile": "string", "copy_from": "string" }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | true | none |
» profile | body | true | This is the configuration profile name. A typical access server uses the DEFAULT profile as the normal profile. Multiple profiles can be used to make a backup or to first edit an inactive profile and then apply all changes at once. | |
» copy_from | body | false | This is the configuration profile name. A typical access server uses the DEFAULT profile as the normal profile. Multiple profiles can be used to make a backup or to first edit an inactive profile and then apply all changes at once. |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | configuration profile successfully created | None | |
400 | profile creation has some problem like using an invalid profile name | ||
403 | only admin users are allowed to use this API | ||
404 | configuration profile to be copied from was not found |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
validateConfigProfile
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
profile | path | true | none |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Success. No errors in the profile are detected | None | |
400 | validation of the profile encountered some problems see the error reason for more details. | ||
403 | only admin users are allowed to use this API | ||
404 | configuration profile to be validated was not found |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
RunSetActiveProfile
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
profile | path | true | none | |
restartMode | query | false | none |
Enumerated Values
Parameter | Value |
---|---|
restartMode | cold |
restartMode | warm |
restartMode | dry_run |
restartMode | systemctl |
restartMode | server_agent |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Success. No errors in the profile are detected and the new profile is being set. | None | |
400 | validation of the profile encountered some problems or some other error occurred. See error reason for more details. | ||
403 | only admin users are allowed to use this API | ||
404 | the requested configuration profile was not found. |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
getConfigItems
Body parameter
{ "names": [ "vpn.server.cipher" ] }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
configurationProfile | path | true | none | |
body | body | any | false | none |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Success | Inline | |
403 | only admin users are allowed to use this API | ||
404 | configuration profile to be listed was not found |
Response Schema
Status Code 200
A list of all or subset of profiles
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» total | integer | false | none | total number of profiles that match if pagination is not in effect, this matches the size of the provided array |
» items | [allOf] | false | none | [This represents a configuration item in the server configuration profile. To determine if this item has been user-set or not, check the value of derived_from.] |
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | object | false | none | none |
»»» name | true | none | the configuration value’s key. | |
»»» derived_from | true | none | the source that the current values has be derived from. | |
»»» type | string | false | none | Determines the value type of this configuration item. This also implies which of the different value attributes are expected to be present on this configuration item. |
»»» description | string | false | none | A user readable description of the configuration item that gives a user an understandable. This item can be absent for custom configuration values. |
»»» category | string | true | none | Different items have different visibility/category that should be taken into account when presenting them to the user. This key informs the UI if a variable is deprecated but still evaluated (deprecated), deprecated and removed (removed), normal, advanced (a value that for normal operation of OpenVPN Access Server should need to be changed as it is typically reserved for some corner-case or speciality configurations) or is a calculated value that is readonly as it is calculated from other configuration items but is not modifiable by the user (derived). Items that have a type of required often do not have a default value but must be set in order for Access to correctly work (e.g. host.name). Removed values should be only shown by the UI if the are set by the user. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | any | false | none | none |
oneOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»» anonymous | false | none | A configuration value that is expressed as an integer. | |
»»»» value | integer | false | none | none |
»»»» default_value | integer | false | none | The default value for the configuration. |
»»»» max_value | integer | false | none | A hint of maximum allowed value |
»»»» min_value | integer | false | none | A hint for minimum allowed value |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»» anonymous | false | none | none | |
»»»» value | boolean | false | none | none |
»»»» default_value | boolean | false | none | The default value for the configuration. |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»» anonymous | false | none | A configuration value that is expressed as a string. Either value or redacted_value is present | |
»»»» value | string | false | none | the value of this string configuration |
»»»» redacted_value | string | false | none | the real value of this configuration key is not present because it is a private key or password. The value of this string will give an indication of the redacted value. |
»»»» default_value | string | false | none | The default value for the configuration. |
»»»» allowed_values | [string] | false | none | if present this array has a list of the allowed values |
»»»» type_hint | string | false | none | if present, this type hint denotes this configuration value to contain a special type of value, so the UI can do additional verification to ensure the user input matches this type |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»» anonymous | false | none | This is a configuration value for which the backed does have no information. This is likely a custom configuration key that a user manually entered or a configuration value that is a result from a downgrade and is only present in newer Access Server versions. | |
»»»» value | string | false | none | none |
Enumerated Values
Property | Value |
---|---|
derived_from | default |
derived_from | local_db |
derived_from | cluster_db |
derived_from | mysql_standalone_db |
derived_from | as_conf |
derived_from | environment |
derived_from | runtime |
derived_from | other |
type | custom |
type | integer |
type | boolean |
type | string |
category | deprecated |
category | removed |
category | normal |
category | required |
category | derived |
category | advanced |
category | custom |
type_hint | ipv4Address |
type_hint | ipv6Address |
type_hint | ipAddress |
type_hint | hostname |
type_hint | pemCertificate |
type_hint | pemPrivateKey |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
post_config-items{configurationProfile}
Body parameter
{ "property1": "string", "property2": "string" }
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Configuration items were successfully updated/set | None | |
400 | Configuration value do not have the correct type or another problems occurred. See errorReason for detailed information | ||
403 | only admin users are allowed to use this API | ||
404 | configuration profile to be changed was not found |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
configurationProfile | path | true | none | |
body | body | object | true | none |
» additionalProperties | body | string | false | none |
standard response when there insufficient rights to use an API.
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/config-profile/list', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "active_profile": "default", "profiles": [ "default", "heaven", "hades", "olymp" ] }
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/config-profile/{profile}', { method: 'DELETE', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
const inputBody = '{ "profile": "string", "copy_from": "string" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/config-profile', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/config-profile/{profile}/validate', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/config-profile/{profile}/set-active', { method: 'POST', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
const inputBody = '{ "names": [ "vpn.server.cipher" ] }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/config-items/{configurationProfile}/list', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "total": 0, "items": [ { "name": "vpn.server.cipher", "derived_from": "default", "type": "custom", "description": "string", "category": "deprecated", "value": 0, "default_value": 0, "max_value": 0, "min_value": 0 } ] }
const inputBody = '{ "property1": "string", "property2": "string" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/config-items/{configurationProfile}', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "reason": "config values had errors", "detail": { "host.name": "Contains invalid character %", "server.port": "Must be an integer between 1 and 65335" } }
{ "message": "Insufficient privileges to use this API" }
saml
API endpoints that are related to SAML based authentication
post__saml_acs
Body parameter
RelayState: string SAMLResponse: string
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | This will return a html page similar to index.html that loads the web site of the application. In the source code it will embed a javascript fragment that contains the assertion as javascript variable SAMLResponse itself and the RelayState as RelayState variable. | None | |
400 | Throw validation error if wrong request passed | None | |
405 | Only POST for this url is allowed. Throw unsupported error if method is not POST | None |
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
» RelayState | body | string | false | cws, profile or vpnauthnodeidsessionid |
» SAMLResponse | body | string(xml string encoded in base64 format) | true | none |
This will return a html page similar to index.html that loads the web site of the application. In the source code it will embed a javascript fragment that contains the assertion as javascript variable SAMLResponse itself and the RelayState as RelayState variable.
Throw validation error if wrong request passed
Only POST for this url is allowed. Throw unsupported error if method is not POST
Response Schema
This operation does not require authentication
get__saml_metadata
SAML is not configured or invalid configuration
Responses
Response Schema
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
get__saml_redirect
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
302 | Responds with redirect to Identity Provider url | None | |
403 | Errors can be: Wrong RelayState parameter or assertion request is invalid | None |
This operation does not require authentication
get__auth_get-idp-url
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Identity Provider URL to redirect to | string | |
400 | Errors can be: Wrong RelayState parameter or SAML configuration error |
This operation does not require authentication
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
relay_state | query | string | false | If not set, the cws relay_state is assumed |
const inputBody = '{ "RelayState": "string", "SAMLResponse": "string" }'; const headers = { 'Content-Type':'application/x-www-form-urlencoded', 'Accept':'text/html' }; fetch('/api/saml/acs', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
"< <head> <javascript> SAMLResponse = \"[samlassertion data]\"; RelayState = \"cwslogin\"; </javascript> [content of index.html]"
"< <head>HEAD content</head> <body><h1>SAML authentication failed</h1><p>assertion request is invalid</p></body>"
"< <head>HEAD content</head> <body><h1>SAML authentication failed</h1><p>assertion method is not supported</p></body>"
const headers = { 'Accept':'application/samlmetadata+xml', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/saml/metadata', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
"< <head>HEAD content</head> <body><h1>404 Not Found</h1><p>SAML not configured or invalid configuration</p></body>"
fetch('/api/saml/redirect', { method: 'GET' }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
const headers = { 'Accept':'string' }; fetch('/api/auth/get-idp-url', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
vpn
directly related to the connected VPN users
vpnAuthSAMLAssertion
Body parameter
{ "assertion": "string", "relay_state": "vpnauth~nod1~Dfk3287761d" }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Assertion Success | None | |
400 | Invalid SAML assertion in the case if empty string was passed as saml assertion | ||
401 | Wrong Relay State or other assertion error |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
get__vpn_status
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Vpn Server status | Inline | |
403 | only admin users are allowed to use this API |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» vpn_clients | [allOf] | false | none | List of connected VPN clients |
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | false | none | none | |
»»» daemon_id | true | none | an ID that identifies the OpenVPN daemon that the client is connected to | |
»»» client_id | true | none | the client ID of the connected client. This ID is only unique for a specific daemonId. Or with other words, only daemonID and clientID together uniquely identify a client. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | object | false | none | none |
»»» bytes_sent | integer | false | none | number of bytes sent |
»»» bytes_received | integer | false | none | number of bytes received |
»»» commonname | string | false | none | the common name the client uses in its certificate. |
»»» username | string | false | none | username of the client |
»»» connected_since | string(date-time) | false | none | time in UTC since when the client is connected. |
»»» datachannel_cipher | string | false | none | the data channel cipher that is used with this client. |
»»» real_address | string | false | none | the IP address the client is connected from |
»»» virtual_ipv4_address | string | false | none | the virtual or VPN address of the client |
»»» virtual_ipv6_address | string | false | none | none |
continued
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» vpn_daemons | object | false | none | none |
»» additionalProperties | false | none | status of a VPN daemon | |
»»» dco | boolean | false | none | if DCO is used on this daemon instance |
»»» version | string | false | none | the OpenVPN 2.x version of the daemon |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
disconnectClient
Body parameter
{ "reason": "John should not be working after hours", "client_reason": "Client disconnected for administrative reasons", "users": [ "niccolo@paganini.it" ] }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | any | false | none |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | client has been successfully disconnected | None | |
400 | One or more of the clients failed to disconnect | ||
403 | only admin users are allowed to use this API | ||
404 | A client with the specified daemon and client id could not be found. |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{ "assertion": "string", "relay_state": "vpnauth~nod1~Dfk3287761d" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/auth/vpn/vpnsaml', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/vpn/status', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "vpn_clients": [ { "daemon_id": "openvpn_7", "client_id": 7, "bytes_sent": 0, "bytes_received": 0, "commonname": "plato_AUTOLOGIN", "username": "plato", "connected_since": "2019-08-24T14:15:22Z", "datachannel_cipher": "ChaCha20-Poly1305", "real_address": "1.2.7.8:23123", "virtual_ipv4_address": "10.0.0.7", "virtual_ipv6_address": "fd00:f00f::b00f" } ], "vpn_daemons": { "property1": { "dco": true, "version": "OpenVPN 2.7_git [git:bloom/520bc001b093857c+] x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZ4] [EPOLL] [MH/PKTINFO] [AEAD] [DCO] built on Nov 30 2023" }, "property2": { "dco": true, "version": "OpenVPN 2.7_git [git:bloom/520bc001b093857c+] x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZ4] [EPOLL] [MH/PKTINFO] [AEAD] [DCO] built on Nov 30 2023" } } }
const inputBody = '{ "reason": "John should not be working after hours", "client_reason": "Client disconnected for administrative reasons", "users": [ "niccolo@paganini.it" ] }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/vpn/client/disconnect', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
cws
cws stands for client website. These APIs are the ones that can be used as normal users and do not require admin permission for basic operations. Some have extended functionality that require admin privileges like acting on the behalf of another user.
generateInstallerUrl
Body parameter
{ "user": "niccolo@paganini.it", "installer_type": "win_v3", "profile_type": "autologin", "tls_crypt_v2": true }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none | |
» user | body | false | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
» installer_type | body | true | Type of the installer binary that should be created for installation. | |
» profile_type | body | false | none | |
» tls_crypt_v2 | body | boolean | false | The client is capable of TLS-Crypt v2 |
Enumerated Values
Parameter | Value |
---|---|
» installer_type | win_v3 |
» installer_type | mac_v3 |
» installer_type | win |
» installer_type | mac |
» installer_type | ios |
» installer_type | android |
» installer_type | linux |
» profile_type | autologin |
» profile_type | userlogin |
» profile_type | generic |
» profile_type | epki-generic |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Installer URL was successfully generated | string | |
400 | “Generation of installer url was not permitted” or “Requested installer is not downloadable” or “An error occurred while trying to download OpenVPN Connect from the server. The required client installer file was not found on the server” |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{ "user": "niccolo@paganini.it", "installer_type": "win_v3", "profile_type": "autologin", "tls_crypt_v2": true }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/installer-url', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
userprop
APIs that related to retrieving and modifying user properties.
getdefaultuserprops
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Success | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
getuserprops
Body parameter
{ "page_size": 0, "offset": 0, "sort_by": "asc", "order_by": "admin", "filters": { "name": { "operation": "substring", "value": "vio" }, "group": { "operation": "substring", "value": "vio" }, "admin": { "value": true }, "autologin": { "value": true }, "anywhere": { "value": "bass", "fields": [] } }, "users": [ "niccolo@paganini.it" ], "proplist": [ "string" ] }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Success | Inline | |
403 | only admin users are allowed to use this API |
Response Schema
Status Code 200
A list of all or subset of profiles
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» total | integer | false | none | total number of users that match if pagination is not in effect, this matches the size of the provided array |
» profiles | [allOf] | false | none | none |
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | false | none | This hold the attributes of the userprop that is not specifically handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - deny (boolean): If true cannot connect or login (prop_deny) - deny_web (boolean): If true cannot login to web (prop_deny_web) - compile (boolean): If true the type is ‘user_compile’ instead of ‘user_connect’. (user record also queried on nftables/iptables compile and not only on connect) - admin (boolean): user is admin (prop_superuser) - autologin (boolean): autologin profile generation is allowed by the user themselves (prop_autologin) - auth_method (string): the authentication method that will be used for the user. Maps to user_auth_type and default configuration etc. - cc_commands: custom OpenVPN directives that will imported for the user on the server side (prop_cc_cmds) - totp: specifies whether TOTP based MFA is required (prop_google_auth) - password_strength: password strength check is enforced when changing the password for local auth (prop_pwd_strength/cs.cws.pwd_strength) - allow_password_change (boolean): specifies if a user is allowed to change the password themselves when local auth is used (prop_pwd_change). If not set on users the global default server key cs.cws.pwd_change is used as default. Admins can always change user passwords (including their own). - reroute_gw (string): one of ‘disable’, ‘dns_only’, ‘global’ Disables redirection of the default route and/or DNS on the client. This does not block it on the backend, if blocking on the backend is required, access lists should be added in addition. Defaults to ‘global’ if not set. The setting global will follow the configuration key ‘vpn.client.routing.reroute_gw’.(prop_reroute_gw_override) - allow_generate_profiles (prop_autogenerate): allow users themselves to generate connection profiles | |
»»» name | string | false | none | the name of the user or group. |
»»» deny | false | none | This object describes a single user property value. If it is | |
»»»» value | any | true | none | the value that this property has. If inherited is false, this is identical to inheritedValue |
oneOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»»»» anonymous | string | false | none | none |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»»»» anonymous | boolean | false | none | none |
continued
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»»» inherited | boolean | false | none | specifies if this value is inherited from an upper level if this |
»»»» inherited_source_type | string | false | none | describes where the inherited values comes. This can be from the default user properties (default) or from a global configuration settings or from a group If the property is explicitly set (ie inherited is false), this property indicates what the property would inherit from if inherit is false. |
»»»» inherited_source_name | string | false | none | for the inherited types where knowing the name of the source can be beneficial. Like the group name or in some cases the configuration key. If the property is explicitly set (ie inherited is false), this property indicates what the property would inherit from if inherit is false. |
»»» deny_web | false | none | This object describes a single user property value. If it is | |
»»» admin | false | none | This object describes a single user property value. If it is | |
»»» autologin | false | none | This object describes a single user property value. If it is | |
»»» auth_method | false | none | This object describes a single user property value. If it is | |
»»» cc_commands | false | none | This object describes a single user property value. If it is | |
»»» totp | false | none | This object describes a single user property value. If it is | |
»»» password_strength | false | none | This object describes a single user property value. If it is | |
»»» allow_password_change | false | none | This object describes a single user property value. If it is | |
»»» reroute_gw | false | none | This object describes a single user property value. If it is | |
»»» allow_generate_profiles | false | none | This object describes a single user property value. If it is | |
»»» bypass_subnets | [IPsubNet] | false | none | Subnets or hosts (represented subnet with a /32 or /128 netmask) that are installed as bypass routes on the client, i.e. that will bypass the VPN and use the normal non-VPN connection. |
»»»» ipv6 | boolean | false | none | whether this describes an IPv4 or an IPv6 subnet |
»»»» netip | string | false | none | the network IP address. |
»»»» prefix_length | integer | false | none | length of the prefix in CIDR notation |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | false | none | this describes the properties that are only allowed on the user level itself are not inheritable from other levels | |
»»» password_defined | boolean | false | none | This indicates whether the user has a password set. The API will NOT provide the hash of the password but only the information if a user password has been set. |
»»» mfa_status | string | false | none | the status of the multi factor authentication. This is a read-only property that combines totp and totp_locked into a single status. |
»»» totp_locked | boolean | false | none | specifies if the TOTP for the user is locked/enrolled. If true, secret is no longer viewable |
»»» group | string | false | none | the group a user belongs too (conn_group) |
»»» static_ipv4 | string | false | none | optional property. Maps to conn_ip |
»»» static_ipv6 | string | false | none | optional property. Maps to conn_ip6 |
»»» dmz_ip | [DMZIP] | false | none | The IP addresses and port-ranges that are exposed on this client. |
»»»» ip | string | true | none | the external IP address of the Access Server |
»»»» protocol | false | none | specifies a Layer 4 protocol (e.g. udp or tcp) | |
»»»» start_port | integer | false | none | the starting port for the dmz. If not specified all ports will be forwarded |
»»»» end_port | integer | false | none | the end port of the ports that are being forwarded. If not specified only a single port (the start_port) is forwarded. |
»»» dmz_ipv6 | [DMZIP] | false | none | The IPv6 addresses and port-ranges that are exposed on this client. |
»»» compile | boolean | false | none | If true the type is ‘user_compile’ instead of ‘user_connect’. |
»»» totp_secret | string | false | none | the TOTP secret code according to RFC 6238. Note, that this is value might not be present for locked users in later versions (pvt_google_auth_secret). |
»»» totp_admin_only | boolean | false | none | totp_admin_only only AS admins can generate and view Google Authenticator secrets (prop_google_auth_admin_locked) |
»»» client_to_server_subnets | [IPsubNet] | false | none | < Subnets that are behind the client. I.e. the client will be a router/gateway for the subnets specified in this array. On the server side, this is split into ipv4 and ipv6 subnets (c2s_subnets and c2s_subnets6) but this API represents that as a single list. Use the ipv6 flag of the subnet to determine the address family. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | false | none | This hold the attributes of the userprop that control client side scripting. It is not handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - Client side scripting: prop_cli.script.<win | |
»»» cli_script_connect_win_user_connect | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_win_user_disconnect | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_win_admin_connect | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_win_admin_disconnect | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_mac_user_connect | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_mac_user_disconnect | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_mac_admin_connect | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_mac_admin_disconnect | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_win_env | object | false | none | environment variables for the Windows script to run, each key will specify the name of the environment variable. |
»»»» additionalProperties | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_mac_env | object | false | none | environment variables for the macOS script to run, each key will specify the name of the environment variable. |
»»»» additionalProperties | false | none | This object describes a single user property value. If it is |
Enumerated Values
Property | Value |
---|---|
inherited_source_type | default |
inherited_source_type | implicit_default |
inherited_source_type | group |
inherited_source_type | configuration |
mfa_status | pending |
mfa_status | disabled |
mfa_status | enrolled |
protocol | tcp |
protocol | udp |
protocol | icmp |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
createUserPropUser
Body parameter
{ "name": "string", "deny": true, "deny_web": true, "admin": true, "autologin": true, "auth_method": "string", "cc_commands": "string", "totp": true, "password_strength": true, "allow_password_change": true, "reroute_gw": true, "allow_generate_profiles": true, "bypass_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "password_defined": true, "mfa_status": "pending", "totp_locked": true, "group": "stringsection", "static_ipv4": "string", "static_ipv6": "string", "dmz_ip": [ { "ip": "123.7.3.1", "start_port": 7000, "end_port": 7111, "protocol": "udp" } ], "dmz_ipv6": [ { "ip": "123.7.3.1", "start_port": 7000, "end_port": 7111, "protocol": "udp" } ], "compile": true, "totp_secret": "string", "totp_admin_only": true, "client_to_server_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "cli_script_connect_win_user_connect": "string", "cli_script_connect_win_user_disconnect": "string", "cli_script_connect_win_admin_connect": "string", "cli_script_connect_win_admin_disconnect": "string", "cli_script_connect_mac_user_connect": "string", "cli_script_connect_mac_user_disconnect": "string", "cli_script_connect_mac_admin_connect": "string", "cli_script_connect_mac_admin_disconnect": "string", "cli_script_connect_win_env": { "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi", "lucky_number": "23", "SCRIPT_VER": "alpha9" }, "cli_script_connect_mac_env": { "property1": "string", "property2": "string" } }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | New User has been successfully created | None | |
400 | the user already exists or contains invalid characters or a group of the same name already exists or one of the specified userprop is invalid. | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
createUserPropGroup
Body parameter
{ "name": "string", "deny": true, "deny_web": true, "admin": true, "autologin": true, "auth_method": "string", "cc_commands": "string", "totp": true, "password_strength": true, "allow_password_change": true, "reroute_gw": true, "allow_generate_profiles": true, "bypass_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "members": [ "niccolo@paganini.it", "hillary@hahn.us", "yoyoma" ], "member_count": 0, "subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "dynamic_ranges": [ { "ipv6": true, "first_ip": "fd00::18cc:1b01:a772:50e1", "last_ip": "fd00::18cc:1b01:a772:80e1" } ], "cli_script_connect_win_user_connect": "string", "cli_script_connect_win_user_disconnect": "string", "cli_script_connect_win_admin_connect": "string", "cli_script_connect_win_admin_disconnect": "string", "cli_script_connect_mac_user_connect": "string", "cli_script_connect_mac_user_disconnect": "string", "cli_script_connect_mac_admin_connect": "string", "cli_script_connect_mac_admin_disconnect": "string", "cli_script_connect_win_env": { "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi", "lucky_number": "23", "SCRIPT_VER": "alpha9" }, "cli_script_connect_mac_env": { "property1": "string", "property2": "string" } }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | New group has been successfully created | None | |
400 | the group already exists or contains invalid characters or a user of the same name already exists or one of the properties has an invalid value. | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
listAccessLists
Body parameter
{ "order_by": "internal_prop_representation", "filters": { "internal_representation": { "operation": "substring", "value": "vio" }, "groupname": { "operation": "substring", "value": "vio" }, "username": { "operation": "substring", "value": "vio" }, "object_type": "user" }, "groups": [ "string" ], "users": [ "niccolo@paganini.it" ] }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none | |
» order_by | body | string | false | none |
» filters | body | object | false | filters for the access list objects. |
»» internal_representation | body | false | This specifies that the result should be filtered by this attribute with the specified operation. | |
»»» value | body | string | true | none |
»»» operation | body | string | true | none |
»» groupname | body | false | This specifies that the result should be filtered by this attribute with the specified operation. | |
»» username | body | false | This specifies that the result should be filtered by this attribute with the specified operation. | |
»» object_type | body | string | false | Only return users or groups in the response. |
» groups | body | false | a list of groups that should be fetched. Note, that this list cannot be arbitrarily long as the query to the backend database has a size limit for a query. Note that groups that are not found in the backend will be missing from the response. | |
» users | body | [username] | false | a list of usernames that should be fetched. Note, that this list cannot be arbitrarily long as the query to the backend database has a size limit for a query. Note that usernames that are not found in the backend will be missing from the response. |
Enumerated Values
Parameter | Value |
---|---|
» order_by | internal_prop_representation |
» order_by | name |
»»» operation | equal |
»»» operation | substring |
»»» operation | not_equal |
»» object_type | user |
»» object_type | group |
»» object_type | all |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Success | Inline | |
403 | only admin users are allowed to use this API |
Response Schema
Status Code 200
A list of all matching access lists
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» profiles | [oneOf] | false | none | [Format of OpenVPN Access Server’s access lists. Each access list entry has a class/type that determines how the entry works. - The all, all_vpn_clients and all_s2c_subnet types do not require an additional property. - The user/group require the username/groupname property - the nat and route type require the subnet property. Note that internally there is also the class subnet and this class can be modified with a R/N suffix to be either the route or nat class, so the API will represent these with the appropriate class. Either username or groupname is set to indicate whether this is a user or group assigned access rules. ] |
»» username | false | none | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
»» groupname | false | none | a group name that is being in used in user management to specify a group name. | |
»» access_route | any | false | none | none |
oneOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»» anonymous | false | none | Format of OpenVPN Access Server’s access lists. Each access list entry has a class/type that determines how the entry works. - The all, all_vpn_clients and all_s2c_subnet types do not require an additional property. - The user/group require the username/groupname property - the nat and route type require the subnet property. Note that internally there is also the class subnet and this class can be modified with a R/N suffix to be either the route or nat class, so the API will represent these with the appropriate class. | |
»»»» type | string | false | none | none |
»»»» accept | boolean | false | none | specifies if we accept or deny this particular access |
»»»» username | false | none | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
»»»» groupname | false | none | a group name that is being in used in user management to specify a group name. | |
»»»» subnet | false | none | The definition of the subnet used by the nat and route accessRoute classes. Each one is a subnet with one or more port ranges For reference, the internal representation on the Access Server properties looks like this: - 192.168.4.0/24 - 10.10.0.0/24:https,udp/1194,tcp/1194 - 192.168.99.0/24::R - 192.168.99.0/24:https,udp/1194,tcp/1194,udp/2000-2999:R - 2001:608:3:814::0/64 |
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»»»» anonymous | object | false | none | describes an IP subnet. |
»»»»»» ipv6 | boolean | false | none | whether this describes an IPv4 or an IPv6 subnet |
»»»»»» netip | string | false | none | the network IP address. |
»»»»»» prefix_length | integer | false | none | length of the prefix in CIDR notation |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»»»» anonymous | object | false | none | none |
»»»»»» service | [oneOf] | false | none | [describes an IP UDP/TCP service or an icmp service] |
oneOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»»»»»» anonymous | false | none | Describes a layer4 (TCP/UDP) port or port-range. protocol may only be udp or tcp | |
»»»»»»»» protocol | true | none | specifies a Layer 4 protocol (e.g. udp or tcp) | |
»»»»»»»» start_port | integer | true | none | The start port of the port range |
»»»»»»»» end_port | integer | false | none | The end port of the port range. If not specified, the range will consist of only one single port (start_port) |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»»»»»» anonymous | false | none | Describes an icmp service type. protocol is always icmp | |
»»»»»»»» protocol | false | none | specifies a Layer 4 protocol (e.g. udp or tcp) | |
»»»»»»»» type | string | false | none | none |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»» anonymous | null | false | none | indicator that routes of this type should be deleted |
continued
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» type | string | false | none | the type of access list this item this is in the user/group. |
oneOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | object | false | none | none |
not
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»» anonymous | object | false | none | none |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | object | false | none | none |
not
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»» anonymous | object | false | none | none |
Enumerated Values
Property | Value |
---|---|
type | user |
type | group |
type | route |
type | nat |
type | all |
type | all_vpn_clients |
type | all_s2c_subnets |
protocol | tcp |
protocol | udp |
protocol | icmp |
protocol | tcp |
protocol | udp |
protocol | icmp |
type | icmp-any |
type | icmp-echo-reply |
type | icmp-destination-unreachable |
type | icmp-network-unreachable |
type | icmp-host-unreachable |
type | icmp-protocol-unreachable |
type | icmp-port-unreachable |
type | icmp-fragmentation-needed |
type | icmp-source-route-failed |
type | icmp-network-unknown |
type | icmp-host-unknown |
type | icmp-network-prohibited |
type | icmp-host-prohibited |
type | icmp-TOS-network-unreachable |
type | icmp-TOS-host-unreachable |
type | icmp-communication-prohibited |
type | icmp-host-precedence-violation |
type | icmp-precedence-cutoff |
type | icmp-source-quench |
type | icmp-redirect |
type | icmp-network-redirect |
type | icmp-host-redirect |
type | icmp-TOS-network-redirect |
type | icmp-TOS-host-redirect |
type | icmp-echo-request |
type | icmp-router-advertisement |
type | icmp-router-solicitation |
type | icmp-time-exceeded |
type | icmp-ttl-zero-during-transit |
type | icmp-ttl-zero-during-reassembly |
type | icmp-parameter-problem |
type | icmp-ip-header-bad |
type | icmp-required-option-missing |
type | icmp-timestamp-request |
type | icmp-timestamp-reply |
type | icmp-address-mask-request |
type | access_from_ipv6 |
type | access_from_ipv4 |
type | access_to_ipv4 |
type | access_to_ipv6 |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
setAccessLists
Body parameter
{ "items_set": [ { "username": "johann", "access_route": {} }, { "username": "wolfgang", "access_route": null, "type": "access_to_ipv4" } ] }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
» items_set | body | array | false | none |
»» username | body | false | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
»» groupname | body | false | a group name that is being in used in user management to specify a group name. | |
»» access_route | body | any | false | none |
»»» anonymous | body | false | Format of OpenVPN Access Server’s access lists. Each access list entry has a class/type that determines how the entry works. | |
»»»» type | body | string | false | none |
»»»» accept | body | boolean | false | specifies if we accept or deny this particular access |
»»»» username | body | false | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
»»»» groupname | body | false | a group name that is being in used in user management to specify a group name. | |
»»»» subnet | body | false | The definition of the subnet used by the nat and route accessRoute classes. | |
»»»»» anonymous | body | object | false | describes an IP subnet. |
»»»»»» ipv6 | body | boolean | false | whether this describes an IPv4 or an IPv6 subnet |
»»»»»» netip | body | string | false | the network IP address. |
»»»»»» prefix_length | body | integer | false | length of the prefix in CIDR notation |
»»»»» anonymous | body | object | false | none |
»»»»»» service | body | [oneOf] | false | [describes an IP UDP/TCP service or an icmp service] |
»»»»»»» anonymous | body | false | Describes a layer4 (TCP/UDP) port or port-range. protocol may only be udp or tcp | |
»»»»»»»» protocol | body | true | specifies a Layer 4 protocol (e.g. udp or tcp) | |
»»»»»»»» start_port | body | integer | true | The start port of the port range |
»»»»»»»» end_port | body | integer | false | The end port of the port range. If not specified, the range will consist of only one single port (start_port) |
»»»»»»» anonymous | body | false | Describes an icmp service type. protocol is always icmp | |
»»»»»»»» protocol | body | false | specifies a Layer 4 protocol (e.g. udp or tcp) | |
»»»»»»»» type | body | string | false | none |
»»» anonymous | body | null | false | indicator that routes of this type should be deleted |
»» type | body | string | false | the type of access list this item this is in the user/group. |
»» anonymous | body | object | false | none |
»»» anonymous | body | object | false | none |
»» anonymous | body | object | false | none |
»»» anonymous | body | object | false | none |
Detailed descriptions
»»» anonymous: Format of OpenVPN Access Server’s access lists. Each access list entry has a class/type that determines how the entry works. - The all, all_vpn_clients and all_s2c_subnet types do not require an additional property.
The user/group require the username/groupname property
the nat and route type require the subnet property.
Note that internally there is also the class subnet and this class can be modified with a R/N suffix to be either the route or nat class, so the API will represent these with the appropriate class.
»»»» subnet: The definition of the subnet used by the nat and route accessRoute classes. Each one is a subnet with one or more port ranges
For reference, the internal representation on the Access Server properties looks like this: - 192.168.4.0/24 - 10.10.0.0/24:https,udp/1194,tcp/1194 - 192.168.99.0/24::R - 192.168.99.0/24:https,udp/1194,tcp/1194,udp/2000-2999:R - 2001:608:3:814::0/64|https,udp/1194,tcp/1194,udp/2000-2999|R - 10.0.0.7/24:icmp-any,rdp,imaps - 10.0.0.1/25:icmp-TOS-host-redirect
Note that the services array is optional. A missing service array indicates that the whole subnet is affected regardless of the used layer 4 service (icmp, tcp, udp or other IP protocol)
Enumerated Values
Parameter | Value |
---|---|
»»»» type | user |
»»»» type | group |
»»»» type | route |
»»»» type | nat |
»»»» type | all |
»»»» type | all_vpn_clients |
»»»» type | all_s2c_subnets |
»»»»»»»» protocol | tcp |
»»»»»»»» protocol | udp |
»»»»»»»» protocol | icmp |
»»»»»»»» protocol | tcp |
»»»»»»»» protocol | udp |
»»»»»»»» protocol | icmp |
»»»»»»»» type | icmp-any |
»»»»»»»» type | icmp-echo-reply |
»»»»»»»» type | icmp-destination-unreachable |
»»»»»»»» type | icmp-network-unreachable |
»»»»»»»» type | icmp-host-unreachable |
»»»»»»»» type | icmp-protocol-unreachable |
»»»»»»»» type | icmp-port-unreachable |
»»»»»»»» type | icmp-fragmentation-needed |
»»»»»»»» type | icmp-source-route-failed |
»»»»»»»» type | icmp-network-unknown |
»»»»»»»» type | icmp-host-unknown |
»»»»»»»» type | icmp-network-prohibited |
»»»»»»»» type | icmp-host-prohibited |
»»»»»»»» type | icmp-TOS-network-unreachable |
»»»»»»»» type | icmp-TOS-host-unreachable |
»»»»»»»» type | icmp-communication-prohibited |
»»»»»»»» type | icmp-host-precedence-violation |
»»»»»»»» type | icmp-precedence-cutoff |
»»»»»»»» type | icmp-source-quench |
»»»»»»»» type | icmp-redirect |
»»»»»»»» type | icmp-network-redirect |
»»»»»»»» type | icmp-host-redirect |
»»»»»»»» type | icmp-TOS-network-redirect |
»»»»»»»» type | icmp-TOS-host-redirect |
»»»»»»»» type | icmp-echo-request |
»»»»»»»» type | icmp-router-advertisement |
»»»»»»»» type | icmp-router-solicitation |
»»»»»»»» type | icmp-time-exceeded |
»»»»»»»» type | icmp-ttl-zero-during-transit |
»»»»»»»» type | icmp-ttl-zero-during-reassembly |
»»»»»»»» type | icmp-parameter-problem |
»»»»»»»» type | icmp-ip-header-bad |
»»»»»»»» type | icmp-required-option-missing |
»»»»»»»» type | icmp-timestamp-request |
»»»»»»»» type | icmp-timestamp-reply |
»»»»»»»» type | icmp-address-mask-request |
»» type | access_from_ipv6 |
»» type | access_from_ipv4 |
»» type | access_to_ipv4 |
»» type | access_to_ipv6 |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | access rules are successfully set | None | |
400 | the rules are not formattted corrrectly or the specified user/group does not exist. | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
post__users_delete
Body parameter
{ "users": [ "niccolo@paganini.it" ] }
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | userprop was successfully deleted | None | |
400 | invalid request args | ||
403 | only admin users are allowed to use this API | ||
404 | userprop to be deleted was not found |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
» users | body | [username] | false | users name list to delete. |
standard response when there insufficient rights to use an API.
post__groups_delete
Body parameter
{ "groups": [ "string" ] }
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | userprop was successfully deleted | None | |
400 | invalid request args | ||
403 | only admin users are allowed to use this API | ||
404 | userprop to be deleted was not found |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
» groups | body | false | users name list to delete. |
standard response when there insufficient rights to use an API.
modifyUserPropGroupBulk
Body parameter
"[{ 'name': 'bob', 'auth_method': 'saml'}, {'name': 'bob', 'autologin': false, pw_strength: null }]"
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | array[any] | false | none |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | changes to userproperties profile successfully done | None | |
400 | user property creation has some problem like using an invalid property name or using wrong type (boolean vs string) or using a property that is not valid on this userproperty (group only attribute on a user or vice versa). Keys in the detailed error response are tuples (user, property). | ||
403 | only admin users are allowed to use this API | ||
404 | user or group does not exist |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/users/defaultuser', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "name": "string", "deny": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "deny_web": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "admin": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "autologin": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "auth_method": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cc_commands": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "totp": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "password_strength": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "allow_password_change": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "reroute_gw": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "allow_generate_profiles": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "bypass_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "def_deny": true, "cli_script_connect_win_user_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_user_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_admin_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_admin_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_user_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_user_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_admin_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_admin_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_env": { "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi", "lucky_number": "23", "SCRIPT_VER": "alpha9" }, "cli_script_connect_mac_env": { "property1": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "property2": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" } }, "group": "stringsection" }
const inputBody = '{ "page_size": 0, "offset": 0, "sort_by": "asc", "order_by": "admin", "filters": { "name": { "operation": "substring", "value": "vio" }, "group": { "operation": "substring", "value": "vio" }, "admin": { "value": true }, "autologin": { "value": true }, "anywhere": { "value": "bass", "fields": [] } }, "users": [ "niccolo@paganini.it" ], "proplist": [ "string" ] }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/users/list', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "total": 0, "profiles": [ { "name": "string", "deny": {}, "deny_web": {}, "admin": {}, "autologin": {}, "auth_method": {}, "cc_commands": {}, "totp": {}, "password_strength": {}, "allow_password_change": {}, "reroute_gw": {}, "allow_generate_profiles": {}, "bypass_subnets": [], "password_defined": true, "mfa_status": "pending", "totp_locked": true, "group": "stringsection", "static_ipv4": "string", "static_ipv6": "string", "dmz_ip": [], "dmz_ipv6": [], "compile": true, "totp_secret": "string", "totp_admin_only": true, "client_to_server_subnets": [], "cli_script_connect_win_user_connect": {}, "cli_script_connect_win_user_disconnect": {}, "cli_script_connect_win_admin_connect": {}, "cli_script_connect_win_admin_disconnect": {}, "cli_script_connect_mac_user_connect": {}, "cli_script_connect_mac_user_disconnect": {}, "cli_script_connect_mac_admin_connect": {}, "cli_script_connect_mac_admin_disconnect": {}, "cli_script_connect_win_env": {}, "cli_script_connect_mac_env": {} } ] }
const inputBody = '{ "name": "string", "deny": true, "deny_web": true, "admin": true, "autologin": true, "auth_method": "string", "cc_commands": "string", "totp": true, "password_strength": true, "allow_password_change": true, "reroute_gw": true, "allow_generate_profiles": true, "bypass_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "password_defined": true, "mfa_status": "pending", "totp_locked": true, "group": "stringsection", "static_ipv4": "string", "static_ipv6": "string", "dmz_ip": [ { "ip": "123.7.3.1", "start_port": 7000, "end_port": 7111, "protocol": "udp" } ], "dmz_ipv6": [ { "ip": "123.7.3.1", "start_port": 7000, "end_port": 7111, "protocol": "udp" } ], "compile": true, "totp_secret": "string", "totp_admin_only": true, "client_to_server_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "cli_script_connect_win_user_connect": "string", "cli_script_connect_win_user_disconnect": "string", "cli_script_connect_win_admin_connect": "string", "cli_script_connect_win_admin_disconnect": "string", "cli_script_connect_mac_user_connect": "string", "cli_script_connect_mac_user_disconnect": "string", "cli_script_connect_mac_admin_connect": "string", "cli_script_connect_mac_admin_disconnect": "string", "cli_script_connect_win_env": { "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi", "lucky_number": "23", "SCRIPT_VER": "alpha9" }, "cli_script_connect_mac_env": { "property1": "string", "property2": "string" } }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/users/create', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "reason": "config values had errors", "detail": { "host.name": "Contains invalid character %", "server.port": "Must be an integer between 1 and 65335" } }
const inputBody = '{ "name": "string", "deny": true, "deny_web": true, "admin": true, "autologin": true, "auth_method": "string", "cc_commands": "string", "totp": true, "password_strength": true, "allow_password_change": true, "reroute_gw": true, "allow_generate_profiles": true, "bypass_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "members": [ "niccolo@paganini.it", "hillary@hahn.us", "yoyoma" ], "member_count": 0, "subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "dynamic_ranges": [ { "ipv6": true, "first_ip": "fd00::18cc:1b01:a772:50e1", "last_ip": "fd00::18cc:1b01:a772:80e1" } ], "cli_script_connect_win_user_connect": "string", "cli_script_connect_win_user_disconnect": "string", "cli_script_connect_win_admin_connect": "string", "cli_script_connect_win_admin_disconnect": "string", "cli_script_connect_mac_user_connect": "string", "cli_script_connect_mac_user_disconnect": "string", "cli_script_connect_mac_admin_connect": "string", "cli_script_connect_mac_admin_disconnect": "string", "cli_script_connect_win_env": { "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi", "lucky_number": "23", "SCRIPT_VER": "alpha9" }, "cli_script_connect_mac_env": { "property1": "string", "property2": "string" } }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/groups/create', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "reason": "config values had errors", "detail": { "host.name": "Contains invalid character %", "server.port": "Must be an integer between 1 and 65335" } }
const inputBody = '{ "order_by": "internal_prop_representation", "filters": { "internal_representation": { "operation": "substring", "value": "vio" }, "groupname": { "operation": "substring", "value": "vio" }, "username": { "operation": "substring", "value": "vio" }, "object_type": "user" }, "groups": [ "string" ], "users": [ "niccolo@paganini.it" ] }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/userprop/access/list', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
const inputBody = '{ "items_set": [ { "username": "johann", "access_route": {} }, { "username": "wolfgang", "access_route": null, "type": "access_to_ipv4" } ] }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/userprop/access/set', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
const inputBody = '{ "users": [ "niccolo@paganini.it" ] }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/users/delete', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
{ "message": "Insufficient privileges to use this API" }
const inputBody = '{ "groups": [ "string" ] }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/groups/delete', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
{ "message": "Insufficient privileges to use this API" }
const inputBody = '[{ 'name': 'bob', 'auth_method': 'saml'}, {'name': 'bob', 'autologin': false, pw_strength: null }]'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/userprop/set', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "reason": "config values had errors", "detail": { "host.name": "Contains invalid character %", "server.port": "Must be an integer between 1 and 65335" } }
helper
various API function which functionality could be achieved purely on the frontend or with a combination of various backend calls but are provided to make these tasks easier or to not have a second implementation purely on the frontend (like parsing SAML metadata).
post__helper_get-saml-configuration
Body parameter
{ "data": "string", "url": "http://example.com" }
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Success | Inline | |
400 | Something went wrong parsing the data or fetching the metadata | ||
403 | only admin users are allowed to use this API |
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
» data | body | string | false | The string that contains SAML Idp metadata in xml format |
» url | body | string(uri) | false | the url from which the backend will fetch SAML Idp metadata from |
» anonymous | body | object | false | none |
» anonymous | body | object | false | none |
standard response when there insufficient rights to use an API.
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» configuration_items | [allOf] | false | none | [This represents a configuration item in the server configuration profile. To determine if this item has been user-set or not, check the value of derived_from.] |
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | object | false | none | none |
»»» name | true | none | the configuration value’s key. | |
»»» derived_from | true | none | the source that the current values has be derived from. | |
»»» type | string | false | none | Determines the value type of this configuration item. This also implies which of the different value attributes are expected to be present on this configuration item. |
»»» description | string | false | none | A user readable description of the configuration item that gives a user an understandable. This item can be absent for custom configuration values. |
»»» category | string | true | none | Different items have different visibility/category that should be taken into account when presenting them to the user. This key informs the UI if a variable is deprecated but still evaluated (deprecated), deprecated and removed (removed), normal, advanced (a value that for normal operation of OpenVPN Access Server should need to be changed as it is typically reserved for some corner-case or speciality configurations) or is a calculated value that is readonly as it is calculated from other configuration items but is not modifiable by the user (derived). Items that have a type of required often do not have a default value but must be set in order for Access to correctly work (e.g. host.name). Removed values should be only shown by the UI if the are set by the user. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | any | false | none | none |
oneOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»» anonymous | false | none | A configuration value that is expressed as an integer. | |
»»»» value | integer | false | none | none |
»»»» default_value | integer | false | none | The default value for the configuration. |
»»»» max_value | integer | false | none | A hint of maximum allowed value |
»»»» min_value | integer | false | none | A hint for minimum allowed value |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»» anonymous | false | none | none | |
»»»» value | boolean | false | none | none |
»»»» default_value | boolean | false | none | The default value for the configuration. |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»» anonymous | false | none | A configuration value that is expressed as a string. Either value or redacted_value is present | |
»»»» value | string | false | none | the value of this string configuration |
»»»» redacted_value | string | false | none | the real value of this configuration key is not present because it is a private key or password. The value of this string will give an indication of the redacted value. |
»»»» default_value | string | false | none | The default value for the configuration. |
»»»» allowed_values | [string] | false | none | if present this array has a list of the allowed values |
»»»» type_hint | string | false | none | if present, this type hint denotes this configuration value to contain a special type of value, so the UI can do additional verification to ensure the user input matches this type |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»» anonymous | false | none | This is a configuration value for which the backed does have no information. This is likely a custom configuration key that a user manually entered or a configuration value that is a result from a downgrade and is only present in newer Access Server versions. | |
»»»» value | string | false | none | none |
Enumerated Values
Property | Value |
---|---|
derived_from | default |
derived_from | local_db |
derived_from | cluster_db |
derived_from | mysql_standalone_db |
derived_from | as_conf |
derived_from | environment |
derived_from | runtime |
derived_from | other |
type | custom |
type | integer |
type | boolean |
type | string |
category | deprecated |
category | removed |
category | normal |
category | required |
category | derived |
category | advanced |
category | custom |
type_hint | ipv4Address |
type_hint | ipv6Address |
type_hint | ipAddress |
type_hint | hostname |
type_hint | pemCertificate |
type_hint | pemPrivateKey |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{ "data": "string", "url": "http://example.com" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/helper/get-saml-configuration', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "configuration_items": [ { "name": "vpn.server.cipher", "derived_from": "default", "type": "custom", "description": "string", "category": "deprecated", "value": 0, "default_value": 0, "max_value": 0, "min_value": 0 } ] }
{ "message": "Insufficient privileges to use this API" }
certificate
APIs related to certificate management like parsing a certificate or querying information about a certificate
post__certificate_create
Body parameter
{ "algorithm": "secp384r1", "common_name": "my shiny new CA", "cert_template": "spcert", "days_to_expiry": 365, "private_key_passphrase": "string", "signing_ca": "string", "subj_alt_dns_names": [ "vpn-server.example.com" ], "signing_ca_key": "string", "signing_ca_config_key": null, "signing_ca_private_key_passphrase": "string" }
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Certificate has been generated. | Inline | |
400 | there was some error while trying to generate the certificate | ||
403 | only admin users are allowed to use this API |
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none |
standard response when there insufficient rights to use an API.
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» certificate | false | none | An PEM encoded certificate. This the certificate representation that starts with —–BEGIN CERTIFICATE—– followed by base64 encoding and ends with —–END CERTIFICATE—– | |
» private_key | pemEncodedPrivateKey(pem) | false | none | An PEM encoded certificate. This the certificate representation that typically starts with —–BEGIN PRIVATE KEY—– followed by base64 encoding and ends with —–END PRIVATE KEY—– |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{ "algorithm": "secp384r1", "common_name": "my shiny new CA", "cert_template": "spcert", "days_to_expiry": 365, "private_key_passphrase": "string", "signing_ca": "string", "subj_alt_dns_names": [ "vpn-server.example.com" ], "signing_ca_key": "string", "signing_ca_config_key": null, "signing_ca_private_key_passphrase": "string" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/certificate/create', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "certificate": "string", "private_key": "string" }
{ "message": "Insufficient privileges to use this API" }
logs
Querying the log database of OpenVPN Access Server
getLogReports
Body parameter
{ "page_size": 0, "offset": 0, "sort_by": "asc", "order_by": "node", "filters": { "start_time": { "start_relative": "20d", "end_relative": "15d 20m" }, "timestamp": { "start_relative": "20d", "end_relative": "15d 20m" }, "duration": { "value": "20d", "operation": "less_than" }, "node": { "operation": "substring", "value": "vio" }, "username": { "operation": "substring", "value": "vio" }, "active": { "value": true }, "error": { "value": true }, "service": { "operation": "substring", "value": "vio" }, "virtual_ipv4_address": { "operation": "substring", "value": "vio" }, "bytes_sent": { "value": "20kb", "operation": "less_than" }, "bytes_received": { "value": "20kb", "operation": "less_than" }, "gui_version": { "operation": "substring", "value": "vio" }, "version": { "operation": "substring", "value": "vio" }, "platform": { "operation": "substring", "value": "vio" }, "anywhere": { "value": "bass", "fields": [] } } }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | log reports entries | Inline | |
400 | format of the filters is not valid | ||
403 | only admin users are allowed to use this API |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» records | false | none | none | |
»» timestamp | string(date-time) | true | none | record modification timestamp |
»» node | any | true | none | AS node that created the log report |
»» username | any | false | none | username that created the entry |
»» start_time | any | false | none | start time of the event or just time of the event if duration is missing |
»» duration | any | false | none | duration of the event in seconds |
»» service | string | false | none | the service of OpenVPN Access Server that created the event |
»» active | boolean | false | none | if the session is still active |
»» auth | boolean | false | none | whether authentication succeeded or not |
»» platform | any | false | none | the platform of the client. |
»» version | any | false | none | the version of the OpenVPN component that implement the OpenVPN protocol |
»» proto | string,null | false | none | the protocol being used |
»» gui_version | any | false | none | the IV_GUI version the client reported. |
»» real_address | string | false | none | the IP address the client is connected from |
»» server_port | integer | false | none | the server side port the client connects/connected to |
»» virtual_ipv4_address | string | false | none | the virtual or VPN address of the client |
»» virtual_ipv6_address | string | false | none | none |
»» session_id | string | false | none | internal session ID of the connection (this might be truncated) |
»» api_method | string | false | none | description of the API method that was called |
»» bytes_sent | integer | false | none | number of bytes sent |
»» bytes_received | integer | false | none | number of bytes received |
»» total_bytes | integer | false | none | total number of transferred bytes. (This seems and probably is redundant but currently we keep this as individual record in the backend database) |
»» error | string | false | none | error message on auth failure |
»» extra | string | false | none | service-specific data |
» total | integer | false | none | total number of profiles that match if pagination is not in effect, this matches the size of the provided array |
Enumerated Values
Property | Value |
---|---|
proto | tcp |
proto | udp |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{ "page_size": 0, "offset": 0, "sort_by": "asc", "order_by": "node", "filters": { "start_time": { "start_relative": "20d", "end_relative": "15d 20m" }, "timestamp": { "start_relative": "20d", "end_relative": "15d 20m" }, "duration": { "value": "20d", "operation": "less_than" }, "node": { "operation": "substring", "value": "vio" }, "username": { "operation": "substring", "value": "vio" }, "active": { "value": true }, "error": { "value": true }, "service": { "operation": "substring", "value": "vio" }, "virtual_ipv4_address": { "operation": "substring", "value": "vio" }, "bytes_sent": { "value": "20kb", "operation": "less_than" }, "bytes_received": { "value": "20kb", "operation": "less_than" }, "gui_version": { "operation": "substring", "value": "vio" }, "version": { "operation": "substring", "value": "vio" }, "platform": { "operation": "substring", "value": "vio" }, "anywhere": { "value": "bass", "fields": [] } } }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/log/reports', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "records": [ { "timestamp": "2019-08-24T14:15:22Z", "node": "vpn-12.example.com", "username": null, "start_time": null, "duration": null, "service": "WEB_ADMIN", "active": true, "auth": true, "platform": "android", "version": "2.6.11", "proto": "tcp", "gui_version": "de.blinkt.openvpn_0.7.48", "real_address": "1.2.7.8:23123", "server_port": 1194, "virtual_ipv4_address": "10.0.0.7", "virtual_ipv6_address": "fd00:f00f::b00f", "session_id": "gOB8vpI1MEr0vBnm", "api_method": "ConfigQuery", "bytes_sent": 0, "bytes_received": 0, "total_bytes": 0, "error": "LOCKOUT: user temporarily locked out due to multiple authentication failures", "extra": "string" } ], "total": 0 }
user
Userprop APIs that apply to managing users
post__userprop_mfa_generate-secret
Body parameter
{ "username": "niccolo@paganini.it", "reset_secret": true, "locked": true }
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Operation successfully finished. | Inline | |
403 | only admin users are allowed to use this API | ||
404 | user not found | None |
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
» username | body | false | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
» reset_secret | body | boolean | false | When set to false, a user that already has a token, the function will not generate a new secret. If not present, reset_secret is assumed to be false. |
» locked | body | boolean | false | When reset_locked is set to true, this will be set the newed locked status |
standard response when there insufficient rights to use an API.
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» totp_secret | string | false | none | the RFC 6238 TOTP secret to allow enrollment of the user. |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{ "username": "niccolo@paganini.it", "reset_secret": true, "locked": true }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/userprop/mfa/generate-secret', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "totp_secret": "string" }
{ "message": "Insufficient privileges to use this API" }
group
Userprop APIs that apply to managing groups
getgroupuserprops
Body parameter
{ "page_size": 0, "offset": 0, "sort_by": "asc", "order_by": "name", "filters": { "name": { "operation": "substring", "value": "vio" }, "admin": { "value": true }, "autologin": { "value": true }, "anywhere": { "value": "bass", "fields": [] } }, "enumerate_members": true, "groups": [ "string" ], "proplist": [ "string" ] }
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | false | none |
standard response when there insufficient rights to use an API.
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Success | Inline | |
400 | Some of the arguments are incorrect | ||
403 | only admin users are allowed to use this API |
Response Schema
Status Code 200
A list of all or subset of profiles
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» total | integer | false | none | total number of users that match if pagination is not in effect, this matches the size of the provided array |
» profiles | [allOf] | false | none | none |
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | false | none | This hold the attributes of the userprop that is not specifically handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - deny (boolean): If true cannot connect or login (prop_deny) - deny_web (boolean): If true cannot login to web (prop_deny_web) - compile (boolean): If true the type is ‘user_compile’ instead of ‘user_connect’. (user record also queried on nftables/iptables compile and not only on connect) - admin (boolean): user is admin (prop_superuser) - autologin (boolean): autologin profile generation is allowed by the user themselves (prop_autologin) - auth_method (string): the authentication method that will be used for the user. Maps to user_auth_type and default configuration etc. - cc_commands: custom OpenVPN directives that will imported for the user on the server side (prop_cc_cmds) - totp: specifies whether TOTP based MFA is required (prop_google_auth) - password_strength: password strength check is enforced when changing the password for local auth (prop_pwd_strength/cs.cws.pwd_strength) - allow_password_change (boolean): specifies if a user is allowed to change the password themselves when local auth is used (prop_pwd_change). If not set on users the global default server key cs.cws.pwd_change is used as default. Admins can always change user passwords (including their own). - reroute_gw (string): one of ‘disable’, ‘dns_only’, ‘global’ Disables redirection of the default route and/or DNS on the client. This does not block it on the backend, if blocking on the backend is required, access lists should be added in addition. Defaults to ‘global’ if not set. The setting global will follow the configuration key ‘vpn.client.routing.reroute_gw’.(prop_reroute_gw_override) - allow_generate_profiles (prop_autogenerate): allow users themselves to generate connection profiles | |
»»» name | string | false | none | the name of the user or group. |
»»» deny | false | none | This object describes a single user property value. If it is | |
»»»» value | any | true | none | the value that this property has. If inherited is false, this is identical to inheritedValue |
oneOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»»»» anonymous | string | false | none | none |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»»»» anonymous | boolean | false | none | none |
continued
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»»»» inherited | boolean | false | none | specifies if this value is inherited from an upper level if this |
»»»» inherited_source_type | string | false | none | describes where the inherited values comes. This can be from the default user properties (default) or from a global configuration settings or from a group If the property is explicitly set (ie inherited is false), this property indicates what the property would inherit from if inherit is false. |
»»»» inherited_source_name | string | false | none | for the inherited types where knowing the name of the source can be beneficial. Like the group name or in some cases the configuration key. If the property is explicitly set (ie inherited is false), this property indicates what the property would inherit from if inherit is false. |
»»» deny_web | false | none | This object describes a single user property value. If it is | |
»»» admin | false | none | This object describes a single user property value. If it is | |
»»» autologin | false | none | This object describes a single user property value. If it is | |
»»» auth_method | false | none | This object describes a single user property value. If it is | |
»»» cc_commands | false | none | This object describes a single user property value. If it is | |
»»» totp | false | none | This object describes a single user property value. If it is | |
»»» password_strength | false | none | This object describes a single user property value. If it is | |
»»» allow_password_change | false | none | This object describes a single user property value. If it is | |
»»» reroute_gw | false | none | This object describes a single user property value. If it is | |
»»» allow_generate_profiles | false | none | This object describes a single user property value. If it is | |
»»» bypass_subnets | [IPsubNet] | false | none | Subnets or hosts (represented subnet with a /32 or /128 netmask) that are installed as bypass routes on the client, i.e. that will bypass the VPN and use the normal non-VPN connection. |
»»»» ipv6 | boolean | false | none | whether this describes an IPv4 or an IPv6 subnet |
»»»» netip | string | false | none | the network IP address. |
»»»» prefix_length | integer | false | none | length of the prefix in CIDR notation |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | false | none | this describes properties that are only are present for groups and not for users | |
»»» members | [string] | false | none | list of all users that are members of this group. This property will be only be present if members of the group are enumerate_memberate is true in the groupRequestParameters |
»»» member_count | integer | false | none | the number of users that belong to this group. |
»»» subnets | [IPsubNet] | false | none | The subnets assigned to this group. This list will be a mixed list of IPv4 and IPv6 subnets. The backend userprops are group_subnets and group_subnets6 |
»»» dynamic_ranges | false | none | The dynamic ranges assigned to this group. This list will contain both IPv4 and IPv6 ranges. The backend userprops for this property are group_range and group_range6. | |
»»»» ipv6 | boolean | false | none | whether this describes an IPv4 or an IPv6 range |
»»»» first_ip | string | false | none | the start address of the IP range. |
»»»» last_ip | string | false | none | the end address of the IP range. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | false | none | This hold the attributes of the userprop that control client side scripting. It is not handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - Client side scripting: prop_cli.script.<win | |
»»» cli_script_connect_win_user_connect | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_win_user_disconnect | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_win_admin_connect | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_win_admin_disconnect | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_mac_user_connect | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_mac_user_disconnect | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_mac_admin_connect | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_mac_admin_disconnect | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_win_env | object | false | none | environment variables for the Windows script to run, each key will specify the name of the environment variable. |
»»»» additionalProperties | false | none | This object describes a single user property value. If it is | |
»»» cli_script_connect_mac_env | object | false | none | environment variables for the macOS script to run, each key will specify the name of the environment variable. |
»»»» additionalProperties | false | none | This object describes a single user property value. If it is |
Enumerated Values
Property | Value |
---|---|
inherited_source_type | default |
inherited_source_type | implicit_default |
inherited_source_type | group |
inherited_source_type | configuration |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
const inputBody = '{ "page_size": 0, "offset": 0, "sort_by": "asc", "order_by": "name", "filters": { "name": { "operation": "substring", "value": "vio" }, "admin": { "value": true }, "autologin": { "value": true }, "anywhere": { "value": "bass", "fields": [] } }, "enumerate_members": true, "groups": [ "string" ], "proplist": [ "string" ] }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/groups/list', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "message": "Insufficient privileges to use this API" }
{ "total": 0, "profiles": [ { "name": "string", "deny": {}, "deny_web": {}, "admin": {}, "autologin": {}, "auth_method": {}, "cc_commands": {}, "totp": {}, "password_strength": {}, "allow_password_change": {}, "reroute_gw": {}, "allow_generate_profiles": {}, "bypass_subnets": [], "members": [], "member_count": 0, "subnets": [], "dynamic_ranges": [], "cli_script_connect_win_user_connect": {}, "cli_script_connect_win_user_disconnect": {}, "cli_script_connect_win_admin_connect": {}, "cli_script_connect_win_admin_disconnect": {}, "cli_script_connect_mac_user_connect": {}, "cli_script_connect_mac_user_disconnect": {}, "cli_script_connect_mac_admin_connect": {}, "cli_script_connect_mac_admin_disconnect": {}, "cli_script_connect_win_env": {}, "cli_script_connect_mac_env": {} } ] }
misc
APIs that do not fit in any other category
get_server_config
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Successful operation |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
getCWSconfig
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Successful operation |
This operation does not require authentication
const headers = { 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/server/config', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "control_channel_security": "none", "installers": [ "win_v3" ], "hide_profiles_page": true, "password_min_len": 0, "disable_open_in_app": true, "admin_port": 0, "shared_origin": true }
const headers = { 'Accept':'application/json' }; fetch('/api/ui/config', { method: 'GET', headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "header_image": "string", "hide_footer": "string", "enabled_auth_methods": [ "saml", "userandpassword" ], "login_text": "Enter your TOTP Authentication code." }
maintainance
post__server_failover-test
Body parameter
{ "failover.mode": "ucarp", "ucarp.addr": "192.168.188.254", "ucarp.secret": "sharedsecret", "dbpush.hosts.0.enable": "true", "dbpush.hosts.0.public": "grace.hopper", "dbpush.hosts.0.internal": "PRIMARY", "dbpush.hosts.0.username": "root", "dbpush.hosts.1.enable": "true", "dbpush.hosts.1.public": "ada.lovelace", "dbpush.hosts.1.internal": "SECONDARY", "dbpush.hosts.1.username": "root", "dbpush.hosts.1.password": "", "dbpush.hosts.1.ssh_port": "22" }
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Results of the failoover test. | ||
400 | Failover test initialisation failed. | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | object | false | none |
» additionalProperties | body | string | false | none |
standard response when there insufficient rights to use an API.
post__server_failover-init
Body parameter
null
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | Secondary node setup was successful. | None | |
400 | Something went wrong during secondary node setup | ||
403 | only admin users are allowed to use this API |
To perform this operation, you must be authenticated by means of one of the following methods: AuthToken
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | any | false | none |
standard response when there insufficient rights to use an API.
const inputBody = '{ "failover.mode": "ucarp", "ucarp.addr": "192.168.188.254", "ucarp.secret": "sharedsecret", "dbpush.hosts.0.enable": "true", "dbpush.hosts.0.public": "grace.hopper", "dbpush.hosts.0.internal": "PRIMARY", "dbpush.hosts.0.username": "root", "dbpush.hosts.1.enable": "true", "dbpush.hosts.1.public": "ada.lovelace", "dbpush.hosts.1.internal": "SECONDARY", "dbpush.hosts.1.username": "root", "dbpush.hosts.1.password": "", "dbpush.hosts.1.ssh_port": "22" }'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/server/failover-test', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "ucarp": { "friendly": "string", "status": true, "message": "string" }, "license_primary": { "friendly": "string", "status": true, "message": "string" }, "license_secondary": { "friendly": "string", "status": true, "message": "string" }, "connectivity": { "friendly": "string", "status": true, "message": "string" } }
{ "message": "Insufficient privileges to use this API" }
const inputBody = 'null'; const headers = { 'Content-Type':'application/json', 'Accept':'application/json', 'X-OpenVPN-As-AuthToken':'API_KEY' }; fetch('/api/server/failover-init', { method: 'POST', body: inputBody, headers: headers }) .then(function(res) { return res.json(); }).then(function(body) { console.log(body); });
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
{ "message": "Insufficient privileges to use this API" }
Schemas
WebsiteConfig
Provides the information about the website personality and other web-site wide configuration that must be available without authentication
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
header_image | string,null | false | none | An URI to an alternative header image that is customised. If not present use default logo |
hide_footer | string,null | false | none | If true then hide footer |
enabled_auth_methods | [string] | true | none | A list of enabled authentication methods. UI should only offer enabled methods. These are NOT the backend methods but rather the ways of providing credentials regardless of the backend authentication method. The userandpasswordwithmfa method will provide the user with username, password and TOTP field for the login to make allow entering both factors in one step instead of two. |
login_text | string,null | false | none | Alternative login text. |
profileType
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | none |
Enumerated Values
Property | Value |
---|---|
anonymous | autologin |
anonymous | userlogin |
anonymous | generic |
anonymous | epki-generic |
username
a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API |
groupname
a group name that is being in used in user management to specify a group name.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | a group name that is being in used in user management to specify a group name. |
installerType
Type of the installer binary that should be created for installation.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | Type of the installer binary that should be created for installation. |
Enumerated Values
Property | Value |
---|---|
anonymous | win_v3 |
anonymous | mac_v3 |
anonymous | win |
anonymous | mac |
anonymous | ios |
anonymous | android |
anonymous | linux |
certProfileSorting
specifies by which attribute profiles should be sorted
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | specifies by which attribute profiles should be sorted |
Enumerated Values
Property | Value |
---|---|
anonymous | serial |
anonymous | username |
anonymous | not_before |
anonymous | type |
anonymous | not_after |
anonymous | tls_crypt_v2 |
anonymous | last_used |
anonymous | algorithm |
userSorting
specifies by which attribute profiles should be sorted
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | specifies by which attribute profiles should be sorted |
Enumerated Values
Property | Value |
---|---|
anonymous | admin |
anonymous | name |
anonymous | autologin |
anonymous | group |
groupSorting
specifies by which attribute groups should be sorted
Properties
None
logDBSortingFields
Enum representing valid sorting fields for LogDB.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | Enum representing valid sorting fields for LogDB. |
Enumerated Values
Property | Value |
---|---|
anonymous | node |
anonymous | username |
anonymous | service |
anonymous | duration |
anonymous | active |
anonymous | virtual_ipv4_address |
anonymous | bytes_received |
anonymous | bytes_sent |
anonymous | timestamp |
anonymous | error |
anonymous | version |
anonymous | gui_version |
anonymous | platform |
sortingDirection
The direction of sorting
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | The direction of sorting |
Enumerated Values
Property | Value |
---|---|
anonymous | asc |
anonymous | desc |
UserCertProfile
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | A profile for a user. |
» device_id | string,null | false | none | Device ID, only used for server-locked v1 profiles |
» comment | string,null | false | none | A user-defined comment |
» profile_type | false | none | none | |
» tls_crypt_v2 | boolean | false | none | This profile uses tls-crypt-v2 |
» last_used | string,null(date) | false | none | Last date this profile was used (only date is known, there is no more granular resolution) |
» username | string | false | none | User’s name |
usertype
type of the user
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | type of the user |
Enumerated Values
Property | Value |
---|---|
anonymous | admin |
anonymous | user |
userproperties
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
requires_mfa_enrollment | boolean | true | none | if present, this user needs to finish MFA enrollment |
user_type | false | none | type of the user | |
mfa_secret | string | false | none | This is an optional field that is only visible if the user has not enrolled yet or is an admin user. |
allowed_profiles | false | none | A list of profiles types allowed for the user. Sorted by preference. | |
enforce_strong_passwords | boolean | false | none | If true, than checking for strong password is required. |
allow_password_change | boolean | false | none | Indicates whether password change is allowed for the user. |
MFAChallenge
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
echo | boolean | true | none | If true, the entered code should be displayed in cleartext. Otherwise masked like a password. |
challenge | string | true | none | The text presented to the user when asking for the challenge. |
challenge_context | string | true | none | Often authentication backends require the challenge to be answered in the same session as the initial user/password. This allows tying the MFA answer to the initial authentication attempt. |
MFAResponse
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
response | string(password) | false | none | the user’s response to the MFA challenge |
challenge_context | string | false | none | The challenge context that was in the MFAChallenge. |
username | string | true | none | The user name for login |
certificateSerial
A serial number representing a certificate or profile. Note, this API uses strings for the certificate serial numbers instead of integers as JavaScript is unable to (easily) handle anything larger than 52 bit integers due to its nature to represent all numbers as double.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string(int64) | false | none | A serial number representing a certificate or profile. Note, this API uses strings for the certificate serial numbers instead of integers as JavaScript is unable to (easily) handle anything larger than 52 bit integers due to its nature to represent all numbers as double. |
certificateCommonName
The common name of the certificate.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string,null | false | none | The common name of the certificate. |
userAndPwLogin
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
username | string | true | none | The user name for login. Note that if this is case-sensitive or not depends on the OpenVPN Access Server configuration. |
password | string | true | none | The password for login in clear text |
totp | string | false | none | Optional TOTP token for the user when wishing to do all MFA credentials in one go |
samlLogin
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
assertion | string(xml) | true | none | SAML Assertion in xml format , encoded as base64-string |
relay_state | string | false | none | Optional relay state identifying the type of SAML request. If not passed or empty, defaults to cws |
loginResponse
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» user_properties | false | none | none | |
» username | string | true | none | username of the authenticated user |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | none |
authTokenResponse
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
auth_token | string | true | none | An opaque token that is used to access protected APIs |
expires_after | string(%a %b %d %Y %-H:%-M:%-S GMT%z (%Z)) | true | none | date in UTC when token expires |
renewable_until | string(%a %b %d %Y %-H:%-M:%-S GMT%z (%Z)) | true | none | date in UTC when the token is no longer renewable |
profileDeleteCode
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | integer | false | none | none |
Enumerated Values
Property | Value |
---|---|
anonymous | {“204”:null,“description”:“profile successfully deleted”} |
anonymous | {“404”:null,“description”:“profile to be deleted was not found”} |
anonymous | {“403”:null,“description”:“profile to be deleted is not owned by the user or another error”} |
clientReason
the reason given to the client why it is being disconnected.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | the reason given to the client why it is being disconnected. |
adminReason
The reason that will be logged why a client was disconnected
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | The reason that will be logged why a client was disconnected |
vpnConnectionID
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
daemon_id | true | none | an ID that identifies the OpenVPN daemon that the client is connected to | |
client_id | true | none | the client ID of the connected client. This ID is only unique for a specific daemonId. Or with other words, only daemonID and clientID together uniquely identify a client. |
errorReason
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
reason | string | true | none | a user-friendly message of reason of API failure, allowed to be displayed |
title | string | false | none | a title describing the error message |
errorReasonDetail
an errorReason that has been extended to provide specific errors for specific fields. The references are dependent on the fields used in the query. E.g. when setting configuration keys the detail keys are the fields trying to be set.
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» detail | object | false | none | errorReasons that specify the errorReason for a specific sub object |
»» additionalProperties | false | none | none |
configurationProfile
This is the configuration profile name. A typical access server uses the DEFAULT profile as the normal profile. Multiple profiles can be used to make a backup or to first edit an inactive profile and then apply all changes at once.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | This is the configuration profile name. A typical access server uses the DEFAULT profile as the normal profile. Multiple profiles can be used to make a backup or to first edit an inactive profile and then apply all changes at once. |
certificateAlgorithm
This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072).
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072). |
certificateType
The type of certificate.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | The type of certificate. |
Enumerated Values
Property | Value |
---|---|
anonymous | ca |
anonymous | old_ca |
anonymous | cross_ca |
anonymous | client |
certificateDetails
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
serial | true | none | A serial number representing a certificate or profile. Note, this API uses strings for the certificate serial numbers instead of integers as JavaScript is unable to (easily) handle anything larger than 52 bit integers due to its nature to represent all numbers as double. | |
common_name | true | none | The common name of the certificate. | |
algorithm | true | none | This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072). | |
not_before | string(date-time) | true | none | Earliest time the certificate is valid |
not_after | string(date-time) | true | none | Latest time the certificate is valid |
self_signed | boolean | false | none | Whether this certificate is self-signed. Typically only root CA certificates are self-signed. |
signing_ca | string(int64) | false | none | The certificate authority that has signed this certificate. For self-signed certificate authorities this value is absent. This attribute is only present for certificates that are managed by the internal PKI of Access Server and the APIs that deal and return information about these. This is also represented as a string rather than integer to avoid problems with JavaScript numbers always being double. |
signing_ca_cn | string | false | none | The common name of certificate authority that has signed this certificate. For self-signed certificate authorities this value is absent. This attribute is only present for certificates that are managed by the internal PKI of Access Server and the APIs that deal and return information about these. |
certificateInformationDetails
Provides more information about a certificate
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» sha256fp | false | none | The SHA256 hash of the certificate body, also known as the fingerprint of the certificate. | |
» subj_alt_names | [string] | false | none | provides a list of the subjectAlternative attributes of the certificate |
» subject | [string] | false | none | the full subject of the certificate and not only the CN |
» ca | boolean | false | none | Whether the certificate represents a certificate authority |
» self_signed | boolean | false | none | the signature of the certificate is valid against its own public key |
certificateAuthorityDetails
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» cert_type | true | none | The type of certificate. | |
» client_profiles | integer | true | none | the number of VPN client profiles are issued by this CA. |
certificateCreateRequest
A request to generate a certificate and sign it. If the signing_ca and its private key are provided (via signing_ca_key OR signing_ca_config_key) the generated certificate will signed by the CA, otherwise the certificate will be self-signed.
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» cert_template | string | true | none | the template to use when creating the certificate. This mainly controls the key usage (KU) and extend key usage (EKU) attributes of the certificate |
» days_to_expiry | integer | false | none | number of days while certificate is considered valid |
» private_key_passphrase | string | false | none | passhprase for the certificate’s private key |
» signing_ca | false | none | An PEM encoded certificate. This the certificate representation that starts with —–BEGIN CERTIFICATE—– followed by base64 encoding and ends with —–END CERTIFICATE—– | |
» subj_alt_dns_names | [string] | false | none | a list of DNS names that should be added as SubjectAlternativeName DNSJake in the certificate if the cert_template is webserver. |
» signing_ca_key | false | none | An PEM encoded certificate. This the certificate representation that typically starts with —–BEGIN PRIVATE KEY—– followed by base64 encoding and ends with —–END PRIVATE KEY—– | |
» signing_ca_config_key | any | false | none | the name of a configuration key (e.g. cs.priv.key) that will be used to check the certificate validity |
» signing_ca_private_key_passphrase | string | false | none | passhprase for signing CA’s private key |
Enumerated Values
Property | Value |
---|---|
cert_template | spcert |
cert_template | ca |
cert_template | intermediate_ca |
cert_template | webserver |
cert_template | server |
cert_template | client |
cert_template | hybrid |
certificateRequest
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
algorithm | false | none | This specifies the algorithm to use a for a private/public keypair for X509 certificate generation. This is a identifier of the algorithm like ecp384r1, secp256r1 or secp512r1. For algorithm with variable key length the length is appended to the algorithm (e.g. rsa3072). | |
common_name | false | none | The common name of the certificate. |
integerConfigurationValue
A configuration value that is expressed as an integer.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
value | integer | false | none | none |
default_value | integer | false | none | The default value for the configuration. |
max_value | integer | false | none | A hint of maximum allowed value |
min_value | integer | false | none | A hint for minimum allowed value |
stringConfigurationValue
A configuration value that is expressed as a string. Either value or redacted_value is present
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
value | string | false | none | the value of this string configuration |
redacted_value | string | false | none | the real value of this configuration key is not present because it is a private key or password. The value of this string will give an indication of the redacted value. |
default_value | string | false | none | The default value for the configuration. |
allowed_values | [string] | false | none | if present this array has a list of the allowed values |
type_hint | string | false | none | if present, this type hint denotes this configuration value to contain a special type of value, so the UI can do additional verification to ensure the user input matches this type |
Enumerated Values
Property | Value |
---|---|
type_hint | ipv4Address |
type_hint | ipv6Address |
type_hint | ipAddress |
type_hint | hostname |
type_hint | pemCertificate |
type_hint | pemPrivateKey |
booleanConfigurationValue
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
value | boolean | false | none | none |
default_value | boolean | false | none | The default value for the configuration. |
customConfigurationValue
This is a configuration value for which the backed does have no information. This is likely a custom configuration key that a user manually entered or a configuration value that is a result from a downgrade and is only present in newer Access Server versions.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
value | string | false | none | none |
configurationValueSource
the source that the current values has be derived from.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | the source that the current values has be derived from. |
Enumerated Values
Property | Value |
---|---|
anonymous | default |
anonymous | local_db |
anonymous | cluster_db |
anonymous | mysql_standalone_db |
anonymous | as_conf |
anonymous | environment |
anonymous | runtime |
anonymous | other |
configurationItemKey
the configuration value’s key.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | the configuration value’s key. |
configurationItem
This represents a configuration item in the server configuration profile. To determine if this item has been user-set or not, check the value of derived_from.
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» name | true | none | the configuration value’s key. | |
» derived_from | true | none | the source that the current values has be derived from. | |
» type | string | false | none | Determines the value type of this configuration item. This also implies which of the different value attributes are expected to be present on this configuration item. |
» description | string | false | none | A user readable description of the configuration item that gives a user an understandable. This item can be absent for custom configuration values. |
» category | string | true | none | Different items have different visibility/category that should be taken into account when presenting them to the user. This key informs the UI if a variable is deprecated but still evaluated (deprecated), deprecated and removed (removed), normal, advanced (a value that for normal operation of OpenVPN Access Server should need to be changed as it is typically reserved for some corner-case or speciality configurations) or is a calculated value that is readonly as it is calculated from other configuration items but is not modifiable by the user (derived). Items that have a type of required often do not have a default value but must be set in order for Access to correctly work (e.g. host.name). Removed values should be only shown by the UI if the are set by the user. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | any | false | none | none |
oneOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | false | none | A configuration value that is expressed as an integer. |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | false | none | none |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | false | none | A configuration value that is expressed as a string. Either value or redacted_value is present |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | false | none | This is a configuration value for which the backed does have no information. This is likely a custom configuration key that a user manually entered or a configuration value that is a result from a downgrade and is only present in newer Access Server versions. |
Enumerated Values
Property | Value |
---|---|
type | custom |
type | integer |
type | boolean |
type | string |
category | deprecated |
category | removed |
category | normal |
category | required |
category | derived |
category | advanced |
category | custom |
pemEncodedCertificate
An PEM encoded certificate. This the certificate representation that starts with —–BEGIN CERTIFICATE—– followed by base64 encoding and ends with —–END CERTIFICATE—–
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string(pem) | false | none | An PEM encoded certificate. This the certificate representation that starts with —–BEGIN CERTIFICATE—– followed by base64 encoding and ends with —–END CERTIFICATE—– |
pemEncodedPrivateKey
An PEM encoded certificate. This the certificate representation that typically starts with —–BEGIN PRIVATE KEY—– followed by base64 encoding and ends with —–END PRIVATE KEY—–
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string(pem) | false | none | An PEM encoded certificate. This the certificate representation that typically starts with —–BEGIN PRIVATE KEY—– followed by base64 encoding and ends with —–END PRIVATE KEY—– |
certificateFingerprint
The SHA256 hash of the certificate body, also known as the fingerprint of the certificate.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string(sha256) | false | none | The SHA256 hash of the certificate body, also known as the fingerprint of the certificate. |
apiEndpoint
the API endpoint to specifically address a node. Requires format https:ip/hostname:port. Note that https is necessary because certificateFingerprint is used by https client to verify it is indeed talking to the right node.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | the API endpoint to specifically address a node. Requires format https:ip/hostname:port. Note that https is necessary because certificateFingerprint is used by https client to verify it is indeed talking to the right node. |
restartMode
the requested mode to restart AS. - Warm will only restart the internal services that are needed to be restarted - cold will restart OpenVPN Access Server completely - systemctl instruct OpenVPN Access Server to initiate a restart via systemd/systemctl - server_agent instruct OpenVPN Access Server to initiate a full reinit of the server agent, including re-reading the configuration in as.conf. If we don’t need to re-read the configuration from a new DB URI (e.g. after converting the DB or creating a cluster) - ‘cold’ should generally be enough, as it will revalidate the individual services’ need to reinit, based on the information in the DB being used at that moment.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | the requested mode to restart AS. - Warm will only restart the internal services that are needed to be restarted - cold will restart OpenVPN Access Server completely - systemctl instruct OpenVPN Access Server to initiate a restart via systemd/systemctl - server_agent instruct OpenVPN Access Server to initiate a full reinit of the server agent, including re-reading the configuration in as.conf. If we don’t need to re-read the configuration from a new DB URI (e.g. after converting the DB or creating a cluster) - ‘cold’ should generally be enough, as it will revalidate the individual services’ need to reinit, based on the information in the DB being used at that moment. |
Enumerated Values
Property | Value |
---|---|
anonymous | cold |
anonymous | warm |
anonymous | dry_run |
anonymous | systemctl |
anonymous | server_agent |
connectedVPNClient
a connected VPN client with the current information about this client
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» bytes_sent | integer | false | none | number of bytes sent |
» bytes_received | integer | false | none | number of bytes received |
» commonname | string | false | none | the common name the client uses in its certificate. |
» username | string | false | none | username of the client |
» connected_since | string(date-time) | false | none | time in UTC since when the client is connected. |
» datachannel_cipher | string | false | none | the data channel cipher that is used with this client. |
» real_address | string | false | none | the IP address the client is connected from |
» virtual_ipv4_address | string | false | none | the virtual or VPN address of the client |
» virtual_ipv6_address | string | false | none | none |
clientID
the client ID of the connected client. This ID is only unique for a specific daemonId. Or with other words, only daemonID and clientID together uniquely identify a client.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | integer | false | none | the client ID of the connected client. This ID is only unique for a specific daemonId. Or with other words, only daemonID and clientID together uniquely identify a client. |
daemonID
an ID that identifies the OpenVPN daemon that the client is connected to
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | an ID that identifies the OpenVPN daemon that the client is connected to |
vpnDaemonStatus
status of a VPN daemon
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
dco | boolean | false | none | if DCO is used on this daemon instance |
version | string | false | none | the OpenVPN 2.x version of the daemon |
dcoModuleStatus
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
available | boolean | true | none | whether AS detected an installed and working data channel offloading kernel module |
version | string | true | none | version of the module if available |
logDBRecord
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
timestamp | string(date-time) | true | none | record modification timestamp |
node | any | true | none | AS node that created the log report |
username | any | false | none | username that created the entry |
start_time | any | false | none | start time of the event or just time of the event if duration is missing |
duration | any | false | none | duration of the event in seconds |
service | string | false | none | the service of OpenVPN Access Server that created the event |
active | boolean | false | none | if the session is still active |
auth | boolean | false | none | whether authentication succeeded or not |
platform | any | false | none | the platform of the client. |
version | any | false | none | the version of the OpenVPN component that implement the OpenVPN protocol |
proto | string,null | false | none | the protocol being used |
gui_version | any | false | none | the IV_GUI version the client reported. |
real_address | string | false | none | the IP address the client is connected from |
server_port | integer | false | none | the server side port the client connects/connected to |
virtual_ipv4_address | string | false | none | the virtual or VPN address of the client |
virtual_ipv6_address | string | false | none | none |
session_id | string | false | none | internal session ID of the connection (this might be truncated) |
api_method | string | false | none | description of the API method that was called |
bytes_sent | integer | false | none | number of bytes sent |
bytes_received | integer | false | none | number of bytes received |
total_bytes | integer | false | none | total number of transferred bytes. (This seems and probably is redundant but currently we keep this as individual record in the backend database) |
error | string | false | none | error message on auth failure |
extra | string | false | none | service-specific data |
Enumerated Values
Property | Value |
---|---|
proto | tcp |
proto | udp |
licenseInfo
fields that are common to licensing options and the licensing method that currently in. Will also contain additional fields depending on the licensing_type in use.
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» licensing_type | string | false | none | the method that Access Server is licensed |
» current_cc | integer | false | none | the number of current concurrent connections |
» max_cc | integer | false | none | the maximum amount of connections that this license allows to use. For license types are single node (aws, fixed, unlicensed) this is also the limit for all connections. For shared licenses (subscription) this denotes the total number of connections in the subscription and the current number of allocated connection for an Access Server is denoted in cc_limit. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | any | false | none | none |
oneOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | false | none | describes the current licensing information about OpenVPN Access Server. An OpenVPN Access Server can have multiple fixed licenses assigned to it and allowed connections of all the valid (not expired) licenses are summed up. |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | false | none | none |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | false | none | (dummy) information when AS is not currently licensed |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | false | none | none |
Enumerated Values
Property | Value |
---|---|
licensing_type | unlicensed |
licensing_type | subscription |
licensing_type | awstiered |
licensing_type | fixed |
unlicensedInfo
(dummy) information when AS is not currently licensed
Properties
None
fixedLicenseInfo
describes the current licensing information about OpenVPN Access Server. An OpenVPN Access Server can have multiple fixed licenses assigned to it and allowed connections of all the valid (not expired) licenses are summed up.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
fixed_licenses | [object] | false | none | none |
» expiry | string(date-time) | false | none | expiry date of the license. |
» key | string | false | none | the key of the fixed license |
» max_cc | integer | false | none | maximum amount of connection for this fixed license. |
awsTieredLicenseInfo
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
region | string | false | none | the AWS region |
product_code | string | false | none | the AWS product code that identifies this license |
instance_id | string | false | none | the AWS instance ID |
subscriptionInfo
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
agent_id’ | string | false | none | the identifier the client uses to connect to STS |
agent_disabled | boolean | false | none | none |
cc_limit | integer | false | none | the limit of connection assigned to the Access Server. This can dynamically change. |
error | string,null | false | none | if an error occurred this will be set to a human-readable error message |
fallback_cc’ | integer | false | none | the amount of connection that the subscription will revert to if the subscription server cannot be reached for an extended time (grace_period) |
grace_period | integer | false | none | number of days after which the subscription will revert to fallback_cc amount of connections |
last_successful_update | string(date-time) | false | none | the last time the subscription was successfully updated |
total_cc | integer | false | none | the total number of current connections for the subscription over all Access Server that use this subscription. Basically the current_cc of all OpenVPN Access Server using this subscription summed up. |
name | string | false | none | A name given to the subscription. |
subkey | string | false | none | The subkey that uniquely identifies the subscription on the backend. |
billing_id | string | false | none | An opaque identifier that allows identifying the subscription on the billing portal. |
next_update | string(date-time) | false | none | when the next update to the subscription server is scheduled |
updates_failed | integer | false | none | the number of updates that failed since the last successful update. |
notes | [string] | false | none | both server generated and locally generated additional notes to display to the user |
overdraft | boolean | false | none | Subscription is currently in overdraft mode |
server | string | false | none | the server that is used to for subscription tracking |
type | string | false | none | Type of the subscription as reported by the STS server |
state | string | false | none | the current state of the subscription agent |
Enumerated Values
Property | Value |
---|---|
state | SUBSCRIPTION_OK |
state | SUBSCRIPTION_EXPIRED |
state | NOT_CONFIGURED |
state | AGENT_DISABLED |
state | SUBSCRIPTION_INVALID |
state | SUBSCRIPTION_ENDED |
state | SUBSCRIPTION_PAUSED |
state | STSTRACK_ERROR |
state | REQUEST_ERROR |
profileToken
this represent a (typically one-time) token that can be used to retrieve a profile from Access Server
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
token | string | false | none | the unique string that identifies the token |
username | string | false | none | the username this token will generate the profile for |
expires | string(date-time) | false | none | the token is only valid until this time |
profile_type | false | none | none | |
usages | integer | false | none | how often this token can be used to retrieve a profile |
userPropUser
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | This hold the attributes of the userprop that is not specifically handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - deny (boolean): If true cannot connect or login (prop_deny) - deny_web (boolean): If true cannot login to web (prop_deny_web) - compile (boolean): If true the type is ‘user_compile’ instead of ‘user_connect’. (user record also queried on nftables/iptables compile and not only on connect) - admin (boolean): user is admin (prop_superuser) - autologin (boolean): autologin profile generation is allowed by the user themselves (prop_autologin) - auth_method (string): the authentication method that will be used for the user. Maps to user_auth_type and default configuration etc. - cc_commands: custom OpenVPN directives that will imported for the user on the server side (prop_cc_cmds) - totp: specifies whether TOTP based MFA is required (prop_google_auth) - password_strength: password strength check is enforced when changing the password for local auth (prop_pwd_strength/cs.cws.pwd_strength) - allow_password_change (boolean): specifies if a user is allowed to change the password themselves when local auth is used (prop_pwd_change). If not set on users the global default server key cs.cws.pwd_change is used as default. Admins can always change user passwords (including their own). - reroute_gw (string): one of ‘disable’, ‘dns_only’, ‘global’ Disables redirection of the default route and/or DNS on the client. This does not block it on the backend, if blocking on the backend is required, access lists should be added in addition. Defaults to ‘global’ if not set. The setting global will follow the configuration key ‘vpn.client.routing.reroute_gw’.(prop_reroute_gw_override) - allow_generate_profiles (prop_autogenerate): allow users themselves to generate connection profiles |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | this describes the properties that are only allowed on the user level itself are not inheritable from other levels |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | This hold the attributes of the userprop that control client side scripting. It is not handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - Client side scripting: prop_cli.script.<win |
userPropUserSet
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | The same as userProp schema. With the difference that it used solely for setting user properties. This means that all fields here is set directly, instead of wraping them in userPropValue object. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | this describes the properties that are only allowed on the user level itself are not inheritable from other levels |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | The same as userPropScripts schema. With the diffirence that it is used solely for setting user properties. This means that all fields here is set directly, instead of wraping them in userPropValue object. |
userPropGroup
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | This hold the attributes of the userprop that is not specifically handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - deny (boolean): If true cannot connect or login (prop_deny) - deny_web (boolean): If true cannot login to web (prop_deny_web) - compile (boolean): If true the type is ‘user_compile’ instead of ‘user_connect’. (user record also queried on nftables/iptables compile and not only on connect) - admin (boolean): user is admin (prop_superuser) - autologin (boolean): autologin profile generation is allowed by the user themselves (prop_autologin) - auth_method (string): the authentication method that will be used for the user. Maps to user_auth_type and default configuration etc. - cc_commands: custom OpenVPN directives that will imported for the user on the server side (prop_cc_cmds) - totp: specifies whether TOTP based MFA is required (prop_google_auth) - password_strength: password strength check is enforced when changing the password for local auth (prop_pwd_strength/cs.cws.pwd_strength) - allow_password_change (boolean): specifies if a user is allowed to change the password themselves when local auth is used (prop_pwd_change). If not set on users the global default server key cs.cws.pwd_change is used as default. Admins can always change user passwords (including their own). - reroute_gw (string): one of ‘disable’, ‘dns_only’, ‘global’ Disables redirection of the default route and/or DNS on the client. This does not block it on the backend, if blocking on the backend is required, access lists should be added in addition. Defaults to ‘global’ if not set. The setting global will follow the configuration key ‘vpn.client.routing.reroute_gw’.(prop_reroute_gw_override) - allow_generate_profiles (prop_autogenerate): allow users themselves to generate connection profiles |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | this describes properties that are only are present for groups and not for users |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | This hold the attributes of the userprop that control client side scripting. It is not handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - Client side scripting: prop_cli.script.<win |
userPropGroupSet
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | The same as userProp schema. With the difference that it used solely for setting user properties. This means that all fields here is set directly, instead of wraping them in userPropValue object. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | this describes properties that are only are present for groups and not for users |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | The same as userPropScripts schema. With the diffirence that it is used solely for setting user properties. This means that all fields here is set directly, instead of wraping them in userPropValue object. |
userPropUserDefault
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | This hold the attributes of the userprop that is not specifically handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - deny (boolean): If true cannot connect or login (prop_deny) - deny_web (boolean): If true cannot login to web (prop_deny_web) - compile (boolean): If true the type is ‘user_compile’ instead of ‘user_connect’. (user record also queried on nftables/iptables compile and not only on connect) - admin (boolean): user is admin (prop_superuser) - autologin (boolean): autologin profile generation is allowed by the user themselves (prop_autologin) - auth_method (string): the authentication method that will be used for the user. Maps to user_auth_type and default configuration etc. - cc_commands: custom OpenVPN directives that will imported for the user on the server side (prop_cc_cmds) - totp: specifies whether TOTP based MFA is required (prop_google_auth) - password_strength: password strength check is enforced when changing the password for local auth (prop_pwd_strength/cs.cws.pwd_strength) - allow_password_change (boolean): specifies if a user is allowed to change the password themselves when local auth is used (prop_pwd_change). If not set on users the global default server key cs.cws.pwd_change is used as default. Admins can always change user passwords (including their own). - reroute_gw (string): one of ‘disable’, ‘dns_only’, ‘global’ Disables redirection of the default route and/or DNS on the client. This does not block it on the backend, if blocking on the backend is required, access lists should be added in addition. Defaults to ‘global’ if not set. The setting global will follow the configuration key ‘vpn.client.routing.reroute_gw’.(prop_reroute_gw_override) - allow_generate_profiles (prop_autogenerate): allow users themselves to generate connection profiles |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | this describes properties that are only are present for groups and not for users |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | This hold the attributes of the userprop that control client side scripting. It is not handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - Client side scripting: prop_cli.script.<win |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» group | string | false | none | the group a user belongs too (conn_group) |
userPropUserDefaultSet
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | The same as userProp schema. With the difference that it used solely for setting user properties. This means that all fields here is set directly, instead of wraping them in userPropValue object. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | this describes properties that are only are present for groups and not for users |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | This hold the attributes of the userprop that control client side scripting. It is not handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions. - Client side scripting: prop_cli.script.<win |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» group | string | false | none | the group a user belongs too (conn_group) |
defaultUserOnlyProps
this describes properties that are only are present for groups and not for users
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
def_deny | boolean | false | none | If this is set to true user accounts will not be created if they are not listed in userprop. Normally, if an external auth is used (e.g. LDAP), then a user will automatically create if the external authentication system indicates a successful login. |
groupLevelOnlyProps
this describes properties that are only are present for groups and not for users
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
members | [string] | false | none | list of all users that are members of this group. This property will be only be present if members of the group are enumerate_memberate is true in the groupRequestParameters |
member_count | integer | false | none | the number of users that belong to this group. |
subnets | [IPsubNet] | false | none | The subnets assigned to this group. This list will be a mixed list of IPv4 and IPv6 subnets. The backend userprops are group_subnets and group_subnets6 |
dynamic_ranges | false | none | The dynamic ranges assigned to this group. This list will contain both IPv4 and IPv6 ranges. The backend userprops for this property are group_range and group_range6. |
userLevelOnlyProps
this describes the properties that are only allowed on the user level itself are not inheritable from other levels
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
password_defined | boolean | false | none | This indicates whether the user has a password set. The API will NOT provide the hash of the password but only the information if a user password has been set. |
mfa_status | string | false | none | the status of the multi factor authentication. This is a read-only property that combines totp and totp_locked into a single status. |
totp_locked | boolean | false | none | specifies if the TOTP for the user is locked/enrolled. If true, secret is no longer viewable |
group | string | false | none | the group a user belongs too (conn_group) |
static_ipv4 | string | false | none | optional property. Maps to conn_ip |
static_ipv6 | string | false | none | optional property. Maps to conn_ip6 |
dmz_ip | [DMZIP] | false | none | The IP addresses and port-ranges that are exposed on this client. |
dmz_ipv6 | [DMZIP] | false | none | The IPv6 addresses and port-ranges that are exposed on this client. |
compile | boolean | false | none | If true the type is ‘user_compile’ instead of ‘user_connect’. |
totp_secret | string | false | none | the TOTP secret code according to RFC 6238. Note, that this is value might not be present for locked users in later versions (pvt_google_auth_secret). |
totp_admin_only | boolean | false | none | totp_admin_only only AS admins can generate and view Google Authenticator secrets (prop_google_auth_admin_locked) |
client_to_server_subnets | [IPsubNet] | false | none | < Subnets that are behind the client. I.e. the client will be a router/gateway for the subnets specified in this array. On the server side, this is split into ipv4 and ipv6 subnets (c2s_subnets and c2s_subnets6) but this API represents that as a single list. Use the ipv6 flag of the subnet to determine the address family. |
Enumerated Values
Property | Value |
---|---|
mfa_status | pending |
mfa_status | disabled |
mfa_status | enrolled |
userPropValue
This object describes a single user property value. If it is
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object,null | false | none | This object describes a single user property value. If it is |
value | any | true | none | the value that this property has. If inherited is false, this is identical to inheritedValue |
oneOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | string | false | none | none |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | boolean | false | none | none |
continued
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
inherited | boolean | false | none | specifies if this value is inherited from an upper level if this |
inherited_source_type | string | false | none | describes where the inherited values comes. This can be from the default user properties (default) or from a global configuration settings or from a group If the property is explicitly set (ie inherited is false), this property indicates what the property would inherit from if inherit is false. |
inherited_source_name | string | false | none | for the inherited types where knowing the name of the source can be beneficial. Like the group name or in some cases the configuration key. If the property is explicitly set (ie inherited is false), this property indicates what the property would inherit from if inherit is false. |
Enumerated Values
Property | Value |
---|---|
inherited_source_type | default |
inherited_source_type | implicit_default |
inherited_source_type | group |
inherited_source_type | configuration |
userProp
This hold the attributes of the userprop that is not specifically handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions.
deny (boolean): If true cannot connect or login (prop_deny)
deny_web (boolean): If true cannot login to web (prop_deny_web)
compile (boolean): If true the type is ‘user_compile’ instead of ‘user_connect’. (user record also queried on nftables/iptables compile and not only on connect)
admin (boolean): user is admin (prop_superuser)
autologin (boolean): autologin profile generation is allowed by the user themselves (prop_autologin)
auth_method (string): the authentication method that will be used for the user. Maps to user_auth_type and default configuration etc.
cc_commands: custom OpenVPN directives that will imported for the user on the server side (prop_cc_cmds)
totp: specifies whether TOTP based MFA is required (prop_google_auth)
password_strength: password strength check is enforced when changing the password for local auth (prop_pwd_strength/cs.cws.pwd_strength)
allow_password_change (boolean): specifies if a user is allowed to change the password themselves when local auth is used (prop_pwd_change). If not set on users the global default server key cs.cws.pwd_change is used as default. Admins can always change user passwords (including their own).
reroute_gw (string): one of ‘disable’, ‘dns_only’, ‘global’ Disables redirection of the default route and/or DNS on the client. This does not block it on the backend, if blocking on the backend is required, access lists should be added in addition. Defaults to ‘global’ if not set. The setting global will follow the configuration key ‘vpn.client.routing.reroute_gw’.(prop_reroute_gw_override)
allow_generate_profiles (prop_autogenerate): allow users themselves to generate connection profiles
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
name | string | false | none | the name of the user or group. |
deny | false | none | This object describes a single user property value. If it is | |
deny_web | false | none | This object describes a single user property value. If it is | |
admin | false | none | This object describes a single user property value. If it is | |
autologin | false | none | This object describes a single user property value. If it is | |
auth_method | false | none | This object describes a single user property value. If it is | |
cc_commands | false | none | This object describes a single user property value. If it is | |
totp | false | none | This object describes a single user property value. If it is | |
password_strength | false | none | This object describes a single user property value. If it is | |
allow_password_change | false | none | This object describes a single user property value. If it is | |
reroute_gw | false | none | This object describes a single user property value. If it is | |
allow_generate_profiles | false | none | This object describes a single user property value. If it is | |
bypass_subnets | [IPsubNet] | false | none | Subnets or hosts (represented subnet with a /32 or /128 netmask) that are installed as bypass routes on the client, i.e. that will bypass the VPN and use the normal non-VPN connection. |
userPropSet
The same as userProp schema. With the difference that it used solely for setting user properties. This means that all fields here is set directly, instead of wraping them in userPropValue object.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
name | string | false | none | the name of the user or group. |
deny | boolean | false | none | none |
deny_web | boolean | false | none | none |
admin | boolean | false | none | none |
autologin | boolean | false | none | none |
auth_method | string | false | none | none |
cc_commands | string | false | none | none |
totp | boolean | false | none | none |
password_strength | boolean | false | none | none |
allow_password_change | boolean | false | none | none |
reroute_gw | boolean | false | none | none |
allow_generate_profiles | boolean | false | none | none |
bypass_subnets | [IPsubNet] | false | none | Subnets or hosts (represented subnet with a /32 or /128 netmask) that are installed as bypass routes on the client, i.e. that will bypass the VPN and use the normal non-VPN connection. |
userPropScripts
This hold the attributes of the userprop that control client side scripting. It is not handled in a special way like passwords or group members. OpenAPI does not allow to specify description along with $ref so the description for the individual keys is in this descriptions.
Client side scripting: prop_cli.script.<win|mac|all>.<user|admin>.<connect|disconnect>
Client script env: prop_cli.script_env.win|prop_cli.script_env.mac”
example environment variable: “prop_cli.script_env.win.MSI_URL”: “https://secure.openvpn.net/tmp/bogi.msi”,
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
cli_script_connect_win_user_connect | false | none | This object describes a single user property value. If it is | |
cli_script_connect_win_user_disconnect | false | none | This object describes a single user property value. If it is | |
cli_script_connect_win_admin_connect | false | none | This object describes a single user property value. If it is | |
cli_script_connect_win_admin_disconnect | false | none | This object describes a single user property value. If it is | |
cli_script_connect_mac_user_connect | false | none | This object describes a single user property value. If it is | |
cli_script_connect_mac_user_disconnect | false | none | This object describes a single user property value. If it is | |
cli_script_connect_mac_admin_connect | false | none | This object describes a single user property value. If it is | |
cli_script_connect_mac_admin_disconnect | false | none | This object describes a single user property value. If it is | |
cli_script_connect_win_env | object | false | none | environment variables for the Windows script to run, each key will specify the name of the environment variable. |
» additionalProperties | false | none | This object describes a single user property value. If it is | |
cli_script_connect_mac_env | object | false | none | environment variables for the macOS script to run, each key will specify the name of the environment variable. |
» additionalProperties | false | none | This object describes a single user property value. If it is |
userPropScriptsSet
The same as userPropScripts schema. With the diffirence that it is used solely for setting user properties. This means that all fields here is set directly, instead of wraping them in userPropValue object.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
cli_script_connect_win_user_connect | string | false | none | none |
cli_script_connect_win_user_disconnect | string | false | none | none |
cli_script_connect_win_admin_connect | string | false | none | none |
cli_script_connect_win_admin_disconnect | string | false | none | none |
cli_script_connect_mac_user_connect | string | false | none | none |
cli_script_connect_mac_user_disconnect | string | false | none | none |
cli_script_connect_mac_admin_connect | string | false | none | none |
cli_script_connect_mac_admin_disconnect | string | false | none | none |
cli_script_connect_win_env | object | false | none | environment variables for the Windows script to run, each key will specify the name of the environment variable. |
» additionalProperties | string | false | none | none |
cli_script_connect_mac_env | object | false | none | environment variables for the macOS script to run, each key will specify the name of the environment variable. |
» additionalProperties | string | false | none | none |
serviceStatusEnum
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | none |
Enumerated Values
Property | Value |
---|---|
anonymous | on |
anonymous | disabled |
anonymous | error |
anonymous | enabled |
serviceWarning
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
tag | string | false | none | A tag assigned to the type of warning/error message |
message | string | false | none | A short summary of the warning in question |
description | any | false | none | A longer more detailed description of the warning |
severity | string | false | none | The level of the warning. The level error signals a hard error that prevents Access Server from starting and ok signal |
Enumerated Values
Property | Value |
---|---|
severity | ok |
severity | info |
severity | warning |
severity | critical |
severity | error |
serviceStatus
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
status | false | none | none | |
error | false | none | a list of important error message/warnings that impact current operation |
serverStatus
retrieve the status of the internal services of the server.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
last_restarted | string(date-time) | false | none | the last time the server was restarted |
service_status | object | false | none | an object containing the status of the various internal services. The key name holds the name of the service. |
» additionalProperties | false | none | none | |
auth_module_status | object | false | none | an object containing the status of the various authentication services. The key name holds the name of the service. |
» additionalProperties | false | none | none |
serverInterface
describes a Linux network interface and the associated primary networks
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
name | any | false | none | the name identifying the interface |
networks | [IPsubNet] | false | none | IP addresses assigned to the interface |
serverConfig
Describes global settings for AS server available to any authenticated users..
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
control_channel_security | true | none | none | |
installers | true | none | [Type of the installer binary that should be created for installation.] | |
hide_profiles_page | boolean | false | none | If True, the Connections profile page is hidden |
password_min_len | integer | true | none | Minimal length for the password if strength check is enabled. |
disable_open_in_app | boolean | true | none | If True then disable in app on UI |
admin_port | integer | true | none | port for Admin site |
shared_origin | boolean | true | none | CWS and Admin ui are both available on same origin (protocol + hostname + port) as this API endpoint being called. |
controlChannelSecurity
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | none |
Enumerated Values
Property | Value |
---|---|
anonymous | none |
anonymous | tls-auth |
anonymous | tls-crypt |
anonymous | tls-crypt-v2 |
serverInfo
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
version | string | false | none | the version number of Access Server |
build | string | false | none | the build of Access Server. |
web_version | string | false | none | the build version number of Access Server UI |
web_override | boolean | false | none | if true the version of the web ui that is used comes from an override-web.zip instead of the bundled version |
client_version | string | false | none | version of the embedded client package |
os_distribution | string | false | none | a human readable identifier of the current (Linux) distribution like PRETTY_NAME from /etc/os-release |
architecture | string | false | none | the CPU architecture |
cores | integer | false | none | the number of cores visible to the operating system |
os_hostname | string | false | none | Operating system’s hostname |
Enumerated Values
Property | Value |
---|---|
architecture | arm64 |
architecture | amd64 |
eulaStatus
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
eula_version_as | integer | false | none | The version of the AS EULA |
eula_web_hash | string(sha256) | false | none | A SHA256 string in hex format without : separators |
eula_accepted | boolean | false | none | indicates whether the config setting (aui.eula_version) has the same value as eula_version_as |
notificationMessage
notification msg stored in notificationdb
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
notification_type | string | true | none | the type of notification |
Enumerated Values
Property | Value |
---|---|
notification_type | CLUSTER_RESTART_PENDING |
notification_type | NODE_RESTARTED |
clusterProps
properties common to all nodes in the cluster.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
rr_dns_hostname | string | false | none | the Round-Robin hostname that uniquely identifies the cluster |
rr_dns_new_nodes | boolean | false | none | if true, use rr_dns_hostname as node hostname for new nodes joining the cluster |
clusterNode
describes a node in the cluster. The certificate field is the certificate that the node will present on its api_endpoint and that is expected to be used to verify the identity of the node.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
name | string | true | none | the name that uniquely identifies the cluster node [node_name] |
api_endpoint | false | none | the API endpoint to specifically address a node. Requires format https:ip/hostname:port. Note that https is necessary because certificateFingerprint is used by https client to verify it is indeed talking to the right node. | |
certificate_fingerprint | false | none | The SHA256 hash of the certificate body, also known as the fingerprint of the certificate. |
clusterNodeJoinRequest
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | describes a node in the cluster. The certificate field is the certificate that the node will present on its api_endpoint and that is expected to be used to verify the identity of the node. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» mysqluri | false | none | the URI of the mysql server. |
clusterNodeCreateRequest
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | none |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | properties common to all nodes in the cluster. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» rr_update_node | boolean | false | none | if true: update host.name in confdb_local to rr_dns_hostname in clusterdb when creating the cluster. if false: do not use rr_dns_hostname to update host.name in confdb_local, at cluster creation time. This is to provide admin the flexibility to update host.name to rr_dns_hostname at a later stage than cluster creation. |
mysqluri
the URI of the mysql server.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | the URI of the mysql server. |
profileRequest
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
user | false | none | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
profile_type | true | none | none | |
tls_crypt_v2 | boolean | false | none | The client is capable of TLS-Crypt v2 |
comment | string | false | none | A user-defined comment |
ignore_missing_user | any | false | none | if this is flag, which requires admin rights, is set, a profile will be created even if the specified user does not exist. |
installerProfileRequest
Fields for request to get installer download url
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
user | false | none | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
installer_type | true | none | Type of the installer binary that should be created for installation. | |
profile_type | false | none | none | |
tls_crypt_v2 | boolean | false | none | The client is capable of TLS-Crypt v2 |
commonPaginationParameters
the common parameters that all APIs that support pagination have. order_by and sort_by keys are dependent on the object that is paginated
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
page_size | integer | false | none | number of the profiles that are returned |
offset | integer | false | none | offset for pagination |
sort_by | false | none | The direction of sorting |
profileRequestParameters
This specifies the filters and parameters for the request of the user profiles.
Note, that some of the search fields do not have indices on the backend database and might be slow.
Using the user filter with anything than the own username will cause an error for non-admin users.
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | the common parameters that all APIs that support pagination have. order_by and sort_by keys are dependent on the object that is paginated |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» order_by | false | none | specifies by which attribute profiles should be sorted | |
» filters | object | false | none | none |
»» user | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
»» serial_number | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
»» tls_crypt_v2 | false | none | This specifies a filter that filter on a bool. Since it is a bool, the operation is always equal. | |
»» last_used | false | none | This specifies that the result should be filtered by this attribute with the specified time range. If one of the time points is missing it means that the range is unspecified. E.g. a start of 2020-02-02 and no end point means the time interval of [2020-02-02, ∞). | |
»» not_before | false | none | This specifies that the result should be filtered by this attribute with the specified time range. If one of the time points is missing it means that the range is unspecified. E.g. a start of 2020-02-02 and no end point means the time interval of [2020-02-02, ∞). | |
»» not_after | false | none | This specifies that the result should be filtered by this attribute with the specified time range. If one of the time points is missing it means that the range is unspecified. E.g. a start of 2020-02-02 and no end point means the time interval of [2020-02-02, ∞). | |
»» comment | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
»» signing_ca_cn | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
»» anywhere | false | none | This takes a number of field that should be searched for the string specified by value. The search is always a substring match and will match if ANY of the fields have a substring that matches. |
userRequestParameters
This indicates the filters that can be used for a requesting user parameters. If more than one filter is specified, the items returned must match all of the filters. The anywhere filter is special and can be only used alone.
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | the common parameters that all APIs that support pagination have. order_by and sort_by keys are dependent on the object that is paginated |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» order_by | false | none | specifies by which attribute profiles should be sorted | |
» filters | any | false | none | none |
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | object | false | none | none |
»»» name | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
»»» group | false | none | This specifies that the result should be filtered by this attribute with the specified operation. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | false | none | filters that can be applied to both user and group requests |
continued
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» users | [username] | false | none | a list of usernames that should be fetched. Note, that this list cannot be arbitrarily long as the query to the backend database has a size limit for a query. Note that usernames that are not found in the backend will be missing from the response. |
» proplist | false | none | A list of user properties to request. If this is null then all user properties for the user/group will be returned. Otherwise the list of user properties that should be returned. |
commonUserGroupFilters
filters that can be applied to both user and group requests
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
admin | false | none | This specifies a filter that filter on a bool. Since it is a bool, the operation is always equal. | |
autologin | false | none | This specifies a filter that filter on a bool. Since it is a bool, the operation is always equal. | |
anywhere | false | none | This takes a number of field that should be searched for the string specified by value. The search is always a substring match and will match if ANY of the fields have a substring that matches. |
tokenRequestParameters
parameters to be used when creating a new token-url. For non-admin usage only the profile type should be specified as setting most other parameters to values higher than default will cause errors.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
lifetime | integer | false | none | Optional lifetime in seconds that the token should be valid for. Longer lifetimes than default require admin privileges. |
usages | integer | false | none | Optional number of usages that this token can be used to generate a profile. Defaults to a single use if not provided. Specifying more than more usage requires admin privileges. |
profile_type | true | none | none | |
username | false | none | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API |
logDBRequestParameters
This specifies the filters and parameters for the request of the log database requests. Note, that this currently only includes the fields that were considered necessary of logDBRecord and that some search might not have indices in the database and might be slow.
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | the common parameters that all APIs that support pagination have. order_by and sort_by keys are dependent on the object that is paginated |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» order_by | false | none | Enum representing valid sorting fields for LogDB. | |
» filters | object | false | none | none |
»» start_time | false | none | This specifies that the result should be filtered by this attribute with the specified time range. If one of the time points is missing it means that the range is unspecified. E.g. a start of 2020-02-02 and no end point means the time interval of [2020-02-02, ∞). Same with relative time for start and end. | |
»» timestamp | false | none | This specifies that the result should be filtered by this attribute with the specified time range. If one of the time points is missing it means that the range is unspecified. E.g. a start of 2020-02-02 and no end point means the time interval of [2020-02-02, ∞). Same with relative time for start and end. | |
»» duration | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
»» node | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
»» username | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
»» active | false | none | This specifies a filter that filter on a bool. Since it is a bool, the operation is always equal. | |
»» error | false | none | This specifies a filter that filter on a bool. Since it is a bool, the operation is always equal. | |
»» service | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
»» virtual_ipv4_address | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
»» bytes_sent | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
»» bytes_received | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
»» gui_version | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
»» version | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
»» platform | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
»» anywhere | false | none | This takes a number of field that should be searched for the string specified by value. The search is always a substring match and will match if ANY of the fields have a substring that matches. |
filterTimeOrDuration
This specifies that the result should be filtered by this attribute with the specified time range. If one of the time points is missing it means that the range is unspecified. E.g. a start of 2020-02-02 and no end point means the time interval of [2020-02-02, ∞). Same with relative time for start and end.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
start | string(date-time) | false | none | none |
end | string(date-time) | false | none | none |
start_relative | string | false | none | none |
end_relative | string | false | none | none |
filterBandwidth
This specifies that the result should be filtered by this attribute with the specified operation.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
value | any | true | none | none |
oneOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | string | false | none | none |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | integer | false | none | none |
continued
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
operation | string | true | none | none |
Enumerated Values
Property | Value |
---|---|
operation | less_than |
operation | greater_than |
filterString
This specifies that the result should be filtered by this attribute with the specified operation.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
value | string | true | none | none |
operation | string | true | none | none |
Enumerated Values
Property | Value |
---|---|
operation | equal |
operation | substring |
operation | not_equal |
filterDuration
This specifies that the result should be filtered by this attribute with the specified operation.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
value | string | true | none | none |
operation | string | true | none | none |
Enumerated Values
Property | Value |
---|---|
operation | less_than |
operation | greater_than |
filterInteger
This specifies that the result should be filtered by this attribute with the specified operation.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
value | integer | true | none | none |
operation | string | true | none | none |
Enumerated Values
Property | Value |
---|---|
operation | equal |
operation | less_than |
operation | greater_than |
operation | not_equal |
filterTime
This specifies that the result should be filtered by this attribute with the specified time range. If one of the time points is missing it means that the range is unspecified. E.g. a start of 2020-02-02 and no end point means the time interval of [2020-02-02, ∞).
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
start | string(date) | false | none | none |
end | string(date) | false | none | none |
filterBool
This specifies a filter that filter on a bool. Since it is a bool, the operation is always equal.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
value | boolean | true | none | none |
filterAnywhere
This takes a number of field that should be searched for the string specified by value. The search is always a substring match and will match if ANY of the fields have a substring that matches.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
value | string | false | none | the substring to search in all specified fields |
fields | [string] | false | none | names of the fields to be searched |
groupRequestParameters
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | the common parameters that all APIs that support pagination have. order_by and sort_by keys are dependent on the object that is paginated |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» order_by | false | none | specifies by which attribute groups should be sorted | |
» filters | any | false | none | none |
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | object | false | none | none |
»»» name | false | none | This specifies that the result should be filtered by this attribute with the specified operation. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
»» anonymous | false | none | filters that can be applied to both user and group requests |
continued
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» enumerate_members | false | none | if this is set to true the response will also contain a list of all members of the group. Otherwise only a count of the members will be given. | |
» groups | false | none | a list of groups that should be fetched. Note, that this list cannot be arbitrarily long as the query to the backend database has a size limit for a query. Note that groups that are not found in the backend will be missing from the response. | |
» proplist | false | none | A list of user properties to request. If this is null then all user properties for the user/group will be returned. Otherwise the list of user properties that should be returned. |
accessListRequestParameters
request parameters for the access lists. Name here means: user or group name. Due to way the ACL all represented as strings in the database, sorting and filtering is very limited.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
order_by | string | false | none | none |
filters | object | false | none | filters for the access list objects. |
» internal_representation | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
» groupname | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
» username | false | none | This specifies that the result should be filtered by this attribute with the specified operation. | |
» object_type | string | false | none | Only return users or groups in the response. |
groups | false | none | a list of groups that should be fetched. Note, that this list cannot be arbitrarily long as the query to the backend database has a size limit for a query. Note that groups that are not found in the backend will be missing from the response. | |
users | [username] | false | none | a list of usernames that should be fetched. Note, that this list cannot be arbitrarily long as the query to the backend database has a size limit for a query. Note that usernames that are not found in the backend will be missing from the response. |
Enumerated Values
Property | Value |
---|---|
order_by | internal_prop_representation |
order_by | name |
object_type | user |
object_type | group |
object_type | all |
enumerateMembersParameter
if this is set to true the response will also contain a list of all members of the group. Otherwise only a count of the members will be given.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | boolean | false | none | if this is set to true the response will also contain a list of all members of the group. Otherwise only a count of the members will be given. |
userPropList
A list of user properties to request. If this is null then all user properties for the user/group will be returned. Otherwise the list of user properties that should be returned.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | array,null | false | none | A list of user properties to request. If this is null then all user properties for the user/group will be returned. Otherwise the list of user properties that should be returned. |
DMZIP
a DMZ IP and port that will that will forwarded to the client. This maps to the internal dmz_ip user property that is formatted as IP[:proto/start_port[-end_port]]
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
ip | string | true | none | the external IP address of the Access Server |
protocol | false | none | specifies a Layer 4 protocol (e.g. udp or tcp) | |
start_port | integer | false | none | the starting port for the dmz. If not specified all ports will be forwarded |
end_port | integer | false | none | the end port of the ports that are being forwarded. If not specified only a single port (the start_port) is forwarded. |
IpService
describes an IP UDP/TCP service or an icmp service
Properties
oneOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | Describes a layer4 (TCP/UDP) port or port-range. protocol may only be udp or tcp |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | Describes an icmp service type. protocol is always icmp |
icmpService
Describes an icmp service type. protocol is always icmp
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
protocol | false | none | specifies a Layer 4 protocol (e.g. udp or tcp) | |
type | string | false | none | none |
Enumerated Values
Property | Value |
---|---|
type | icmp-any |
type | icmp-echo-reply |
type | icmp-destination-unreachable |
type | icmp-network-unreachable |
type | icmp-host-unreachable |
type | icmp-protocol-unreachable |
type | icmp-port-unreachable |
type | icmp-fragmentation-needed |
type | icmp-source-route-failed |
type | icmp-network-unknown |
type | icmp-host-unknown |
type | icmp-network-prohibited |
type | icmp-host-prohibited |
type | icmp-TOS-network-unreachable |
type | icmp-TOS-host-unreachable |
type | icmp-communication-prohibited |
type | icmp-host-precedence-violation |
type | icmp-precedence-cutoff |
type | icmp-source-quench |
type | icmp-redirect |
type | icmp-network-redirect |
type | icmp-host-redirect |
type | icmp-TOS-network-redirect |
type | icmp-TOS-host-redirect |
type | icmp-echo-request |
type | icmp-router-advertisement |
type | icmp-router-solicitation |
type | icmp-time-exceeded |
type | icmp-ttl-zero-during-transit |
type | icmp-ttl-zero-during-reassembly |
type | icmp-parameter-problem |
type | icmp-ip-header-bad |
type | icmp-required-option-missing |
type | icmp-timestamp-request |
type | icmp-timestamp-reply |
type | icmp-address-mask-request |
portRange
Describes a layer4 (TCP/UDP) port or port-range. protocol may only be udp or tcp
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
protocol | true | none | specifies a Layer 4 protocol (e.g. udp or tcp) | |
start_port | integer | true | none | The start port of the port range |
end_port | integer | false | none | The end port of the port range. If not specified, the range will consist of only one single port (start_port) |
layer4protocol
specifies a Layer 4 protocol (e.g. udp or tcp)
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | string | false | none | specifies a Layer 4 protocol (e.g. udp or tcp) |
Enumerated Values
Property | Value |
---|---|
anonymous | tcp |
anonymous | udp |
anonymous | icmp |
accessRouteListItem
Format of OpenVPN Access Server’s access lists. Each access list entry has a class/type that determines how the entry works.
The all, all_vpn_clients and all_s2c_subnet types do not require an additional property.
The user/group require the username/groupname property
the nat and route type require the subnet property.
Note that internally there is also the class subnet and this class can be modified with a R/N suffix to be either the route or nat class, so the API will represent these with the appropriate class.
Either username or groupname is set to indicate whether this is a user or group assigned access rules.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
username | false | none | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
groupname | false | none | a group name that is being in used in user management to specify a group name. | |
access_route | any | false | none | none |
oneOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | false | none | Format of OpenVPN Access Server’s access lists. Each access list entry has a class/type that determines how the entry works. - The all, all_vpn_clients and all_s2c_subnet types do not require an additional property. - The user/group require the username/groupname property - the nat and route type require the subnet property. Note that internally there is also the class subnet and this class can be modified with a R/N suffix to be either the route or nat class, so the API will represent these with the appropriate class. |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | null | false | none | indicator that routes of this type should be deleted |
continued
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
type | string | false | none | the type of access list this item this is in the user/group. |
oneOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
not
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | object | false | none | none |
xor
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
not
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» anonymous | object | false | none | none |
Enumerated Values
Property | Value |
---|---|
type | access_from_ipv6 |
type | access_from_ipv4 |
type | access_to_ipv4 |
type | access_to_ipv6 |
accessRoute
Format of OpenVPN Access Server’s access lists. Each access list entry has a class/type that determines how the entry works. - The all, all_vpn_clients and all_s2c_subnet types do not require an additional property.
The user/group require the username/groupname property
the nat and route type require the subnet property.
Note that internally there is also the class subnet and this class can be modified with a R/N suffix to be either the route or nat class, so the API will represent these with the appropriate class.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
type | string | false | none | none |
accept | boolean | false | none | specifies if we accept or deny this particular access |
username | false | none | a username. If this parameter is specified many methods require admin privileges instead normal user privileges if the username is different from the username of the auth token. Note that the backend will treat usernames always case-sensitive in the API | |
groupname | false | none | a group name that is being in used in user management to specify a group name. | |
subnet | false | none | The definition of the subnet used by the nat and route accessRoute classes. Each one is a subnet with one or more port ranges For reference, the internal representation on the Access Server properties looks like this: - 192.168.4.0/24 - 10.10.0.0/24:https,udp/1194,tcp/1194 - 192.168.99.0/24::R - 192.168.99.0/24:https,udp/1194,tcp/1194,udp/2000-2999:R - 2001:608:3:814::0/64 |
Enumerated Values
Property | Value |
---|---|
type | user |
type | group |
type | route |
type | nat |
type | all |
type | all_vpn_clients |
type | all_s2c_subnets |
accessRouteSubnet
The definition of the subnet used by the nat and route accessRoute classes. Each one is a subnet with one or more port ranges
For reference, the internal representation on the Access Server properties looks like this: - 192.168.4.0/24 - 10.10.0.0/24:https,udp/1194,tcp/1194 - 192.168.99.0/24::R - 192.168.99.0/24:https,udp/1194,tcp/1194,udp/2000-2999:R - 2001:608:3:814::0/64|https,udp/1194,tcp/1194,udp/2000-2999|R - 10.0.0.7/24:icmp-any,rdp,imaps - 10.0.0.1/25:icmp-TOS-host-redirect
Note that the services array is optional. A missing service array indicates that the whole subnet is affected regardless of the used layer 4 service (icmp, tcp, udp or other IP protocol)
Properties
allOf
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | false | none | describes an IP subnet. |
and
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | object | false | none | none |
» service | false | none | [describes an IP UDP/TCP service or an icmp service] |
IPsubNet
describes an IP subnet.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
ipv6 | boolean | false | none | whether this describes an IPv4 or an IPv6 subnet |
netip | string | false | none | the network IP address. |
prefix_length | integer | false | none | length of the prefix in CIDR notation |
groupIpRange
An IP Range that describes allowed IP addresses for a group will be represented as on backend as: - “first_ip-last_ip” - “first_ip~numberOfIPs” - “first_ip:last_ip” (IPv4 only, deprecated)
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
ipv6 | boolean | false | none | whether this describes an IPv4 or an IPv6 range |
first_ip | string | false | none | the start address of the IP range. |
last_ip | string | false | none | the end address of the IP range. |
failOverTestResult
The result of a single failover test.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
friendly | string | false | none | Human readable interpretation of the test |
status | boolean | true | none | Whether this test succeeded or not |
message | string | true | none | detailed string of the test result |
failOverTestStatus
The result of running the failover tests. The failover test runs a number of subtests. Note that if the connectivity test fails, often the other tests will fail as well.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
ucarp | false | none | The result of a single failover test. | |
license_primary | false | none | The result of a single failover test. | |
license_secondary | false | none | The result of a single failover test. | |
connectivity | false | none | The result of a single failover test. |
{ "header_image": "string", "hide_footer": "string", "enabled_auth_methods": [ "saml", "userandpassword" ], "login_text": "Enter your TOTP Authentication code." }
"autologin"
"niccolo@paganini.it"
"string"
"win_v3"
"serial"
"admin"
"name"
"node"
"asc"
{ "serial": "1708464983752887'", "common_name": "OpenVPN VPN server CA", "algorithm": "rsa2048", "not_before": "2020-03-27", "not_after": "2030-03-26", "self_signed": true, "signing_ca": "123", "signing_ca_cn": "RootCA", "device_id": "string", "comment": "My toaster running Doom", "profile_type": "autologin", "tls_crypt_v2": true, "last_used": "2019-08-24", "username": "string" }
"admin"
{ "requires_mfa_enrollment": true, "user_type": "admin", "mfa_secret": "string", "allowed_profiles": [ "autologin" ], "enforce_strong_passwords": true, "allow_password_change": true }
{ "challenge": "If you could be any animal, what would you be and why?", "echo": true, "challenge_context": "812jh3a8s" }
{ "response": "pa$$word", "challenge_context": "FJAIIXMAIOFLGAK23", "username": "string" }
"1708464983752887'"
"OpenVPN VPN server CA"
{ "username": "string", "password": "string", "totp": "string" }
{ "assertion": "string", "relay_state": "vpnauth~nod1~Dfk3287761d" }
{ "user_properties": { "requires_mfa_enrollment": true, "user_type": "admin", "mfa_secret": "string", "allowed_profiles": [ "autologin" ], "enforce_strong_passwords": true, "allow_password_change": true }, "username": "string", "auth_token": "string", "expires_after": "string", "renewable_until": "string" }
{ "auth_token": "string", "expires_after": "string", "renewable_until": "string" }
{ "204": null, "description": "profile successfully deleted" }
"Client disconnected for administrative reasons"
"John should not be working after hours"
{ "daemon_id": "openvpn_7", "client_id": 7 }
{ "reason": "Your password must not include parts of Cthulhu's chant.", "title": "Password validation failed" }
{ "reason": "config values had errors", "detail": { "host.name": "Contains invalid character %", "server.port": "Must be an integer between 1 and 65335" } }
"string"
"rsa2048"
"ca"
{ "serial": "1708464983752887'", "common_name": "OpenVPN VPN server CA", "algorithm": "rsa2048", "not_before": "2020-03-27", "not_after": "2030-03-26", "self_signed": true, "signing_ca": "123", "signing_ca_cn": "RootCA" }
{ "serial": "1708464983752887'", "common_name": "OpenVPN VPN server CA", "algorithm": "rsa2048", "not_before": "2020-03-27", "not_after": "2030-03-26", "self_signed": true, "signing_ca": "123", "signing_ca_cn": "RootCA", "sha256fp": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C", "subj_alt_names": [ "DNS:foo.example.com", "DNS:www.openvpn.net", "IP:1.2.3.4" ], "subject": [ "C=US", "ST=Maryland", "L=Pasadena", "O=DevOrg", "OU=FreeSoft", "OU=non-free soft", "CN=rogue software department" ], "ca": true }
{ "serial": "1708464983752887'", "common_name": "OpenVPN VPN server CA", "algorithm": "rsa2048", "not_before": "2020-03-27", "not_after": "2030-03-26", "self_signed": true, "signing_ca": "123", "signing_ca_cn": "RootCA", "cert_type": "ca", "client_profiles": 0 }
{ "algorithm": "secp384r1", "common_name": "my shiny new CA", "cert_template": "spcert", "days_to_expiry": 365, "private_key_passphrase": "string", "signing_ca": "string", "subj_alt_dns_names": [ "vpn-server.example.com" ], "signing_ca_key": "string", "signing_ca_config_key": null, "signing_ca_private_key_passphrase": "string" }
{ "algorithm": "secp384r1", "common_name": "my shiny new CA" }
{ "value": 0, "default_value": 0, "max_value": 0, "min_value": 0 }
{ "value": "string", "redacted_value": "PEM encoded private key [rsa2048]", "default_value": "string", "allowed_values": [ "string" ], "type_hint": "ipv4Address" }
{ "value": true, "default_value": true }
{ "value": "string" }
"default"
"vpn.server.cipher"
{ "name": "vpn.server.cipher", "derived_from": "default", "type": "custom", "description": "string", "category": "deprecated", "value": 0, "default_value": 0, "max_value": 0, "min_value": 0 }
"string"
"string"
"36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C"
"https://node1:945"
"cold"
{ "daemon_id": "openvpn_7", "client_id": 7, "bytes_sent": 0, "bytes_received": 0, "commonname": "plato_AUTOLOGIN", "username": "plato", "connected_since": "2019-08-24T14:15:22Z", "datachannel_cipher": "ChaCha20-Poly1305", "real_address": "1.2.7.8:23123", "virtual_ipv4_address": "10.0.0.7", "virtual_ipv6_address": "fd00:f00f::b00f" }
7
"openvpn_7"
{ "dco": true, "version": "OpenVPN 2.7_git [git:bloom/520bc001b093857c+] x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZ4] [EPOLL] [MH/PKTINFO] [AEAD] [DCO] built on Nov 30 2023" }
{ "available": true, "version": "0.2.20230323" }
{ "timestamp": "2019-08-24T14:15:22Z", "node": "vpn-12.example.com", "username": null, "start_time": null, "duration": null, "service": "WEB_ADMIN", "active": true, "auth": true, "platform": "android", "version": "2.6.11", "proto": "tcp", "gui_version": "de.blinkt.openvpn_0.7.48", "real_address": "1.2.7.8:23123", "server_port": 1194, "virtual_ipv4_address": "10.0.0.7", "virtual_ipv6_address": "fd00:f00f::b00f", "session_id": "gOB8vpI1MEr0vBnm", "api_method": "ConfigQuery", "bytes_sent": 0, "bytes_received": 0, "total_bytes": 0, "error": "LOCKOUT: user temporarily locked out due to multiple authentication failures", "extra": "string" }
{ "licensing_type": "unlicensed", "current_cc": 3, "max_cc": 13, "fixed_licenses": [ { "expiry": "2019-08-24T14:15:22Z", "key": "string", "max_cc": 0 } ] }
{}
{ "fixed_licenses": [ { "expiry": "2019-08-24T14:15:22Z", "key": "string", "max_cc": 0 } ] }
{ "region": "eu-central-1", "product_code": "3ihdqli79gl9v2jnlzs6nq60h", "instance_id": "i-0c1ac1ca2f4b4a23b" }
{ "agent_id'": "13014502862141447248", "agent_disabled": true, "cc_limit": 13, "error": "string", "fallback_cc'": 2, "grace_period": 30, "last_successful_update": "2019-08-24T14:15:22Z", "total_cc": 0, "name": "Test subscription for development", "subkey": "ASUYHgkSWvVQFZhJXVdgtEa_AStctYuHirYZeFbZjLvQCWCaViVamXwL_7a289be35f6987c9aec4585c922a740c1b7620d5", "billing_id": "tctYuHirYZeFbZjLvQC", "next_update": "2019-08-24T14:15:22Z", "updates_failed": 0, "notes": [ "Subscription will expire on 1/2/3", "Maximum allowed concurrent connections might be limited to 23 by the 'subscription.local_cc_limit' setting" ], "overdraft": true, "server": "asb.sts.openvpn.net", "type": "-", "state": "SUBSCRIPTION_OK" }
{ "token": "a4aL62OFooAjPu4wu6MQCvcmY070hu8B", "username": "arne@openvpn.net", "expires": "2019-08-24T14:15:22Z", "profile_type": "autologin", "usages": 1 }
{ "name": "string", "deny": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "deny_web": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "admin": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "autologin": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "auth_method": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cc_commands": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "totp": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "password_strength": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "allow_password_change": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "reroute_gw": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "allow_generate_profiles": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "bypass_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "password_defined": true, "mfa_status": "pending", "totp_locked": true, "group": "stringsection", "static_ipv4": "string", "static_ipv6": "string", "dmz_ip": [ { "ip": "123.7.3.1", "start_port": 7000, "end_port": 7111, "protocol": "udp" } ], "dmz_ipv6": [ { "ip": "123.7.3.1", "start_port": 7000, "end_port": 7111, "protocol": "udp" } ], "compile": true, "totp_secret": "string", "totp_admin_only": true, "client_to_server_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "cli_script_connect_win_user_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_user_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_admin_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_admin_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_user_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_user_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_admin_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_admin_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_env": { "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi", "lucky_number": "23", "SCRIPT_VER": "alpha9" }, "cli_script_connect_mac_env": { "property1": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "property2": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" } } }
{ "name": "string", "deny": true, "deny_web": true, "admin": true, "autologin": true, "auth_method": "string", "cc_commands": "string", "totp": true, "password_strength": true, "allow_password_change": true, "reroute_gw": true, "allow_generate_profiles": true, "bypass_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "password_defined": true, "mfa_status": "pending", "totp_locked": true, "group": "stringsection", "static_ipv4": "string", "static_ipv6": "string", "dmz_ip": [ { "ip": "123.7.3.1", "start_port": 7000, "end_port": 7111, "protocol": "udp" } ], "dmz_ipv6": [ { "ip": "123.7.3.1", "start_port": 7000, "end_port": 7111, "protocol": "udp" } ], "compile": true, "totp_secret": "string", "totp_admin_only": true, "client_to_server_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "cli_script_connect_win_user_connect": "string", "cli_script_connect_win_user_disconnect": "string", "cli_script_connect_win_admin_connect": "string", "cli_script_connect_win_admin_disconnect": "string", "cli_script_connect_mac_user_connect": "string", "cli_script_connect_mac_user_disconnect": "string", "cli_script_connect_mac_admin_connect": "string", "cli_script_connect_mac_admin_disconnect": "string", "cli_script_connect_win_env": { "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi", "lucky_number": "23", "SCRIPT_VER": "alpha9" }, "cli_script_connect_mac_env": { "property1": "string", "property2": "string" } }
{ "name": "string", "deny": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "deny_web": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "admin": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "autologin": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "auth_method": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cc_commands": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "totp": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "password_strength": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "allow_password_change": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "reroute_gw": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "allow_generate_profiles": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "bypass_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "members": [ "niccolo@paganini.it", "hillary@hahn.us", "yoyoma" ], "member_count": 0, "subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "dynamic_ranges": [ { "ipv6": true, "first_ip": "fd00::18cc:1b01:a772:50e1", "last_ip": "fd00::18cc:1b01:a772:80e1" } ], "cli_script_connect_win_user_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_user_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_admin_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_admin_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_user_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_user_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_admin_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_admin_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_env": { "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi", "lucky_number": "23", "SCRIPT_VER": "alpha9" }, "cli_script_connect_mac_env": { "property1": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "property2": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" } } }
{ "name": "string", "deny": true, "deny_web": true, "admin": true, "autologin": true, "auth_method": "string", "cc_commands": "string", "totp": true, "password_strength": true, "allow_password_change": true, "reroute_gw": true, "allow_generate_profiles": true, "bypass_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "members": [ "niccolo@paganini.it", "hillary@hahn.us", "yoyoma" ], "member_count": 0, "subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "dynamic_ranges": [ { "ipv6": true, "first_ip": "fd00::18cc:1b01:a772:50e1", "last_ip": "fd00::18cc:1b01:a772:80e1" } ], "cli_script_connect_win_user_connect": "string", "cli_script_connect_win_user_disconnect": "string", "cli_script_connect_win_admin_connect": "string", "cli_script_connect_win_admin_disconnect": "string", "cli_script_connect_mac_user_connect": "string", "cli_script_connect_mac_user_disconnect": "string", "cli_script_connect_mac_admin_connect": "string", "cli_script_connect_mac_admin_disconnect": "string", "cli_script_connect_win_env": { "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi", "lucky_number": "23", "SCRIPT_VER": "alpha9" }, "cli_script_connect_mac_env": { "property1": "string", "property2": "string" } }
{ "name": "string", "deny": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "deny_web": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "admin": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "autologin": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "auth_method": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cc_commands": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "totp": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "password_strength": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "allow_password_change": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "reroute_gw": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "allow_generate_profiles": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "bypass_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "def_deny": true, "cli_script_connect_win_user_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_user_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_admin_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_admin_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_user_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_user_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_admin_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_admin_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_env": { "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi", "lucky_number": "23", "SCRIPT_VER": "alpha9" }, "cli_script_connect_mac_env": { "property1": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "property2": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" } }, "group": "stringsection" }
{ "name": "string", "deny": true, "deny_web": true, "admin": true, "autologin": true, "auth_method": "string", "cc_commands": "string", "totp": true, "password_strength": true, "allow_password_change": true, "reroute_gw": true, "allow_generate_profiles": true, "bypass_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "def_deny": true, "cli_script_connect_win_user_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_user_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_admin_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_admin_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_user_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_user_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_admin_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_admin_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_env": { "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi", "lucky_number": "23", "SCRIPT_VER": "alpha9" }, "cli_script_connect_mac_env": { "property1": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "property2": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" } }, "group": "stringsection" }
{ "def_deny": true }
{ "members": [ "niccolo@paganini.it", "hillary@hahn.us", "yoyoma" ], "member_count": 0, "subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ], "dynamic_ranges": [ { "ipv6": true, "first_ip": "fd00::18cc:1b01:a772:50e1", "last_ip": "fd00::18cc:1b01:a772:80e1" } ] }
{ "password_defined": true, "mfa_status": "pending", "totp_locked": true, "group": "stringsection", "static_ipv4": "string", "static_ipv6": "string", "dmz_ip": [ { "ip": "123.7.3.1", "start_port": 7000, "end_port": 7111, "protocol": "udp" } ], "dmz_ipv6": [ { "ip": "123.7.3.1", "start_port": 7000, "end_port": 7111, "protocol": "udp" } ], "compile": true, "totp_secret": "string", "totp_admin_only": true, "client_to_server_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ] }
{ "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }
{ "name": "string", "deny": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "deny_web": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "admin": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "autologin": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "auth_method": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cc_commands": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "totp": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "password_strength": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "allow_password_change": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "reroute_gw": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "allow_generate_profiles": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "bypass_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ] }
{ "name": "string", "deny": true, "deny_web": true, "admin": true, "autologin": true, "auth_method": "string", "cc_commands": "string", "totp": true, "password_strength": true, "allow_password_change": true, "reroute_gw": true, "allow_generate_profiles": true, "bypass_subnets": [ { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false } ] }
{ "cli_script_connect_win_user_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_user_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_admin_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_admin_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_user_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_user_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_admin_connect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_mac_admin_disconnect": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "cli_script_connect_win_env": { "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi", "lucky_number": "23", "SCRIPT_VER": "alpha9" }, "cli_script_connect_mac_env": { "property1": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" }, "property2": { "value": "string", "inherited": true, "inherited_source_type": "default", "inherited_source_name": "administrators" } } }
{ "cli_script_connect_win_user_connect": "string", "cli_script_connect_win_user_disconnect": "string", "cli_script_connect_win_admin_connect": "string", "cli_script_connect_win_admin_disconnect": "string", "cli_script_connect_mac_user_connect": "string", "cli_script_connect_mac_user_disconnect": "string", "cli_script_connect_mac_admin_connect": "string", "cli_script_connect_mac_admin_disconnect": "string", "cli_script_connect_win_env": { "MSI_URL": "https://secure.openvpn.net/tmp/bogi.msi", "lucky_number": "23", "SCRIPT_VER": "alpha9" }, "cli_script_connect_mac_env": { "property1": "string", "property2": "string" } }
"on"
{ "tag": "DCO_NOT_ACTIVE", "message": "Insecure VPN cipher in use", "description": "Insecure cipher DES-EDE3-CBC allowed for VPN encryption. Consider removing this cipher from vpn.server.data_ciphers (AES-256-GCM:DES-EDE3-CBC) and/or disabling vpn.server.enable_cipher_fallback (False)", "severity": "ok" }
{ "status": "on", "error": [ { "tag": "DCO_NOT_ACTIVE", "message": "Insecure VPN cipher in use", "description": "Insecure cipher DES-EDE3-CBC allowed for VPN encryption. Consider removing this cipher from vpn.server.data_ciphers (AES-256-GCM:DES-EDE3-CBC) and/or disabling vpn.server.enable_cipher_fallback (False)", "severity": "ok" } ] }
{ "last_restarted": "2019-08-24T14:15:22Z", "service_status": { "property1": { "status": "on", "error": [] }, "property2": { "status": "on", "error": [] } }, "auth_module_status": { "property1": "on", "property2": "on" } }
{ "name": "eth0", "networks": [ { "netip": "fd00::18cc:1b01:a772:50e1", "ipv6": true, "prefix_len": "64" }, { "netip": "10.0.0.1", "ipv6": false, "prefix_len": 25 }, { "netip": "192.168.0.1", "ipv6": false, "prefix_len": 24 } ] }
{ "control_channel_security": "none", "installers": [ "win_v3" ], "hide_profiles_page": true, "password_min_len": 0, "disable_open_in_app": true, "admin_port": 0, "shared_origin": true }
"none"
{ "version": "2.13.0-internal", "build": "18eba991", "web_version": "2.12.7-82fda2", "web_override": true, "client_version": [ "27" ], "os_distribution": "Ubuntu 24.04.6 LTS", "architecture": "arm64", "cores": 0, "os_hostname": "access-server-os-hostname" }
{ "eula_version_as": 7, "eula_web_hash": "36D7D51F474A84A2A30A41BC92CBA5D9D65F756484011D6F58B9D667F8DBBE9C", "eula_accepted": true }
{ "notification_type": "CLUSTER_RESTART_PENDING" }
{ "rr_dns_hostname": "cluster.example.com", "rr_dns_new_nodes": true }
{ "name": "vienna.example.com", "api_endpoint": "https://node1:945", "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C" }
{ "name": "vienna.example.com", "api_endpoint": "https://node1:945", "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C", "mysqluri": "mysql://user:password@mysql.example.com:3306/" }
{ "name": "vienna.example.com", "api_endpoint": "https://node1:945", "certificate_fingerprint": "36:D7:D5:1F:47:4A:84:A2:A3:0A:41:BC:92:CB:A5:D9:D6:5F:75:64:84:01:1D:6F:58:B9:D6:67:F8:DB:BE:9C", "mysqluri": "mysql://user:password@mysql.example.com:3306/", "rr_dns_hostname": "cluster.example.com", "rr_dns_new_nodes": true, "rr_update_node": true }
"mysql://user:password@mysql.example.com:3306/"
{ "user": "niccolo@paganini.it", "profile_type": "autologin", "tls_crypt_v2": true, "comment": "connected from my iPhone", "ignore_missing_user": null }
{ "user": "niccolo@paganini.it", "installer_type": "win_v3", "profile_type": "autologin", "tls_crypt_v2": true }
{ "page_size": 0, "offset": 0, "sort_by": "asc" }
{ "page_size": 0, "offset": 0, "sort_by": "asc", "order_by": "serial", "filters": { "user": { "operation": "substring", "value": "vio" }, "serial_number": { "value": 400, "operation": "less_than" }, "tls_crypt_v2": { "value": true }, "last_used": { "start": "2019-08-24", "end": "2019-08-24" }, "not_before": { "start": "2019-08-24", "end": "2019-08-24" }, "not_after": { "start": "2019-08-24", "end": "2019-08-24" }, "comment": { "operation": "substring", "value": "vio" }, "signing_ca_cn": { "operation": "substring", "value": "vio" }, "anywhere": { "value": "bass", "fields": [] } } }
{ "page_size": 0, "offset": 0, "sort_by": "asc", "order_by": "admin", "filters": { "name": { "operation": "substring", "value": "vio" }, "group": { "operation": "substring", "value": "vio" }, "admin": { "value": true }, "autologin": { "value": true }, "anywhere": { "value": "bass", "fields": [] } }, "users": [ "niccolo@paganini.it" ], "proplist": [ "string" ] }
{ "admin": { "value": true }, "autologin": { "value": true }, "anywhere": { "value": "bass", "fields": [ "username", "group" ] } }
{ "lifetime": 0, "usages": 0, "profile_type": "autologin", "username": "niccolo@paganini.it" }
{ "page_size": 0, "offset": 0, "sort_by": "asc", "order_by": "node", "filters": { "start_time": { "start_relative": "20d", "end_relative": "15d 20m" }, "timestamp": { "start_relative": "20d", "end_relative": "15d 20m" }, "duration": { "value": "20d", "operation": "less_than" }, "node": { "operation": "substring", "value": "vio" }, "username": { "operation": "substring", "value": "vio" }, "active": { "value": true }, "error": { "value": true }, "service": { "operation": "substring", "value": "vio" }, "virtual_ipv4_address": { "operation": "substring", "value": "vio" }, "bytes_sent": { "value": "20kb", "operation": "less_than" }, "bytes_received": { "value": "20kb", "operation": "less_than" }, "gui_version": { "operation": "substring", "value": "vio" }, "version": { "operation": "substring", "value": "vio" }, "platform": { "operation": "substring", "value": "vio" }, "anywhere": { "value": "bass", "fields": [] } } }
{ "start_relative": "20d", "end_relative": "15d 20m" }
{ "value": "20kb", "operation": "less_than" }
{ "operation": "substring", "value": "vio" }
{ "value": "20d", "operation": "less_than" }
{ "value": 400, "operation": "less_than" }
{ "start": "2019-08-24", "end": "2019-08-24" }
{ "value": true }
{ "value": "bass", "fields": [ "username", "group" ] }
{ "page_size": 0, "offset": 0, "sort_by": "asc", "order_by": "name", "filters": { "name": { "operation": "substring", "value": "vio" }, "admin": { "value": true }, "autologin": { "value": true }, "anywhere": { "value": "bass", "fields": [] } }, "enumerate_members": true, "groups": [ "string" ], "proplist": [ "string" ] }
{ "order_by": "internal_prop_representation", "filters": { "internal_representation": { "operation": "substring", "value": "vio" }, "groupname": { "operation": "substring", "value": "vio" }, "username": { "operation": "substring", "value": "vio" }, "object_type": "user" }, "groups": [ "string" ], "users": [ "niccolo@paganini.it" ] }
true
[ "string" ]
{ "ip": "123.7.3.1", "start_port": 7000, "end_port": 7111, "protocol": "udp" }
{ "protocol": "tcp", "start_port": 0, "end_port": 0 }
{ "protocol": "tcp", "type": "icmp-any" }
{ "protocol": "tcp", "start_port": 0, "end_port": 0 }
"tcp"
{ "username": "johann", "access_route": { "type": "route", "accept": "true", "subnet": { "ipv6": true, "prefix_length": 64, "netip": "2001:bach:ce1:10::0" } }, "type": "access_to_ipv4" }
{ "type": "user", "accept": true, "username": "niccolo@paganini.it", "groupname": "string", "subnet": { "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false, "service": [ {} ] } }
{ "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false, "service": [ { "protocol": "tcp", "start_port": 0, "end_port": 0 } ] }
{ "prefix_length": 21, "netip": "131.234.72.0", "ipv6": false }
{ "ipv6": true, "first_ip": "fd00::18cc:1b01:a772:50e1", "last_ip": "fd00::18cc:1b01:a772:80e1" }
{ "friendly": "string", "status": true, "message": "string" }
{ "ucarp": { "friendly": "string", "status": true, "message": "string" }, "license_primary": { "friendly": "string", "status": true, "message": "string" }, "license_secondary": { "friendly": "string", "status": true, "message": "string" }, "connectivity": { "friendly": "string", "status": true, "message": "string" } }
Legacy REST API
Access Server API
The Access Server REST API allows programmatic download of OpenVPN connection profiles.
Overview
The Access Server REST API allows programmatic download of OpenVPN connection profiles. This is the same API used by OpenVPN Connect and is compatible with other clients and tools.
Supports userlogin and autologin profiles.
Uses HTTP Basic Authentication.
Returns connection profiles as
.ovpn
files.Can be accessed via command-line tools like
curl
.
Base URL
https://<ACCESS_SERVER>/rest/<METHOD>
Prerequisites
Access Server is deployed and accessible.
XML-RPC/REST API is enabled under: Admin Web UI > Configuration > CWS Settings.
A valid username and password for an Access Server user.
Access Server’s HTTPS port is typically
443
, unless configured otherwise.
Authentication
The API uses HTTP Basic Authentication. Include the username:password
pair in your request header or via the -u
option in curl
.
TLS certificate validation is required. If using a self-signed certificate, pass it with --cacert
. Avoid using -k
unless testing.
If your credentials contain special characters (e.g., @
), wrap them in single quotes.
curl -u 'username:password' https://<ACCESS_SERVER>/rest/<METHOD>
Profile Parameters
Parameter | Description |
---|---|
| The username of the Access Server user for whom the connection profile is requested. |
| The specified user's password. |
| (Optional) The port on which the client web server listens. This is set to 443 by default, but you can specify a different port if needed. |
| Indicates support for TLS Crypt V2, a more secure encryption mechanism for protecting control channel traffic in OpenVPN. |
| Specify the device for which the connection profile is being generated. (It helps associate a particular connection profile with a specific device, ensuring the generated profile corresponds to the right device.) |
Endpoints
GetUserlogin
Retrieves a user-based OpenVPN connection profile (requires username/password at connection time).
Optional query parameters
tls-cryptv2=1
: Enables TLS Crypt V2 (recommended for enhanced security).action=import
: Triggers direct import in some clients.
Optional headers (to prevent multiple 2FA prompts)
VPN-Session-User: <base64_encoded_user>
VPN-Session-Token: <base64_encoded_token>
Success response
Content-Type: application/x-openvpn-profile
Error response:
Content-Type: text/xml
GetAutologin
Retrieves a client-certificate-based profile suitable for unattended clients (no password prompt).
Important
Ensure the user has autologin permission enabled in the Admin Web UI under User Permissions.
Success response
Content-Type: application/x-openvpn-profile
Error response
Content-Type: text/xml
Request
curl -u 'username:password' "https://<ACCESS_SERVER>/rest/GetUserlogin?tls-cryptv2=1&action=import"
Request
curl -u 'username:password' https://<ACCESS_SERVER>/rest/GetAutologin
Challenge/Response Authentication
Overview
The REST API supports challenge/response authentication for cases requiring additional user verification. This method is used when the server needs to verify a user's identity through a challenge that the user must respond to before the requested OpenVPN configuration file can be returned.
Here's an overview of how the process works:
The client sends an authentication request with the user's credentials (username and password) to the Access Server:
curl -u test:mypass https://ACCESS_SERVER/rest/GetUserlogin
When additional verification is required (e.g., a Turing test), the server responds with a challenge message instead of the requested configuration file. This response includes the challenge details, formatted as
CRV1
.The client presents the challenge to the user (e.g., "What is 1 x 3?"). The user enters the response.
The client then resubmits the request with the challenge response in the format specified by the server.
If the server validates the response, the requested connection profile is returned.
Challenge/response authentication details
Receiving a challenge: When the client requests a connection profile (e.g.,
GetUserlogin
), but the server needs further validation, it responds with a challenge.Understanding the challenge message: The challenge message follows the format
CRV1: <flags>:<state_id>:<username_base64>:<challenge_text>
, where:flags
: A series of optional, comma-separate flags specifying additional behavior:E
: Echo the response as the user types it.R
: Indicates that a response is required.
state_id
: An opaque string to be returned along with the response.username_base64
: The base64-encoded username of the user requesting the connection profile.challenge_text
: The challenge text (e.g., the Turing question) presented to the user.
Responding to the challenge: After displaying the challenge text to the user, the client waits for the user's response. If the
R
flag is present, the response is required. The response may be an empty string if the flag isn't present.Resubmitting the response: Once the user responds, the client resubmits the request to the server.
Validating the response: If the server successfully validates the response (e.g., '3' as the answer to the Turing test), it returns the requested connection profile, and the client can proceed with the VPN connection.
Example workflow
Initial request:
curl -u test:mypass https://ACCESS_SERVER/rest/GetUserlogin
Server response (challenge):
<Error> <Type>Authorization Required</Type> <Synopsis>REST method failed</Synopsis> <Message>CRV1:R,E:miwN39AlF4k40Fd8X8r9j74FuOoaJKJM:dGVzdA==:Turing test: what is 1 x 3? (9007)</Message> </Error>
The user responds to the challenge question, "What is 1x3?" with the answer 3.
The client resubmits the request:
curl -u "test:CRV1::miwN39AlF4k40Fd8X8r9j74FuOoaJKJM::3" https://ACCESS_SERVER/rest/GetUserlogin
The server verifies the response and returns the connection profile.
<Error> <Type>Authorization Required</Type> <Synopsis>REST method failed</Synopsis> <Message>CRV1:R,E:miwN39AlF4k40Fd8X8r9j74FuOoaJKJM:dGVzdA==:Turing test: what is 1 x 3? (9007)</Message> </Error>
curl -u "test:CRV1::miwN39AlF4k40Fd8X8r9j74FuOoaJKJM::3" https://ACCESS_SERVER/rest/GetUserlogin
Here, the username
is decoded from the username_base64
, and the state_id
and response_text
(the user's answer) are appended.
Certificate Verification
When using curl
, ensure that the Access Server web server employs a trusted certificate, such as a commercial web certificate. If you use a self-signed CA, ensure this certificate is available to curl
or any HTTPS client you're using.
The Access Server web CA certificate can be found at /usr/local/openvpn_as/etc/web-ssl/ca.crt
.
You can specify it with a curl
option:
--cacert ca.crt
Caution
While you can disable web server certificate verification using the -k
option, we discourage this practice for security reasons.
Error Handling
The REST API will return errors in an XML format (in contrast to typical REST JSON responses). These are some common error responses:
Authentication failed (invalid username/password):
<?xml version="1.0" encoding="UTF-8"?> <Error> <Type>Authorization Required</Type> <Synopsis>REST method failed</Synopsis> <Message>AUTH_FAILED: Server Agent XML method requires authentication (9007)</Message> </Error>
Permission denied (user lacks autologin privileges):
<?xml version="1.0" encoding="UTF-8"?> <Error> <Type>Internal Server Error</Type> <Synopsis>REST method failed</Synopsis> <Message>NEED_AUTOLOGIN: User 'USERNAME' lacks autologin privilege (9000)</Message> </Error>
User not enrolled for authentication:
<?xml version="1.0" encoding="UTF-8"?> <Error> <Type>Access denied</Type> <Synopsis>REST method failed</Synopsis> <Message>You must enroll this user in Authenticator first before you are allowed to retrieve a connection profile. (9008)</Message> </Error>
WebAuth fallback: An error will occur if the server is configured for web-based authentication (SAML) but a user attempts to use the REST API instead. The client should offer the option to proceed with SAML authentication.
<Error> <Type>Authorization Required</Type> <Synopsis>REST method failed</Synopsis> <Message>Ovpn-WebAuth: providername,flags</Message> </Error>