Commit Graph
70 Commits
Author SHA1 Message Date
Stanislas Lange 2f24d2aec7 Remove Dependabot configuration 2025-12-10 18:14:01 +01:00
StanislasandGitHub a4c51f9bf9 ci: add Renovate for Easy-RSA version updates (#1333)
## Summary

- Add Renovate configuration to automatically track Easy-RSA releases
- Add GitHub Action to auto-update SHA256 hash on Renovate PRs

## How it works

1. **Renovate** detects a new Easy-RSA release → creates PR updating
`EASYRSA_VERSION`
2. **GitHub Action** triggers on the PR → downloads tarball → computes
SHA256 → commits fix
3. PR is ready to merge with both version and hash updated

---

I intentionally updated to the second-to-last version in
https://github.com/angristan/openvpn-install/commit/bda450948a933224f4f779a24a44c6279e1574a1
to test if this works.
2025-12-10 18:08:54 +01:00
StanislasandGitHub b9a1650027 feat: drop Amazon Linux 2 support (#1332)
## Summary

- Remove Amazon Linux 2 support from the installer
- Amazon Linux 2023 remains fully supported

## Motivation

Amazon Linux 2 is reaching EOL.

Additionally, Amazon Linux 2 ships with **OpenSSL 1.0.2k** (from 2017)
which is incompatible with Easy-RSA 3.2.x. The newer Easy-RSA versions
use `openssl x509 -ext` which doesn't exist in OpenSSL 1.0.x, causing
certificate generation to fail.

This blocks our ability to upgrade Easy-RSA:
https://github.com/angristan/openvpn-install/commit/bda450948a933224f4f779a24a44c6279e1574a1

## Changes

- Updated OS detection to reject Amazon Linux 2 with a clear message
- Removed Amazon Linux 2 specific code paths (EPEL installation, yum
commands)
- Removed from CI test matrix
- Updated README supported distributions table
- Updated Makefile test targets
- Also, add Amazon Linux 2023 Unbound handling
2025-12-10 17:54:00 +01:00
Stanislas Lange bda450948a feat: update EasyRSA version and revoke command 2025-12-10 16:58:35 +01:00
StanislasandGitHub c0fcf91972 feat: add ChaCha20-Poly1305 cipher support (#1330)
## Summary

- Add `CHACHA20-POLY1305` as a data channel cipher option
- Add `ECDHE-*-CHACHA20-POLY1305` control channel cipher options  
- Add version check (requires OpenVPN 2.5+)
- Update README documentation

ChaCha20-Poly1305 is particularly useful on devices without hardware AES
acceleration (AES-NI), such as ARM-based devices (Raspberry Pi, etc.)
and older CPUs, where it can provide better performance than AES.

Closes #1244 Closes #190
2025-12-10 00:11:25 +01:00
StanislasandGitHub ffcffac061 refactor: improve certificate duration variable naming (#1329)
## Summary

- Rename constants to `DEFAULT_CERT_VALIDITY_DURATION_DAYS` and
`DEFAULT_CRL_VALIDITY_DURATION_DAYS` for clarity
- Replace all hardcoded `3650` values with the constants
- Split `DAYS_VALID` into `CLIENT_CERT_DURATION_DAYS` and
`SERVER_CERT_DURATION_DAYS` for more granular control over client vs
server certificate validity
- Increase CRL validity to 15 years (5475 days) to provide a 5-year
safety buffer over the default 10-year certificate validity
- Update README with new headless install variables

## Breaking changes

- `DAYS_VALID` environment variable is replaced by
`CLIENT_CERT_DURATION_DAYS` and `SERVER_CERT_DURATION_DAYS`
2025-12-09 23:33:57 +01:00
Stanislas Lange f9a544104e docs: add missing headless variables to README
Add MULTI_CLIENT and DAYS_VALID to the documented headless install
variables, matching what the script actually supports.
2025-12-09 21:55:36 +01:00
StanislasandGitHub 6b09270347 feat: add certificate renewal functionality (#1328)
## Summary

- Add certificate renewal for both client and server certificates
- Allow custom validity period during renewal (prompts user, defaults to
3650 days)
- Show expiry info inline in menus (e.g., "Renew the server certificate
(expires in 3542 days)")
- Regenerate `.ovpn` files after client renewal
- Restart OpenVPN service after server renewal
- Extract reusable helper functions to reduce code duplication
- Add robust input validation and error handling

## New menu option

```
What do you want to do?
   1) Add a new user
   2) Revoke existing user
   3) Renew certificate        ← NEW
   4) Remove OpenVPN
   5) Exit
```

## Renewal submenu

```
What do you want to renew?
   1) Renew a client certificate
   2) Renew the server certificate (expires in 3542 days)
   3) Back to main menu
```

Client list shows expiry for each:
```
Select the existing client certificate you want to renew
     1) alice (expires in 3542 days)
     2) bob (expires in 30 days)
     3) charlie (EXPIRED 5 days ago)
```

## Helper functions added

Extracted common code into reusable functions:
- `getHomeDir()` - home directory detection
- `regenerateCRL()` - CRL regeneration after cert changes
- `generateClientConfig()` - .ovpn file generation  
- `selectClient()` - client listing with optional expiry display
- `getDaysUntilExpiry()` - certificate expiry calculation
- `formatExpiry()` - human-readable expiry formatting

## Test plan

- [x] Client certificate renewal tested in Docker CI
- [x] Server certificate renewal tested in Docker CI
- [x] Certificate validity verified after renewal (~3650 days)
- [x] VPN connectivity tested with renewed certificate

Closes #974 #1002 #1228 #1060
2025-12-09 21:49:19 +01:00
Stanislas Lange fb2041d9bb Improve command logging in run_cmd function 2025-12-09 21:41:08 +01:00
StanislasandGitHub 66890fb5d3 ci: prevent duplicate workflow runs (#1324)
## Summary
- Restrict `push` trigger to `master` branch only (feature branch pushes
won't trigger CI)
- Add concurrency groups to cancel redundant runs when new commits are
pushed
- Works correctly with fork PRs using standard `pull_request` event
2025-12-09 19:47:02 +01:00
StanislasandGitHub 8bd0c73f8f Use official OpenVPN repositories for latest stable versions (#1323)
## Summary

- Install OpenVPN from official upstream repositories instead of
distribution packages
- Gets the latest stable releases with security fixes and new features
- Properly cleans up repos and GPG keys on uninstall

## Repository sources

| OS | Repository |
|---|---|
| Debian/Ubuntu | `build.openvpn.net/debian/openvpn/stable` |
| CentOS/Oracle/Fedora | Fedora Copr `@OpenVPN/openvpn-release-2.6` |
| Amazon Linux/Arch | Distribution packages (no official repo available)
|

## Changes

- Add `installOpenVPNRepo()` function to configure official repos before
package installation
- Remove duplicate package installations between repo setup and install
functions
- Clean up repos and GPG keys during uninstall
- Standardize `log_success` (`[OK]`) for major milestones only


---

Close https://github.com/angristan/openvpn-install/pull/1294
2025-12-09 19:45:56 +01:00
Stanislas Lange b23517dbb0 Fix MULTI_CLIENT prompt blocking auto-install mode
The duplicate-cn feature added an interactive prompt that wasn't
following the auto-install pattern, causing the script to hang
when running with AUTO_INSTALL=y.
2025-12-09 18:30:57 +01:00
Stanislas Lange cd0fc55bf7 docs: add duplicate-cn feature to README 2025-12-09 18:15:54 +01:00
Stanislas Lange 8a133b7bed ci: run Docker e2e tests on pull requests 2025-12-09 18:06:53 +01:00
StanislasandGitHub 004fbb477a Add structured logging system with color-coded output and file logging (#1321)
## Summary
- Add comprehensive logging system with color-coded log levels ([INFO],
[WARN], [ERROR], [OK])
- Wrap all command executions with `run_cmd()` to capture output and
prevent leaks to stdout
- Add file logging with timestamps (default: `openvpn-install.log`)
- Suppress interactive prompts in auto-install mode for cleaner
CI/scripted usage
- Show log file location hint on errors for easier debugging

## Changes
- **openvpn-install.sh**: New logging functions (`log_info`, `log_warn`,
`log_error`, `log_fatal`, `log_success`, `log_prompt`, `log_header`,
`log_menu`, `run_cmd`), all `echo` statements converted to use logging
functions
- **test/validate-output.sh**: New E2E validator that ensures all script
output uses proper log formatting (catches raw echo leaks)
- **test/server-entrypoint.sh**: Integrates output validation into
Docker tests
- **test/Dockerfile.server**: Copies validation script into container

## Configuration
- `VERBOSE=1` - Show command output in terminal
- `LOG_FILE=path` - Customize log location (default:
`openvpn-install.log`)
- `LOG_FILE=""` - Disable file logging
- `FORCE_COLOR=1` - Force colored output in non-TTY environments
2025-12-09 15:52:37 +01:00
Stanislas Lange adc4c6d220 Remove cloud provisioning solutions section from README
I don't maintain them, so I can't vouch that they work.

Close https://github.com/angristan/openvpn-install/pull/934 as well
2025-12-09 15:02:49 +01:00
Stanislas Lange 0ed153b8ec Update pull request template to clarify maintenance burden of added features 2025-12-09 14:17:19 +01:00
StanislasandGitHub a3389c126c Add Docker-based E2E testing (#1320)
### Summary
- Add automated end-to-end testing using Docker to verify the installation script works across 18 Linux distributions
- Add Oracle Linux 9 support to the installation script
- Drop support for EOL distributions (Debian 8/9/10, CentOS 7, Ubuntu 16.04) 
- Disable Digital Ocean droplets based end-to-end tests, let's use docker from now on

### Changes
**New test infrastructure:**
- `test/Dockerfile.server` - Multi-OS server image with `BASE_IMAGE` build arg
- `test/Dockerfile.client` - Ubuntu 24.04 client for connectivity testing
- `test/server-entrypoint.sh` - Runs install script, verifies files exist, asserts iptables NAT rules, starts OpenVPN
- `test/client-entrypoint.sh` - Connects to VPN, verifies tun0 interface, pings gateway
- `docker-compose.yml` - Orchestrates server + client with shared volume
- `.github/workflows/docker-test.yml` - CI matrix testing 18 OS variants
- `.github/workflows/test.yml` - Removed push/PR triggers, now manual only for DO tests
- `Makefile` - Local testing commands (`make test`, `make test-ubuntu-24.04`, etc.)

**Distributions tested (18 total):**
| Family | Versions |
|--------|----------|
| Ubuntu | 18.04, 20.04, 22.04, 24.04 |
| Debian | 11, 12 |
| Fedora | 40, 41 |
| Rocky Linux | 8, 9 |
| AlmaLinux | 8, 9 |
| Oracle Linux | 8, 9 |
| Amazon Linux | 2, 2023 |
| CentOS Stream | 9 |
| Arch Linux | latest |
2025-12-07 12:27:41 +01:00
Stanislas Lange 94c1af2b5d Remove Fedora 43 OS image from CI workflow 2025-12-04 23:18:15 +01:00
Stanislas Lange f92582fb2f Update Fedora OS images in CI workflow to include 42 and 43 2025-12-04 23:15:24 +01:00
Stanislas Lange 469bc2f883 Update OS images in CI workflow to include Debian 13 and remove 11 2025-12-04 23:12:57 +01:00
93284de7df Fix typo in FAQ
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas cc834519ff Fix path to easy-rsa tarball in checksum verification 2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas 39dd034717 Fix textlint terminology: websites -> sites 2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas fafd10687f Disable MD041 rule for template files with HTML comments 2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas 7e9a713657 Fix shfmt formatting for constant comments 2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas 6b92f8a61f Quote shell variables in test.yml to fix shellcheck warnings 2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas 62c336022f Add permissions to test.yml for security best practices 2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas cad43ad99e Add permissions to lint.yml for security best practices 2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas 3a0260e9b8 Make openvpn-install.sh executable 2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas 77f28d1595 ci: add fetch-depth: 0 for super-linter v7 compatibility
Super-linter v7 requires full git history to find the default branch
for comparison. Without fetch-depth: 0, it fails with 'master branch
doesn't exist' error.
2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas b7557dd77f refactor: extract magic numbers to named constants
Move hardcoded values to readonly constants at the top of the script:
- CERT_VALIDITY_DAYS: certificate expiry (10 years)
- CRL_VALIDITY_DAYS: CRL expiry (10 years)
- EASYRSA_VERSION: easy-rsa version
- EASYRSA_SHA256: easy-rsa checksum

This improves maintainability and makes it easier to update these
values in the future.
2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas 7304dbaac8 style: reduce shellcheck disables and fix warnings
- Remove unnecessary shellcheck disables (SC2164, SC1072, SC1073, SC1009)
- Add explanatory comments for remaining disables
- Fix SC2181: use direct exit code check instead of $?
- Fix SC2086: quote DH_KEY_SIZE variable
2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas bfcd624592 docs: fix sysctl config path in FAQ (20 -> 99)
The script uses /etc/sysctl.d/99-openvpn.conf but the FAQ
incorrectly referenced /etc/sysctl.d/20-openvpn.conf
2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas 46a295b538 docs: update security section note for OpenVPN 2.5+
Replace the warning about outdated documentation with a note
clarifying that TLS 1.2 is kept as minimum for client compatibility
while acknowledging OpenVPN 2.5+ features.
2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas bf31e0ca64 docs: fix broken workflow link (push.yml -> lint.yml)
The workflow file was renamed but the README link was not updated.
2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas 7c2c491fab ci: update appleboy/ssh-action from v0.1.6 to v1.2.0
Updates to a more recent stable version with bug fixes and
improvements.
2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas 00f3cd1605 ci: update Super Linter from v4.1.0 to v7
The super-linter project has been moved to the super-linter org
and significantly updated. v7 includes many improvements and
bug fixes.
2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas d61b16f3b8 ci: replace deprecated set-output with GITHUB_OUTPUT
The set-output workflow command was deprecated in favor of
environment files. See:
https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/
2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas 960be1a658 security: add validation for root.hints download
Verify that the downloaded root.hints file is not empty and contains
expected DNS root server content before using it.
2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas 94f0967878 security: add SHA256 checksum verification for easy-rsa download
Adds integrity verification to prevent supply chain attacks when
downloading easy-rsa from GitHub releases.
2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas 1c5381cc03 fix: correct DNS prompt range from [1-12] to [1-13]
The prompt incorrectly showed [1-12] when option 13 (Custom DNS) is valid.
2025-12-04 23:04:11 +01:00
Stanislas LangeandStanislas 74dcf67844 fix: remove duplicate echo in resolvePublicIP error message 2025-12-04 23:04:11 +01:00
Stanislas Lange 7e32f6ae83 Fix mermaid diagram in README 2025-03-15 22:52:11 +01:00
Stanislas Lange 19e4b7961f CI: add Fedora 41 and remove 39 for e2e workflow 2025-03-10 10:27:19 +01:00
Stanislas Lange e2d4990ae1 Improve README 2025-01-06 17:25:26 +01:00
Stanislas Lange dc114f3243 Update distribution matrix for end-to-end tests 2024-11-07 20:49:42 +01:00
Stanislas Lange 0d58ddcb8c Update distribution matrix for end-to-end tests 2024-11-07 20:46:51 +01:00
Stanislas Lange 2ce1ee765e Remove centos-stream-8-x64 from test workflow
Not available on DO anymore
2024-07-12 18:22:34 +02:00
StanislasandGitHub a189535563 Set client and server certificates validity to 10 years (#1235)
Prevent #974
2024-07-12 18:16:19 +02:00
Stanislas Lange 67701fac77 CI: wait for dpkg lock in debian/ubuntu setup step 2024-05-16 20:37:23 +02:00
Stanislas Lange 0cc002e17d CI: wait for dpkg lock in debian/ubuntu setup step 2024-05-16 20:33:32 +02:00
Stanislas Lange a2725d61a3 CI: update actions/checkout to v4 2024-05-16 20:13:47 +02:00
Stanislas Lange 305e9868cf CI: update linux distributions used in end-to-end tests 2024-05-16 20:08:12 +02:00
Stanislas Lange 6a127fa2b6 Enable manual trigger of actions 2024-05-16 20:02:01 +02:00
Stanislas Lange 5a4b31bd0d Fix typo in README 2023-11-20 21:21:56 +01:00
Stanislas Lange 80feebed16 Remove visitors badge 2023-01-22 16:43:13 +01:00
Stanislas Lange d096f7a3a2 Add star history 2023-01-22 16:42:48 +01:00
Stanislas Lange 33fe6af131 Update cloud providers 2023-01-22 01:55:06 +01:00
Stanislas Lange d2556ff235 Add support for CentOS 9 + update supported distributions 2023-01-22 00:57:40 +01:00
Stanislas LangeandStanislas 2f76bb5e40 Update easy-rsa to 3.1.2 and fix compatibility with Ubuntu 22.04
Based on this patch by @zerodivisi0n: https://github.com/angristan/openvpn-install/issues/1000#issuecomment-1283484772
2023-01-22 00:10:46 +01:00
Stanislas LangeandStanislas ca8d58d5f0 Fix checkout in test workflow 2023-01-22 00:10:46 +01:00
Stanislas Lange 0ac1bf4f51 Format markdown table in readme 2023-01-21 23:41:03 +01:00
Stanislas Lange 64cbbce0b7 Add OpenVPN 2.5 notice to README 2023-01-21 23:40:01 +01:00
Stanislas Lange 580c617d98 Update issue template 2023-01-21 23:18:52 +01:00
Stanislas Lange 2d0eca1a1d Update issue/PR template + contributing guidelines 2023-01-21 23:06:44 +01:00
Stanislas Lange 48f8c16d3a Add issue and PR templates 2023-01-21 23:00:30 +01:00
Stanislas Lange 2a57e89489 Public IP detection: change provider
Close #1076 #924 #1039 #925
2023-01-06 21:39:02 +01:00
Stanislas Lange 86a6d2d3e7 Revert "Use --genkey secret filename instead (#1059)"
This reverts commit 0de56f8f33.
2022-11-21 19:33:24 +01:00
StanislasandGitHub d3751457ab Remove Debian 9 in e2e tests as it has been removed by DO 2022-11-21 19:15:22 +01:00