Wireguard konfiguration från egen publik nyckel
Wireguard konfiguration från egen publik nyckel
Är det möjligt att få en wireguard konfiguration på nåt sätt om man har en egen privat nyckel man vill använda? Jag kan inte lägga till den privata som kommer med den skapade konfigurationsfilen.
Re: Wireguard konfiguration från egen publik nyckel
Det går men lite knepigare det närmaste vi har isåfall detta script som kan köras till mac & Linux:
https://wireguard-bahnhof.5july.net/sta ... rity-wg.sh
Har du en egen nycklar kan du ändra rad 58 till din privata nyckel
Du behöver dock först logga in med ett konto på wireguard-bahnhof.5july.net för att scriptet ska kunna acceptera din inloggnings uppgifter.
https://wireguard-bahnhof.5july.net/sta ... rity-wg.sh
Har du en egen nycklar kan du ändra rad 58 till din privata nyckel
Du behöver dock först logga in med ett konto på wireguard-bahnhof.5july.net för att scriptet ska kunna acceptera din inloggnings uppgifter.
Re: Wireguard konfiguration från egen publik nyckel
Tack. Ska testa om det funkar.
Re: Wireguard konfiguration från egen publik nyckel
Tack Markus. Det funkade bra, skrev dock om skriptet så det laddar ner konfigurationen till samma mapp man kör skriptet från om man inte är root och man kan skicka med en privat nyckel som argument att skapa konfig till. Om nån annan är i samma situation som jag...
Code: Select all
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0
#
# Copyright (C) 2016-2018 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
die() {
echo "[-] Error: $1" >&2
exit 1
}
PROGRAM="${0##*/}"
ARGS=( "$@" )
SELF="${BASH_SOURCE[0]}"
PRIVATE_KEY="$1"
[[ $SELF == */* ]] || SELF="./$SELF"
SELF="$(cd "${SELF%/*}" && pwd -P)/${SELF##*/}"
#[[ $UID == 0 ]] || exec sudo -p "[?] $PROGRAM must be run as root. Please enter the password for %u to continue: " -- "$BASH" -- "$SELF" "${ARGS[@]}"
[[ $UID == 0 ]] || echo "[?] $PROGRAM is not run as root. Saving configuration to $PWD for user $USER" \
&& echo "else exit script with ctrl-C and re-run as root, i.e with sudo, to get the configuration installed."
[[ ${BASH_VERSINFO[0]} -ge 4 ]] || die "bash ${BASH_VERSINFO[0]} detected, when bash 4+ required"
type curl >/dev/null || die "Please install curl and then try again."
type jq >/dev/null || die "Please install jq and then try again."
set -e
read -p "[?] Please enter your Integrity account username: " -r USER
read -p "[?] Please enter your IntegrityVPN password $PASS_TYPE: " -rs PASS
echo "[+] Contacting Integrity API for server locations."
declare -A SERVER_ENDPOINTS
declare -A SERVER_PUBLIC_KEYS
declare -A SERVER_LOCATIONS
declare -a SERVER_CODES
RESPONSE="$(curl -LsS https://api.5july.net/1.0/locations)" || die "Unable to connect to Integrity API."
FIELDS="$(jq -r '.[] | .hostname,.country,.city,.public_key,.dest_addr,.port' <<<"$RESPONSE")" || die "Unable to parse response."
while read -r HOSTNAME && read -r COUNTRY && read -r CITY && read -r PUBKEY && read -r IPADDR && read -r PORT; do
CODE="${HOSTNAME%-wireguard}"
SERVER_CODES+=( "$CODE" )
SERVER_LOCATIONS["$CODE"]="$CITY, $COUNTRY"
SERVER_PUBLIC_KEYS["$CODE"]="$PUBKEY"
SERVER_ENDPOINTS["$CODE"]="$IPADDR:$PORT"
done <<<"$FIELDS"
if [[ $UID == 0 ]]; then
shopt -s nocasematch
for CODE in "${SERVER_CODES[@]}"; do
CONFIGURATION_FILE="/etc/wireguard/integrity-$CODE.conf"
[[ -f $CONFIGURATION_FILE ]] || continue
while read -r line; do
[[ $line =~ ^PrivateKey\ *=\ *([a-zA-Z0-9+/]{43}=)\ *$ ]] && PRIVATE_KEY="${BASH_REMATCH[1]}" && break
done < "$CONFIGURATION_FILE"
[[ -n $PRIVATE_KEY ]] && echo "[+] Using existing private key." && break
done
shopt -u nocasematch
if [[ -z $PRIVATE_KEY ]]; then
echo "[+] Generating new private key."
PRIVATE_KEY="$(wg genkey)"
fi
else
CONFIGURATION_FILE="$PWD/integrity-$CODE.conf"
if [[ -z $PRIVATE_KEY ]]; then
echo "[+] Generating new private key for $USER."
PRIVATE_KEY="$(wg genkey)"
else
echo "[+] Using supplied private key."
fi
fi
PUBLIC_KEY="$(wg pubkey <<< $PRIVATE_KEY)"
echo "[+] Contacting Integrity API."
RESPONSE="$(curl -LsS https://api.5july.net/1.0/wireguard -X 'POST' -H "Content-Type: application/json" -d '{"username": "'$USER'", "password": "'$PASS'", "pubkey": "'$PUBLIC_KEY'"}')" || die "Could not talk to Integrity API."
#[[ $RESPONSE =~ ^[0-9a-f:/.,]+$ ]] || die "$RESPONSE"
FIELDS="$(jq -r '.success' <<<"$RESPONSE")" || die "Unable to parse response."
IFS=$'\n' read -r -d '' STATUS <<<"$FIELDS" || true
if [[ $STATUS != ok ]]; then
die "An unknown API error has occurred. Please try again later. $RESPONSE"
fi
FIELDS="$(jq -r '.dns,.ipv4,.ipv6' <<<"$RESPONSE")" || die "Unable to parse response."
IFS=$'\n' read -r -d '' DNS IPV4 IPV6 <<<"$FIELDS" || true
#ADDRESS="$RESPONSE"
#DNS="1.1.1.1"
echo "[+] Writing WriteGuard configuration files."
for CODE in "${SERVER_CODES[@]}"; do
if [[ $UID == 0 ]]; then
CONFIGURATION_FILE="/etc/wireguard/integrity-$CODE.conf"
umask 077
mkdir -p /etc/wireguard/
else
CONFIGURATION_FILE="$PWD/integrity-$CODE.conf"
fi
rm -f "$CONFIGURATION_FILE.tmp"
cat > "$CONFIGURATION_FILE.tmp" <<-_EOF
[Interface]
PrivateKey = $PRIVATE_KEY
Address = $IPV4,$IPV6
DNS = $DNS
[Peer]
PublicKey = ${SERVER_PUBLIC_KEYS["$CODE"]}
Endpoint = ${SERVER_ENDPOINTS["$CODE"]}
AllowedIPs = 0.0.0.0/0, ::/0
_EOF
mv "$CONFIGURATION_FILE.tmp" "$CONFIGURATION_FILE"
done
echo "[+] Success. The following commands may be run for connecting to Integrity:"
for CODE in "${SERVER_CODES[@]}"; do
echo "- ${SERVER_LOCATIONS["$CODE"]}:"
if [[ $UID != 0 ]]; then
echo "Copy integrity-$CODE to /etc/wireguard/ on the device with the prviate key!"
fi
echo " \$ wg-quick up integrity-$CODE"
done
echo "Please wait up to 60 seconds for your public key to be added to the servers."
Re: Wireguard konfiguration från egen publik nyckel
En av poängerna med asymmetrisk kryptering är just att publika nycklar är det enda som ska delas med andra. Vad jag förstår på denna tråd och efter att ha läst på lite om tekniken så sker detta inte normalt hos Integrity utan såväl publik som hemlig nyckel för klienten genereras hos Integrity. Det innebär principiellt att säkerheten inte blir optimal.
Jag skulle gärna se en liten notis om det på era hemsidor. Man skulle kunna uttrycka det positivt:
Nu har jag skapat ett par konfigurationsfiler redan och vad jag förstår så kan man skapa fler än fem st men först in först ut gäller då. För att nu spola bort de suboptimala konfigurationsfilerna jag skapat så tänker jag att det borde gå bra att använda kesos skript och generera fem nya konfigurationsfiler såhär:
Nu tycker jag det borde vara möjligt att via webscript fixa det här under förutsättning att kilenten har den mjukvara som behövs. I så fall kan man tänka sig olika webformulär för Linux/Mac och ett särskilt för Windows.
Jag skulle gärna se en liten notis om det på era hemsidor. Man skulle kunna uttrycka det positivt:
Och så någon länk till hur man gör. Man skulle även kunna säga något i stil med att:För dem som använder Linux eller Mac är det möjligt att ytterligare förbättra konfigurationen.
.Använder du Windows kanske du kan be någon bekant som använder Linux eller Mac att hjälpa dig.
Nu har jag skapat ett par konfigurationsfiler redan och vad jag förstår så kan man skapa fler än fem st men först in först ut gäller då. För att nu spola bort de suboptimala konfigurationsfilerna jag skapat så tänker jag att det borde gå bra att använda kesos skript och generera fem nya konfigurationsfiler såhär:
- 1 Skapa eget nyckelpar
- 2 Kör skriptet och peka ut den publika nyckeln
- 3 Spara konfigurationsfilen till ett nytt namn exvis integrity1_vpn.conf
Nu tycker jag det borde vara möjligt att via webscript fixa det här under förutsättning att kilenten har den mjukvara som behövs. I så fall kan man tänka sig olika webformulär för Linux/Mac och ett särskilt för Windows.
Re: Wireguard konfiguration från egen publik nyckel
Markus!
Försökte nyss använda kesos skript efter att ha skapat en privat nyckel med
Det fungerar inte och ger följande felmeddelande:
wg: Key is not the correct length or format
Försökte då med det skript du pekade ut, Markus, efter att ha editerat rad 58 till PRIVATE_KEY=privatekey1
Det fungerar inte heller men det blir lite mera felmeddelanden:
Är det missmatch mellan versionerna på wireguard? Jag kör wireguard Version: 1.0.20200513-1~18.04 på Linux Mint 19.1.
Tacksam för hjälp.
Försökte nyss använda kesos skript efter att ha skapat en privat nyckel med
Code: Select all
umask 077 && wg genkey > privatekey1
wg: Key is not the correct length or format
Försökte då med det skript du pekade ut, Markus, efter att ha editerat rad 58 till PRIVATE_KEY=privatekey1
Det fungerar inte heller men det blir lite mera felmeddelanden:
Code: Select all
wg: Key is not the correct length or format
[-] Error: An unknown API error has occurred. Please try again later. {
"error": {
"error_code": 4001,
"error_name": "WireguardPubKeyInvalid",
"http_code": 422,
"innerError": {},
"message": "Invalid public key"
}
}
Tacksam för hjälp.
Re: Wireguard konfiguration från egen publik nyckel
Hej.
Behöver skriptet några ändringar för att fungera så här några år senare?
Får "403 Forbidden" som svar på: curl -LsS https://api.5july.net/1.0/wireguard -X 'POST' -H ....
Har URL'n ändrats eller går det inte att skapa config från egen privat nyckel längre?
Tack på förhand.
/keso
Behöver skriptet några ändringar för att fungera så här några år senare?
Får "403 Forbidden" som svar på: curl -LsS https://api.5july.net/1.0/wireguard -X 'POST' -H ....
Har URL'n ändrats eller går det inte att skapa config från egen privat nyckel längre?
Tack på förhand.
/keso
Re: Wireguard konfiguration från egen publik nyckel
Jag besvarar min egen fråga här.
Vad som behövs nu (det här blir ingen konfigurationsfil):
Återkommer med ett skript som sparar till fil när jag haft tid att fixa ett, om nån behöver.
Vad som behövs nu (det här blir ingen konfigurationsfil):
Code: Select all
PUBLIC_KEY="....."
URL="https://wg.5july.net/ajax/user"
CODE="SE" # US, UK, FI
HEADER="Content-Type: application/x-www-form-urlencoded; charset=UTF-8"
DATA="username=${USER}&password=${PASS}&location=${CODE}&pubkey=${PUBLIC_KEY}"
curl -LsS -H "${HEADER}" -d "${DATA}" "${URL}"
Re: Wireguard konfiguration från egen publik nyckel
Här kommer ett fungerande skript, för mig i alla fall, ska snygga till det när jag får tid.
Om man kör det utan argument så måste man fylla i användare, lösenord och privat wireguard nyckel.
Som standard får man en konfig för svenska servern med filnamn "integrity-SE.conf"
Om nåt är oklart eller inte funkar som förväntat, ställ en fråga...
En del av argumenten som finns att skicka med:
Har säkert missat nåt, men här är det.
Om man kör det utan argument så måste man fylla i användare, lösenord och privat wireguard nyckel.
Som standard får man en konfig för svenska servern med filnamn "integrity-SE.conf"
Om nåt är oklart eller inte funkar som förväntat, ställ en fråga...
En del av argumenten som finns att skicka med:
Code: Select all
sh path/to/script.sh [--generate|-g] [--user|-u <username>] [--qrencode|-q] [--code|-c <SE,US,UK,FI>]
Code: Select all
#!/bin/sh
VERBOSE=""
QR=""
LOC_URL="https://api.5july.net/1.0/locations"
CONF_URL="https://wg.5july.net/ajax/user"
CODE="SE"
die() {
printf "[-] Error: %s\n" "${1}" >&2
[ -n "${2}" ] && printf "[-] %s\n" "${2}" >&2
exit 1
}
prereq() {
for prer in curl jq qrencode; do
type "${prer}" >/dev/null || die "Please install ${prer} and then try again."
done
if [ -n "${QR}" ] ; then
type qrencode >/dev/null || die "qrencode is needed for the --qr|-q arg.\n"
fi
}
locations_show() {
printf "\n[+] Contacting Integrity API for server locations.\n"
LOCATIONS="$(curl -LsS "${LOC_URL}")" || die "Unable to connect to API at:" "${LOC_URL}"
echo "${LOCATIONS}"|jq -c '.[]'|jq -c '[ .country, .country_code, .city, .hostname, .dest_addr, .port, .public_key ]'
}
while [ "${#}" -gt 0 ] ; do
case "${1}" in
--user|-u)
shift
USER="${1}" ;;
--password|-p)
shift
PASS="${1}" ;;
--key|-k)
shift
KEY="${1}" ;;
--env|-e)
shift
ENV="${1}" ;;
--code|-c)
shift
CODE="${1}";;
--filename|-f)
shift
CONFIGURATION_FILE="${1}" ;;
--locations|-l)
locations_show
exit 0 ;;
--verbose|-v)
VERBOSE="1" ;;
--generate|-g)
GENERATE="1" ;;
--qrencode|-q)
QR="1";;
--)
break;;
*)
die "Unknown arg!" ;;
esac
shift
done
[ -n "${VERBOSE}" ] && printf "[+] Get wireguard conf.\n"
set -e
prereq
if [ -n "${ENV}" ] && [ -f "${ENV}" ]; then
. "${ENV}"
fi
if [ -n "${GENERATE}" ]; then
KEY="$(wg genkey)"
fi
if [ -z "${USER}" ]; then
printf "[?] Enter Integrity account username: "
read -r USER
fi
# make this not echo
STTY_CONF="$(stty --save)"
trap 'stty ${STTY_CONF}' EXIT INT TERM
stty -echo
if [ -z "${PASS}" ]; then
printf "[?] Enter IntegrityVPN password: "
read -r PASS
printf "\n"
fi
if [ -z "${KEY}" ]; then
printf "[?] Enter PRIVATE key: "
read -r KEY
printf "\n"
fi
stty "${STTY_CONF}"
# make this echo
PUBLIC_KEY="$(printf "%s\n" "${KEY}" | wg pubkey)"
[ -n "${VERBOSE}" ] && printf "[+] Contacting Integrity API.\n"
HEADER="Content-Type: application/x-www-form-urlencoded; charset=UTF-8"
DATA="username=${USER}&password=${PASS}&location=${CODE}&pubkey=${PUBLIC_KEY}"
[ -n "${VERBOSE}" ] && printf "[+] Header: %s\n" "${HEADER}"
[ -n "${VERBOSE}" ] && printf "[+] Data: %s\n" "${DATA}"
RESPONSE="$(curl -LsS -H "${HEADER}" -d "${DATA}" "${CONF_URL}")"
[ -n "${VERBOSE}" ] && printf "[+] Resulting answer.\n"
[ -n "${VERBOSE}" ] && printf "%s\n" "${RESPONSE}" | jq -r '.'
OK="$(echo "${RESPONSE}" | jq -r '.success')"
if [ "${OK}" = "ok" ]; then
[ -n "${VERBOSE}" ] && printf "[+] API Success.\n"
else
die "API Response Failure." "${RESPONSE}"
fi
DNS="$(echo "${RESPONSE}" | jq -r '.dns')"
IPV4="$(echo "${RESPONSE}" | jq -r '.ipv4')"
IPV6="$(echo "${RESPONSE}" | jq -r '.ipv6')"
ENDPOINT="$(echo "${RESPONSE}" |jq -r '.endpoint')"
SERVER_KEY="$(echo "${RESPONSE}" |jq -r '.public_key')"
[ -n "${VERBOSE}" ] && printf "[+] Writing WriteGuard configuration files.\n\n"
umask 077
OUT="${CONFIGURATION_FILE:-integrity}-${CODE}"
rm -f "${OUT}.tmp"
cat > "${OUT}.tmp" <<-_EOF
[Interface]
PrivateKey = ${KEY}
Address = ${IPV4},${IPV6}
DNS = ${DNS}
[Peer]
PublicKey = ${SERVER_KEY}
Endpoint = ${ENDPOINT}
AllowedIPs = 0.0.0.0/0, ::/0
_EOF
unset KEY
while [ -f "${OUT}.conf" ]; do
printf "[!] Configurationfile already exist: (%s)\n" "${OUT}"
printf "[?] Enter a new name: "
read -r OUT
done
mv "${OUT}.tmp" "${OUT}.conf"
if [ -n "${QR}" ]; then
[ -n "${VERBOSE}" ] && printf "[+] Saving qr image as %s-qr.png:\n" "${OUT}"
qrencode -t ansiutf8 -r "${OUT}.conf"
qrencode -t png -o "${OUT}-qr.png" -r "${OUT}.conf"
fi
[ -n "${VERBOSE}" ] && printf "[+] The following commands may be run for connecting to Integrity:\n"
[ -n "${VERBOSE}" ] && printf "[+] \$ doas wg-quick up %s.conf\n" "${OUT}"
[ -n "${VERBOSE}" ] && printf "Please wait for your public key to be added to the servers.\n"