diff --git a/actions/openvpn b/actions/openvpn
index 1d0f635b4..df2a1f3dc 100755
--- a/actions/openvpn
+++ b/actions/openvpn
@@ -49,12 +49,11 @@ verb 3
tls-server
tls-version-min 1.2
-tls-cipher TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384
-cipher AES-256-GCM
+cipher AES-256-CBC
script-security 2
'''
-CLIENT_CONFIGURATION = '''
+CLIENT_CONFIGURATION_RSA = '''
client
remote {remote} 1194
proto udp
@@ -62,7 +61,26 @@ proto udp6
dev tun
nobind
remote-cert-tls server
-cipher AES-256-GCM
+cipher AES-256-CBC
+comp-lzo
+redirect-gateway
+verb 3
+
+{ca}
+
+{cert}
+
+{key}'''
+
+CLIENT_CONFIGURATION_ECC = '''
+client
+remote {remote} 1194
+proto udp
+proto udp6
+dev tun
+nobind
+remote-cert-tls server
+cipher AES-256-CBC
redirect-gateway
verb 3
@@ -74,7 +92,6 @@ verb 3
CERTIFICATE_CONFIGURATION = {
'EASYRSA_BATCH': '1',
- 'EASYRSA_ALGO': 'ec',
'EASYRSA_DIGEST': 'sha512',
'KEY_CONFIG': '/usr/share/easy-rsa/openssl-easyrsa.cnf',
'KEY_DIR': KEYS_DIRECTORY,
@@ -90,7 +107,17 @@ CERTIFICATE_CONFIGURATION = {
'EASYRSA_REQ_NAME': 'FreedomBox'
}
-COMMON_ARGS = {'env': CERTIFICATE_CONFIGURATION, 'cwd': KEYS_DIRECTORY}
+CERTIFICATE_CONFIGURATION_RSA = {
+ 'EASYRSA_KEY_SIZE': '4096',
+ **CERTIFICATE_CONFIGURATION
+}
+
+CERTIFICATE_CONFIGURATION_ECC = {
+ 'EASYRSA_ALGO': 'ec',
+ **CERTIFICATE_CONFIGURATION
+}
+
+COMMON_ARGS = {'env': CERTIFICATE_CONFIGURATION_ECC, 'cwd': KEYS_DIRECTORY}
def parse_arguments():
@@ -111,9 +138,19 @@ def parse_arguments():
return parser.parse_args()
+def _is_using_ecc():
+ """Return whether the service is using ECC."""
+ if os.path.exists(SERVER_CONFIGURATION_PATH):
+ with open(SERVER_CONFIGURATION_PATH, 'r') as file_handle:
+ for line in file_handle:
+ if line.strip() == 'dh none':
+ return True
+ return False
+
+
def _is_setup():
"""Return whether setup is complete."""
- return any(os.path.exists(fil) for fil in [DH_PARAMS, EC_PARAMS_DIR])
+ return _is_non_empty_file(DH_PARAMS) or os.path.exists(EC_PARAMS_DIR)
def subcommand_is_setup(_):
@@ -215,13 +252,18 @@ def subcommand_get_profile(arguments):
subprocess.check_call([
'/usr/share/easy-rsa/easyrsa', 'build-client-full', username,
'nopass'
- ], **COMMON_ARGS)
+ ], env=CERTIFICATE_CONFIGURATION_ECC if _is_using_ecc() else
+ CERTIFICATE_CONFIGURATION_RSA,
+ cwd=KEYS_DIRECTORY)
user_certificate_string = _read_file(user_certificate)
user_key_string = _read_file(user_key)
ca_string = _read_file(CA_CERTIFICATE_PATH)
- profile = CLIENT_CONFIGURATION.format(ca=ca_string,
+ client_configuration = CLIENT_CONFIGURATION_ECC if _is_using_ecc(
+ ) else CLIENT_CONFIGURATION_RSA
+
+ profile = client_configuration.format(ca=ca_string,
cert=user_certificate_string,
key=user_key_string,
remote=remote_server)