New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.
Already on GitHub?
Sign in
to your account
Closed
jeh1138 opened this issue
Dec 11, 2019
· 15 comments
Closed
Can’t open /pki/private/ca.key for reading
#343
jeh1138 opened this issue
Dec 11, 2019
· 15 comments
Assignees
Comments
I’m very new to this. I was walking through the documentation to set up key for AWS VPN connectivity. I was able to generate the pki/ca.cert and pki/private/ca.key files from the command:
$ ./easyrsa build-ca nopass
Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019
Generating RSA private key, 2048 bit long modulus (2 primes)
.........................................+++++
......+++++
e is 65537 (0x010001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:CaCert
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/c/Users/UserName/Documents/GitHub/easy-rsa/easyrsa3/pki/ca.crt
But then when I tried to generate the server I got this error:
$ ./easyrsa build-server-full server nopass
Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019
Generating a RSA private key
.......................................................................................+++++
................+++++
writing new private key to 'C:/Users/UserName/Documents/GitHub/easy-rsa/easyrsa3/pki/easy-rsa-1637.0cW49K/tmp.aXbXnh'
Using configuration from C:/Users/UserName/Documents/GitHub/easy-rsa/easyrsa3/pki/easy-rsa-1637.0cW49K/tmp.F6XL0C
Can't open /c/Users/UserName/Documents/GitHub/easy-rsa/easyrsa3/pki/private/ca.key for reading, No such file or directory
19016:error:02001003:system library:fopen:No such process:../openssl-1.1.1d/crypto/bio/bss_file.c:69:fopen('/c/Users/UserName/Documents/GitHub/easy-rsa/easyrsa3/pki/private/ca.key','r')
19016:error:2006D080:BIO routines:BIO_new_file:no such file:../openssl-1.1.1d/crypto/bio/bss_file.c:76:
unable to load CA private key
Easy-RSA error:
signing failed (openssl output above may have more detail)
Easy-RSA error:
Failed to sign 'server'
I found an article on the AWS forums where the workaround was to use a Linux box to run the command. I’m not sure if I need to install/setup anything special on my Windows 10 box to get this to run correctly.
[https://forums.aws.amazon.com/thread.jspa?threadID=308532]
Any help is appreciated. I’m a n00b with OpenVPN and easy-rsa. The files are definitely in the target folders and I have full administrative access. I even ran Git Bash as an administrator so I’m guessing it’s not a permissions issue.
—j
I had the same problem.
Environment
- git version 2.25.0.windows.1
- OpenSSL 1.1.1d
- EasyRSA-3.0.5, EasyRSA-3.0.6
Error Message
$ ./easyrsa sign-req server server
Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019
You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
Request subject, to be signed as a server certificate for 1080 days:
subject=
commonName = server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Using configuration from ./safessl-easyrsa.cnf
Can't load /c/easyrsa/EasyRSA-Windows-3.0.5/EasyRSA-3.0.5/pki/.rnd into RNG
16336:error:2406F079:random number generator:RAND_load_file:Cannot open file:../openssl-1.1.1d/crypto/rand/randfile.c:98:Filename=/c/easyrsa/EasyRSA-Windows-3.0.5/EasyRSA-3.0.5/pki/.rnd
Can't open /c/easyrsa/EasyRSA-Windows-3.0.5/EasyRSA-3.0.5/pki/private/ca.key for reading, No such file or directory
16336:error:02001003:system library:fopen:No such process:../openssl-1.1.1d/crypto/bio/bss_file.c:69:fopen('/c/easyrsa/EasyRSA-Windows-3.0.5/EasyRSA-3.0.5/pki/private/ca.key','r')
16336:error:2006D080:BIO routines:BIO_new_file:no such file:../openssl-1.1.1d/crypto/bio/bss_file.c:76:
unable to load CA private key
Cannot write random bytes:
16336:error:24070079:random number generator:RAND_write_file:Cannot open file:../openssl-1.1.1d/crypto/rand/randfile.c:233:Filename=/c/easyrsa/EasyRSA-Windows-3.0.5/EasyRSA-3.0.5/pki/.rnd
Easy-RSA error:
signing failed (openssl output above may have more detail)
Solution
My solution is to use EasyRSA-3.0.4.
EasyRSA-3.0.4 doesn’t happen the same problem, and successfully finish.
$ ./easyrsa build-server-full server nopass
Generating a RSA private key
........................................................................................+++++
....................................................................................................................+++++
writing new private key to 'C:/easyrsa/EasyRSA-3.0.4/EasyRSA-3.0.4/pki/private/server.key.BhKPLLJauT'
-----
Using configuration from ./openssl-easyrsa.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'server'
Certificate is to be certified until Feb 14 07:56:06 2030 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
$ ls pki/issued/
server.crt
Does this still occur in v3.0.7 or master?
I have the same problem.
v3.0.8
$ ./easyrsa sign-req server server
Note: using Easy-RSA configuration from: /c/xampp/htdocs/easy-rsa/easyrsa3/vars
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
Request subject, to be signed as a server certificate for 825 days:
subject=
commonName = server
Type the word ‘yes’ to continue, or any other input to abort.
Confirm request details: yes
Using configuration from C:/xampp/htdocs/easy-rsa/easyrsa3/pki/easy-rsa-2056.sA4wMj/tmp.1kojG0
Can’t open /c/xampp/htdocs/easy-rsa/easyrsa3/pki/private/ca.key for reading, No such file or directory
12448:error:02001003:system library:fopen:No such process:../openssl-1.1.1g/crypto/bio/bss_file.c:69:fopen(‘/c/xampp/htdocs/easy-rsa/easyrsa3/pki/private/ca.key’,’r’)
12448:error:2006D080:BIO routines:BIO_new_file:no such file:../openssl-1.1.1g/crypto/bio/bss_file.c:76:
unable to load CA private key
Easy-RSA error:
signing failed (openssl output above may have more detail)
Does anyone have a solution?
I found a workaround, you can pass in the pki-dir option as a windows-style directory and things seem to work:
./easyrsa3/easyrsa —pki-dir=»C:/Users/username/IdeaProjects/easy-rsa/pki» build-server-full server nopass
Thank you @dredwolff it works, I had the same problem with sign-req
but your solution helps!
Thank you @dredwolff it works, I had the same problem with
sign-req
but your solution helps!
@DmitriyBobrovskiy Can you please tell me how did you resolve that using sign-req
?
@DmitriyBobrovskiy Can you please tell me how did you resolve that using
sign-req
?
I used the solution provided by @abstractBoyd (probably he was a @dredwolff before):
./easyrsa --pki-dir="c:/Users/username/EasyRSA-3.0.8/pki/" sign-req client client1
Please ignore the Mention above, that was an error.
This appears to be a Windowz problem.
Windowz is creating file names in the following format:
/c/xampp/htdocs/easy-rsa/easyrsa3/pki/private/ca.key
EasyRSA Windows tool-chain does not recognise that file-name.
This is why the work-around using --pki-dir=foo
works, because it manually sets up the full path using a recognised format.
The first requirement to solving this, is to establish the Windows environment that easyrsa
is being run by.
For starters, the version of Windows.
For the record, easyrsa
does not work correctly using git-bash
for Windowz.
However, this file-name
problem can be solved.
./easyrsa —pki-dir=»D:/easy-rsa/easyrsa3/pki» build-server-full server nopass
This is perfectly working windows also.
Please try again with current git/master
.
Please reopen if not fixed via #528
Модератор: SLEDopit
-
Sapphire
- Сообщения: 17
Решено: Openssl
При создании сертификата получаю такую ошибку
openssl ca -extfile /etc/ssl/openssl.cnf -extensions server -out certs/Cserv.pem -infiles req/Rserv.pem
Using configuration from /etc/ssl/openssl.cnf
Error opening CA private key ./demoCA/private/cakey.pem
630:error:02001002:system library:fopen:No such file or directory:bss_file.c:278:fopen(‘./demoCA/private/cakey.pem’,’r’)
630:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:280:
unable to load CA private key
Самое интересное ищу /demoCA/private/cakey.pem и не нахожу
Slackware 10.2 KDE 3.4.2 Intel Pentium4 2.4*512*GeForce Ti 4800
Slackware 10.2 shell Intel Pentium4 2.0*256*MX400
Gentoo 2005.1 KDE 3.4.3 Intel Pentium4 2.4*512*GeForce Ti 4800
FreeBSD 6.0 Intel Pentium4 2.4*512*GeForce Ti 4800
Gentoo 2005.1 shell Intel Pentium4 2.8*768*MX400
-
shrikes
- Сообщения: 126
- ОС: Gentoo Linux
Re: Решено: Openssl
Сообщение
shrikes » 01.08.2006 18:31
Sapphire писал(а): ↑
09.07.2006 00:55
При создании сертификата получаю такую ошибку
openssl ca -extfile /etc/ssl/openssl.cnf -extensions server -out certs/Cserv.pem -infiles req/Rserv.pemUsing configuration from /etc/ssl/openssl.cnf
Error opening CA private key ./demoCA/private/cakey.pem
630:error:02001002:system library:fopen:No such file or directory:bss_file.c:278:fopen(‘./demoCA/private/cakey.pem’,’r’)
630:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:280:
unable to load CA private keyСамое интересное ищу /demoCA/private/cakey.pem и не нахожу
А ты попробуй указывать абсолютные пути к файлам….
-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
-
Контактная информация:
Re: Решено: Openssl
Сообщение
Naruto-kun » 05.01.2010 08:19
Помогите разобраться с openssl, в частности работа с эцп.
Решил протестировать на обычном компьютере с genoo на борту.
Перекопав немного литературы и следуя последним сообщениям сделал для теста так:
Код: Выделить всё
# echo "test file" > 1.txt
# openssl genrsa -out CAkey.pem -rand randfile -des3 4096
# openssl req -new -x509 -key CAkey.pem -out CAcert.pem -days 365 -config cfg
# openssl smime -sign -inkey CAkey.pem -signer CAcert.pem -outform pem -nodetach -in 1.txt -out 1.txt.sig
1)Потом если пробую так:
Код: Выделить всё
# openssl smime -verify -inform pem -in 1.txt.sig -signer user.pem -out 1.sm.txt
Выдаёт:
Код: Выделить всё
Verification failure
16575:error:21075075:PKCS7 routines:PKCS7_verify:certificate verify error:pk7_smime.c:244:Verify error:self signed certificate
2)А если пробую так:
Код: Выделить всё
# openssl smime -verify -in 1.txt.sig -out 1.sm.txt
Выдаёт:
Код: Выделить всё
Error reading S/MIME message
16578:error:2107A087:PKCS7 routines:SMIME_read_PKCS7:no content type:pk7_mime.c:296:
Если верить вики:
И если я правильно всё понял. То получается так:
(1)Signing:
1) Хэшируем сообщение -> получаем хэш сообщения(ХС).
2) Шифруем ХС с помощью закрытого ключа -> получаем зашифрованный хэш сообщения(ЗХС) (Сигнатура)
3) ЗХС объеденяется с сертификатом -> [ЗХС+Серт]
4) И получивишимся [ЗХС+Серт] подписываем сообщение
(2)Verification:
1) Разделяем сообщение на сообщение и сигнатуру
2) Хэшируем сообщение получаем хэш (Х1)
3) Декодируем сигнатуру получая хэш (Х2)
4) Сравниваем Х1 и Х2, если всё верно — проверку прошли, иначе нет.
Вот и интересует, почему же у меня ошибки и как возможно сделать с помощью openssl, то что на вики(картинке), если ей конечно можно верить
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
-
Ленивая Бестолочь
- Бывший модератор
- Сообщения: 2760
- ОС: Debian; gentoo
Re: Решено: Openssl
Сообщение
Ленивая Бестолочь » 05.01.2010 14:24
Naruto-kun писал(а): ↑
05.01.2010 08:19
16575:error:21075075:PKCS7 routines:PKCS7_verify:certificate verify error:pk7_smime.c:244:Verify error:self signed certificate
ну, вам сказали, что это самоподписаный сертификат. плохо, но, смотря зачем будете его использовать.
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
- Контактная информация:
Re: Решено: Openssl
Сообщение
Naruto-kun » 05.01.2010 15:00
Ленивая Бестолочь писал(а): ↑
05.01.2010 14:24
Naruto-kun писал(а): ↑
05.01.2010 08:19
16575:error:21075075:PKCS7 routines:PKCS7_verify:certificate verify error:pk7_smime.c:244:Verify error:self signed certificate
ну, вам сказали, что это самоподписаный сертификат. плохо, но, смотря зачем будете его использовать.
рис.1.
Вообще необходимо реализовать схему, показанную на рисунке (рис.1.), средствами openssl.
Например, сделать 3 баш скрипта:
1-ый скрипт:
1) Создание корневого сертификата
2) Генерация секретного и открытого(на основе секретного) ключей
3) Создание доверенного сертификата
2-ый скрипт(Выполнение левой части рисунка(рис.1.)):
1) Хэширование данных(в данном случае текстовое сообщение/текстовый файл) (ХД)
2) Подписывание(кодирование) хэша секретным ключом (ПХСК)
3) Именно объедение(а не подписывание) сертификата(насколько я понимаю доверенного) и ПХСК (СртПХСК).
4) Присоедение(Объедение) СртПХСК и данных (СртПХСК_Данные)
3-ый скрипт(Выполнение правой части рисунка(рис.1.)):
1) Разбитие (СртПХСК_Данные) на Сертификат, ПХСК и данные
2.1) Хэширование данных
2.2) Дэподписывание(декодирование) ПХСК с целью получения хэша данных
3) Сравнение хэшей
4) Вывод результата: хэши равны или хэши не равны.
Описал, схему, как я её понял.
Но для начала и достаточно бы просто подписать данные, и потом проверить.
PS. И насколько я понимаю, лучше всего скажем подписывать доверенным сертификатом, а проверять уже корневым?
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
- Контактная информация:
Re: Решено: Openssl
Сообщение
Naruto-kun » 07.01.2010 16:57
Пока так и не разобрался. Буду рад любым советам.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
-
Naruto-kun
- Сообщения: 228
- Статус: небритый гентушник
- ОС: Gentoo(PC)/easypeasy(Netbook)
- Контактная информация:
Re: Решено: Openssl
Сообщение
Naruto-kun » 08.01.2010 18:41
Сам разобрался.
Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.
Доброго времени суток, дорогие читатели. Сегодня поговорим про такие вещи, как установка и настройка OpenVPN.
В прошлых статьях (раз, два) я рассказывал о том, что такое VPN и как его проверить в деле.
Прежде, чем приступить непосредственно к настройке всего этого хозяйства, сначала разберем как это будет работать. Рассмотрим два примера.
Пример первый:
Мы хотим подключиться к нашей домашней сети и использовать домашние же ресурсы. Дома у нас Windows, на работе/отдыхе/где-то еще у нас тоже Windows.
Пример второй:
Мы хотим весь свой трафик передавать через домашний VPN сервер. Дома у нас Windows, на котором крутится виртуальная машина на Debian 8. Который и будет выступать в роли VPN сервера.
А теперь рассмотрим эти примеры более детально.
Приступим.
-
Схема сети для первого VPN-примера
-
Установка и настройка VPN cервера на основе OpenVPN для первого примера
-
Двигаемся далее — защищенное соединение
-
Корректировки скрипта OpenVPN
-
Конфигурация сервера OpenVPN
-
Настройка клиента OpenVPN для первого примера
-
Настройка файлового хранилища на базе Debian
-
Прописываем маршрут OpenVPN
-
Схема сети для второго примера VPN
-
Настройка OpenVPN сервера для второго примера
-
Настройка VPN-клиента для второго примера
-
Послесловие
Схема сети для первого VPN-примера
У нас сеть домашний компьютер на Windows 10 x64, на нем развернута виртуалка на Debian 8, которая будет использоваться в качестве файлового хранилища, и рабочий ноутбук на Windows 10. Мы хотим с рабочего ноутбука подключиться к домашнему компьютеру и иметь доступ ко всем локальным ресурсам домашней сети.
На маршрутизаторе мы имеем внешний адрес 87.215.46.32, внутренний адрес 192.168.1.1. на домашнем компе мы имеем внутренний адрес 192.168.1.2, а также 192.168.94.2 для подсети VMWare. На виртуальном компе мы имеем адрес 192.168.94.110 и именно этот адрес нам понадобится для удаленного доступа к серверу. В качестве VPN подсети я выбрал 10.10.20.0 с префиксом /24 (маска 255.255.255.0):
Теперь давайте приступим к настройке.
к содержанию ↑
Установка и настройка VPN cервера на основе OpenVPN для первого примера
Скачиваем клиент отсюда (выбираем Installer (32-bit), Windows Vista and later или Installer (64-bit), Windows Vista and later).
На этапе выбора куда, собственно, все это ставить, я бы рекомендовал указать директорию, у которой путь идет без пробелов (например C:), т.к. могут быть проблемы с работой некоторых скриптов. На этапе выбора компонент обязательно указываем OpenSSL Utilities и OpenVPN RSA Certificate Management Scripts:
Устанавливаем. В процессе установки адаптера может появиться сообщение о необходимости установить VPN драйвер. Соглашаемся и жмем «Установить«:
Как только все установили, можно приступить к настройке.
Небольшой ликбез по технологии работы VPN, чтобы вы понимали для чего мы делаем те или иные действия.
Для того, чтобы создать защищенное соединение, в OpenVPN используется аутентификация на цифровых сертификатах стандарта Х.509.
- Цифровой сертификат представляет собой специальный файл, при помощи которого, например, сайт показывает, что ему можно доверять, или вы можете подписать сертификатом почтовое сообщение/документ и отправить его другому человеку, который по этому сертификату поймет, что файл действительно пришел от вас, а не от кого-то другого, и при этом он не был изменен;
- Цифровой сертификат невозможно подделать, но можно попытаться подменить (но это легко определить, посмотрев кем был выдан такой сертификат). Любой сертификат веб-сайта или организации подписывается вышестоящим по иерархии сертификатом (сертификатом удостоверяющего центра).
При этом, существуют специальные организации, которые выдают сертификаты конечным потребителям. Такой сертификат есть у любого сайта, поддерживающего протокол HTTPS. Например, открываете сайт gosuslugi.ru и видите, что напротив HTTPS висит замочек:
Тыкаете на него и видите свойства сертификата. Можете там же просмотреть сам сертификат и узнать кем он был выпущен:
У VPN ситуация похожая. Но здесь не только у сервера есть сертификат, но и у клиента. Они обмениваются этими сертификатами и проверяют сертификат партнера с помощью сертификата УЦ (Удостоверяющего центра, которым у нас выступает сервер) и таким образом определяют что партнеру можно доверять.
к содержанию ↑
Двигаемся далее — защищенное соединение
Так что для организации защищенного соединения между клиентом и серверов минимальный набор будет состоять из:
- Сертификат УЦ (CA);
- Сертификат сервера;
- Сертификат клиента;
- Закрытый ключ УЦ;
- Закрытый ключ сервера;
- Закрытый ключ клиента;
- Ключевая последовательность Диффи-Хеллмана. Про сам алгоритм я расписывать не буду, если есть желание, можно глянуть этот ролик. Там довольно простым языком рассказывают о нем
Переходим в директорию с программой и идем в папку easy-rsa (у меня она находится в E:OpenVPNeasy-rsa).
Там у нас куча скриптов (которые у меня несколько криво работали), но я составил из них один скрипт (не люблю когда куча файлов), в котором есть всё необходимое и которым Можете воспользоваться и Вы.
Создайте текстовый файлик под названием, например, generate-all, вставьте туда следующее содержимое:
@echo off rem SETLOCAL enabledelayedexpansion rem fullfill the vars under '-------' lines :START rem -------------VARS-------------- rem Edit this variable to point to rem the openssl.cnf file included rem with easy-rsa. set PATH="E:program filesOpenVPN" set KEY_CONFIG=%PATH%easy-rsaopenssl-1.0.0.cnf rem Edit this variable to point to rem your soon-to-be-created key rem directory. rem rem WARNING: clean-all will do rem a rm -rf on this directory rem so make sure you define rem it correctly! set KEY_DIR=E:certs rem Increase this to 2048 if you rem are paranoid. This will slow rem down TLS negotiation performance rem as well as the one-time DH parms rem generation process. set KEY_SIZE=1024 rem These are the default values for fields rem which will be placed in the certificate. rem Change these to reflect your site. rem Don't leave any of these parms blank. set KEY_COUNTRY=RU set KEY_PROVINCE=CA set KEY_CITY=Moscow set KEY_ORG=barnak-VPN set KEY_EMAIL=mail set KEY_CN=barnak-CA set KEY_NAME=name set KEY_OU=ou set PKCS11_MODULE_PATH=path set PKCS11_PIN=pin rem ---------------------------------------- rem ------------INIT SCRIPT----------------- rem delete the KEY_DIR and any subdirs quietly IF NOT EXIST %KEY_DIR% mkdir %KEY_DIR% IF NOT EXIST %KEY_DIR%index.txt ( rem copy in a fesh index file so we begin with an empty database copy index.txt.start %KEY_DIR%index.txt rem copy in a fresh serial file so we begin generating keys at index 01 copy serial.start %KEY_DIR%serial. ) rem ----------------------------------------- echo. echo Enter action: echo 1 - Create CA certificate echo 2 - Create DH file echo 3 - Create Server Certficate echo 4 - Create Client Certficate echo 0 - Exit set /P act="" IF %act% == 1 ( goto GEN-CA ) else IF %act% == 2 ( goto GEN-DH ) else IF %act% == 3 ( goto SRV-CRT ) else IF %act% == 4 ( goto CLIENT-CRT ) else IF %act% == 0 ( goto EXIT ) else ( echo ERROR: Invalid action! goto START ) :GEN-CA rem build a cert authority valid for ten years, starting now %PATH%binopenssl req -days 3650 -nodes -new -x509 -keyout %KEY_DIR%ca.key -out %KEY_DIR%ca.crt -config %KEY_CONFIG% if ERRORLEVEL 0 echo CA certificate succesfully created goto START :GEN-DH rem build a dh file for the server side %PATH%binopenssl dhparam -out %KEY_DIR%/dh%KEY_SIZE%.pem %KEY_SIZE% if ERRORLEVEL 0 echo DH file succesfully created goto START :SRV-CRT set /P SRV_NAME="Enter Server Name: " IF [%SRV_NAME%] == [] ( echo ERROR: Server name must not be empty! goto SRV-CRT ) set KEY_CN=%SRV_NAME% rem build a request for a cert that will be valid for ten years %PATH%binopenssl req -days 3650 -nodes -new -keyout %KEY_DIR%%SRV_NAME%.key -out %KEY_DIR%%SRV_NAME%.csr -config %KEY_CONFIG% rem sign the cert request with our ca, creating a cert/key pair %PATH%binopenssl ca -days 3650 -out %KEY_DIR%%SRV_NAME%.crt -in %KEY_DIR%%SRV_NAME%.csr -extensions server -config %KEY_CONFIG% rem delete any .old files created in this process, to avoid future file creation errors del /q %KEY_DIR%*.old IF NOT ERRORLEVEL 0 echo ERROR! goto START :CLIENT-CRT set /P CLIENT_NAME="Enter Client Name: " IF [%CLIENT_NAME%] == [] ( echo ERROR: Client Name must not be empty! goto CLIENT-CRT ) set KEY_CN=%CLIENT_NAME% rem build a request for a cert that will be valid for ten years %PATH%binopenssl req -days 3650 -nodes -new -keyout %KEY_DIR%%CLIENT_NAME%.key -out %KEY_DIR%%CLIENT_NAME%.csr -config %KEY_CONFIG% rem sign the cert request with our ca, creating a cert/key pair %PATH%binopenssl ca -days 3650 -out %KEY_DIR%%CLIENT_NAME%.crt -in %KEY_DIR%%CLIENT_NAME%.csr -config %KEY_CONFIG% rem delete any .old files created in this process, to avoid future file creation errors del /q %KEY_DIR%*.old IF NOT ERRORLEVEL 0 echo ERROR! goto START :EXIT
После этого сохраните скрипт как .bat файл (либо просто поменяйте ему расширение на .bat).
к содержанию ↑
Корректировки скрипта OpenVPN
Теперь надо внести некоторые корректировки в этот скрипт. Нас интересуют следующие строчки:
set PATH="E:OpenVPN"
Где мы указываем папку с программой (путь).
set KEY_DIR=C:certs
Внимание! В этой строчке укажите папку, где будут храниться ваши сертификаты. При этом в пути до папки не должно быть пробелов. С ними наблюдаются проблемы.
Идем дальше.
set KEY_COUNTRY=RU set KEY_PROVINCE=CA set KEY_CITY=Moscow set KEY_ORG=barnak-VPN set KEY_EMAIL=mail set KEY_CN=barnak-CA set KEY_NAME=name set KEY_OU=ou set PKCS11_MODULE_PATH=path set PKCS11_PIN=pin
Здесь (см.выше) мы указываем информацию для сертификатов (они у нас будут использоваться для аутентификации между сервером и клиентом). Можно использовать пробелы:
- KEY_PROVINCE, — указываем что хотим или оставляем по умолчанию;
- KEY_CITY, — ваш город (или любой город);
- KEY_ORG, — название вашего ИП (можно что угодно писать);
- KEY_EMAIL, — указываем что хотим или оставляем по умолчанию;
- KEY_CN, — название вашего сервера;
- KEY_NAME, — указываем что хотим или оставляем по умолчанию;
- KEY_OU, — указываем что хотим или оставляем по умолчанию;
- PKCS11_MODULE_PATH, — указываем что хотим или оставляем по умолчанию;
- PKCS11_PIN, — указываем что хотим или оставляем по умолчанию.
После этого сохраняем изменения и запускаем скрипт. При первом запуске вы увидите что было скопировано два файла. Так и должно быть. У вас создалась папка, в которой будут лежать сертификаты и ключи:
Вводим 1 и нажимаем Enter. Вас попросят ввести информацию о сертификате. Т.к. мы ее заполнили ранее, то просто нажимаете Enter, пока вам не напишет «CA certificate successfully created«:
Кому интересно что это за поля и где их увидеть:
- Открываете папку keys (или как вы ее назвали), открываете ca.crt, переходите на вкладку «Состав» и щелкаете по опции «Издатель«:
Теперь нужно выпустить ключевую последовательность Диффи-Хеллмана. Вводим 2 и ждем, пока ключи сгенерируются:
После этого выпускаем сертификат для нашего сервера. Вводим 3, далее нас попросят ввести имя сервера:
Далее методично нажимаем Enter пока не появится фраза «Sign the certificate?«, после чего нажимаем y и Enter. Появится вопрос: «1 out of 1 certificate requests certified, commit?» на который мы отвечаем утвердительно. Сертификат готов.
Для клиента проделываем всё аналогично.
к содержанию ↑
Конфигурация сервера OpenVPN
После этого настраиваем конфигурацию сервера, для чего переходим в папку config и создаем файл server.ovpn, куда вставляем следующее:
port 1120 proto tcp dev tun dev-node OpenVPN ca E:\OpenVPN\certs\ca.crt cert E:\OpenVPN\certs\barnak-SRV.crt key E:\OpenVPN\certs\barnak-SRV.key # This file should be kept secret dh E:\OpenVPN\certs\dh1024.pem server 10.10.20.0 255.255.255.0 push "route 10.10.20.0 255.255.255.0" keepalive 10 120 cipher AES-128-CBC # AES comp-lzo max-clients 10 status openvpn-status.log verb 4 mute 20 sndbuf 0 rcvbuf 0
Что здесь что:
- port 1120, — номер порта, к которому будут подключаться клиенты;
- proto tcp, — тип протокола (tcp или udp). TCP более медленный вариант, но если вы ходите через прокси-сервер, это единственный способ;
- dev tun, — режим подключения (tun или tap, туннель или мост). В общем-то режим моста нужен для специфических приложений (типа тех, что используют IPX протокол, им нужно отправлять broadcast сообщения и тп.). Обычно хватает туннельного режима;
- dev-node OpenVPN, — название вашего адаптера (используется только для режима подключения tap). Заходите в свойства сетевого адаптера и меняете название на то, которое вам больше нравится:
- ca E:\OpenVPN\certs\ca.crt, — путь до сертификата УЦ. Обратите внимание на наше воспитание. Пьянки, гулянки, диско и панки обратный слеш () здесь указывается дважды;
- cert E:\OpenVPN\certs\barnak-SRV.crt, — путь до сертификата сервера;
- key E:\OpenVPN\certs\barnak-SRV.key, — путь до закрытого ключа сервера;
- dh E:\OpenVPN\certs\dh1024.pem, — путь до ключевой последовательности Диффи-Хеллмана;
- server 10.10.20.0 255.255.255.0, — виртуальная подсеть и маска вашего VPN соединения. Когда к серверу будут подключаться, то сетевой адрес вы получите именно из этого диапазона. При этом, первый адрес всегда использует сервер;
- push «route 10.10.20.0 255.255.255.0, — здесь указывается наша виртуальная подсеть. Эта команда нужна, чтобы при установлении соединения ваши VPN клиенты могли подключаться не только непосредственно к вам, но и к другим VPN компьютерам в вашей сети. При этом, таким образом можно добавлять несколько маршрутов;
- keepalive 10 120, — отвечает за проверку доступности партнера. Будет отсылать пинги каждые 10 секунд, если от партнера не получен ответ в течение 120 секунд;
- cipher AES-128-CBC, — алгоритм шифрования. Оставляйте этот, он самый надежный из предлагаемых
- comp-lzo, — сжимание данных через VPN соединение (для уменьшения трафика);
- max-clients 10, — сколько клиентов к вам может единовременно подключиться;
- status openvpn-status.log, — название журнала, в котором будет краткая информация о том, кто подключился и т.п.:
- verb 4, — уровень детализации логов. Чем больше, тем выше детализация;
- mute 20, — Не выводить в логе больше 20 одинаковых сообщений (чтобы не засорять его);
- sndbuf 0, — буфер для отправленных пакетов. 0 означает, что OpenVPN будет использовать системные настройки, что обычно увеличивает вашу пропускную способность;
- rcvbuf 0, — буфер для полученных пакетов. Аналогично предыдущему.
Для более детального файла конфигурации можем перейти в папку sample-config и там открыть файл конфигурации текстовым редактором. Там есть комментарии к каждой опции.
После того, как вы подготовили файл настроек, применяем их, дважды кликая на файл. Откроется окно OpenVPN и начнет запускаться сервер:
Если у вас просто пустой экран, то откройте файл журнала (OpenVPNlog;.log). В нем будет написано почему VPN не запускается.
к содержанию ↑
Настройка клиента OpenVPN для первого примера
С сервером мы закончили, теперь переходим к клиенту. Скачиваем все то же приложение, устанавливаем где нам удобнее. Переносим сертификат и ключ клиента, сертификат УЦ (у меня это: ca.crt, barnak-client.crt, barnak-client.key) в любое удобное для вас место.
Заходим в папку Config (у меня это C:Program FilesOpenVPNConfig), создаем файл client.ovpn со следующим содержимым:
client dev tun dev-node OpenVPN proto tcp remote 87.215.46.32 1120 resolv-retry infinite nobind ca C:\Program files\OpenVPN\keys\ca.crt cert C:\Program files\OpenVPN\keys\barnak-client.crt key C:\Program files\OpenVPN\keys\barnak-client.key ns-cert-type server cipher AES-128-CBC comp-lzo verb 3 mute 20
Что у нас появилось нового:
- client, — означает, что мы являемся клиентом;
- remote 89.215.46.32 1120, — здесь указываем IP адрес (или DNS имя) нашего сервера и его порт;
- resolv-retry infinite, — программа будет каждый раз узнавать IP адрес по DNS имени (если мы указывали DNS имя). Удобно тем, кто пользуется ноутбуками и не всегда подключен к сети;
- nobind, — указываем, что мы не используем определенный локальный порт (т.е. программа будет выбирать случайный доступный порт);
- ;http-proxy [proxy server] [proxy port #], — если вы используете прокси, то уберите «;«. Здесь можно указать адрес (или DNS имя) прокси сервера и его порт;
- ;http-proxy-retry # retry on connection failures,- переподключаться к прокси при обрыве связи. Также уберите «;«, если вы собираетесь использовать прокси;
- ns-cert-type server, — проверяем, что в сертификате сервера написано, что он сервер, а не клиент.
Теперь сохраняем настройки и запускаем VPN клиент. Через пару минут он подключится:
Следом настроим наше файловое хранилище.
к содержанию ↑
Настройка файлового хранилища на базе Debian
Для начала отвечу на вопрос: «А почему линукс, а не винда?». Да просто на виртуалке его намного быстрее настроить и он меньше требует ресурсов. Есть еще более компактные дистрибутивы типа TinyCore (самый маленький дистрибутив, что я находил), которые вовсе занимают 30 MB оперативной памяти и 2 GB жесткого диска, но нам сейчас это не подходит
Подключаемся к Debian. Устанавливаем пакет Samba командой:
apt-get install samba
Создаем учетную запись для подключения к этому хранилищу командой:
smbpasswd -a "имя пользователя Linux"
Далее нас попросят ввести пароль для этого пользователя, что мы и делаем. При этом стоит обратить внимание, что пользователь должен уже существовать (в первом случае он мне не дал создать пользователя, т.к. тот не существовал):
Создаем папку, которая и будет выступать нашей общей директорией:
mkdir /home/user/testshare
После чего настраиваем Самбу. Открываем файл конфигурации любым текстовым редактором:
vim.tiny /etc/samba/smb.conf
Прокручиваем в самый низ и добавляем следующие строки:
[test share] path = /home/user/testshare available = yes valid users = user read only = no browsable = yes public = yes writable = yes
..где:
- [test share], — название общей директории, которое будет отображаться в Windows;
- path, — пусть до общей папки;
- valid users, — кто может подключаться к этой папке.
Ну и всякие настройки доступа, которые нам сейчас не интересны.
После этого перезапускаем сервис:
service samba restart
Если не помогло, то можно перезагрузиться (что тоже очень быстро).
к содержанию ↑
Прописываем маршрут OpenVPN
Теперь самое главное. Мы не сможем подключиться к общей папке, пока не пропишем маршрут на Debian. Т.к. наш VPN клиент знает куда подключаться, а наша виртуалка не знает куда отвечать (если только ваш VPN сервер не является шлюзом по умолчанию для всех компов, к которым вы хотите подключаться).
В моем примере VPN сервер не является шлюзом по умолчанию, так что маршрут нужен.
Добавляем следующую строчку:
route add -net 10.10.20.0/24 gw 192.168.94.2
Эта команда означает, что мы хотим для любого адреса из сети 10.10.20.0 255.255.255.0 отправлять все пакеты на шлюз 192.168.94.2.
Теперь закиньте что-нибудь в общую папку или просто создайте текстовый файлик, чтобы проверить, что все доступно, например так:
echo 12345 > /home/user/testshare/test.txt
После этого тестируем нашу общую папку:
Вводим учетные данные нашего Samba пользователя и видим, что всё доступно
А сейчас давайте несколько усложним задачу. Помимо файлового хранилища, мы хотим перенести наш VPN сервер на вторую виртуалку с Debian ( ) и к тому же мы хотим, чтобы весь трафик шел через него.
к содержанию ↑
Схема сети для второго примера VPN
У нас сеть домашний компьютер на Windows 10 x64, на нем развернута виртуалка на Debian 8, которая будет использоваться в качестве файлового хранилища, еще одна виртуалка, которая будет выступать VPN сервером, и рабочий ноутбук на Windows 10. Мы хотим с рабочего ноутбука подключиться к VPN серверу и иметь доступ ко всем локальным ресурсам домашней сети.
На маршрутизаторе мы имеем внешний адрес 87.215.46.32, внутренний адрес 192.168.1.1. на домашнем компе мы имеем внутренний адрес 192.168.1.2, а также 192.168.94.2 для подсети VMWare.
На виртуальном клиенте мы имеем адрес 192.168.94.110 и именно этот адрес нам понадобится для удаленного доступа к нему. На виртуальном VPN сервере мы имеем адрес 192.168.94.100. В качестве VPN подсети я выбрал всю ту же 10.10.20.0 с префиксом /24 (маска 255.255.255.0).
Собственно, теперь перейдем к настройке этого примера.
к содержанию ↑
Настройка OpenVPN сервера для второго примера
Подключаемся к нашему серверу, входим под рутом и скачиваем openvpn:
aptitude install openvpn openssl
После установки копируем скрипты в папку программы:
cp -r /usr/share/easy-rsa /etc/openvpn/
Далее переходим в папку /etc/openvpn/easy-rsa и открываем файл vars текстовым редактором. Здесь нас интересуют следующие опции:
export KEY_SIZE=1024 export KEY_COUNTRY="RU" export KEY_PROVINCE="CA" export KEY_CITY="Moscow" export KEY_ORG="barnak VPN" export KEY_EMAIL="test" export KEY_OU="test"
Соответственно что делать с этими полями вы уже знаете
export KEY_SIZE=1024 — длина ключа. Можно указать 2048, но особого смысла в этом не будет, только VPN медленнее станет работать.
Теперь эти переменные надо инициировать:
source ./vars
Мы получим предупреждение, что при запуске скрипта clean-all оно удалит все содержимое папки с ключами (а это папка с программой). Но нам ничего чистить не нужно, так что не обращаем внимания.
Теперь создаем сертификат УЦ:
./build-ca
После этого ключи DH:
./build-dh
Сертификат и ключи сервера:
./build-key-server debian-srv
И клиента:
./build-key client
Теперь создаем файл конфигурации сервера:
vim.tiny /etc/openvpn/server.conf
Добавляем туда следующее:
port 1194 proto tcp dev tun ca ca.crt cert debian-srv.crt key debian-srv.key dh dh1024.pem server 10.10.20.0 255.255.255.0 keepalive 10 120 cipher AES-128-CBC # AES comp-lzo max-clients 10 persist-key persist-tun client-to-client status openvpn-status.log log /var/log/openvpn.log verb 4 mute 20 sndbuf 0 rcvbuf 0 push "route 10.10.20.0 255.255.255.0" push "redirect-gateway def1"
Из новых настроек здесь следующие:
- persist-key, — позволяет избежать некоторых проблем с доступностью при понижении прав (только для Linux);
- persist-tun, — аналогично;
- client-to-client, — позволяет клиентам видеть друг друга. Без этой опции клиенты смогут видеть только сервер и его ресурсы, но не других клиентов (аналог AP Isolation);
- log /var/log/openvpn.log, — где будет храниться журнал событий openvpn;
- push «redirect-gateway def1«, — добавляет клиентам маршрут к VPN серверу, чтобы весь трафик ходил через него.
Теперь, чтобы мы все-таки могли открывать сайты, будучи подключенным к VPN, надо на сервере прописать правило NAT:
iptables -t nat -A POSTROUTING -s 10.10.20.0/24 -o eth0 -j MASQUERADE
Где 10.10.20.0/24 — ваша виртуальная VPN подсеть.
Сохраняем правило NAT в файл:
iptables-save > /etc/network/iptables.conf
Теперь открываем текстовым редактором настройки сетевых интерфейсов:
vim.tiny /etc/network/interfaces
И добавляем к интерфейсу eth0 (или какой вы используете) строчку для автозагрузки правила:
post-up /sbin/iptables-restore < /etc/network/iptables.conf
Вот как это выглядит у меня:
Это нужно для того, чтобы при перезагрузке сервера правила NAT не удалилось.
И последний штрих. нужно включить IP Forwarding. Без этого скорее всего ваш NAT не заработает. Открываем текстовым редактором файл /etc/sysctl.conf, находим строчку net.ipv4.ip_forward=1, раскомментируем ее (либо выставляем 1) и применяем командой:
sysctl -p
Теперь можно запускать OpenVPN. делается это довольно просто командой:
openvpn server.conf
Теперь сервер настроен и переходим к клиенту.
к содержанию ↑
Настройка VPN-клиента для второго примера
В общем-то здесь ничего нового. Только нужно предварительно стянуть ключи и сертификаты с нашего сервера. Я использовал для этого pscp. Пуск — Выполнить — CMD:
C:Downloadspscp -r -P 2200 [email protected]:/etc/openvpn/easy-rsa/keys/* C:Program FilesOpenVPNkeys
где:
- C:Downloadspscp — путь до программы;
- -r — копировать каталоги;
- -P 2200 — порт для подключения к виртуалке;
- [email protected] — имя пользователя и адрес сервера;
- /etc/openvpn/easy-rsa/keys/* — путь до ключей и сертификатов на сервере;
- C:Program FilesOpenVPNkeys — путь куда их копировать.
А дальше все, как в прошлый раз
Ну и.. На сим, пожалуй, можно переходить к послесловию.
к содержанию ↑
Послесловие
Вот мы и добрались до конца c OpenVPN.
В общем-то настроить все это дело не так уж и быстро, но работает исправно и достаточно шустро. Если интересуют какие-то дополнительные опции, то есть замечательный хелп, в котором достаточно подробно описаны различные моменты.
Как и всегда, если есть какие-то вопросы, мысли, дополнения и всё такое прочее, то добро пожаловать в комментарии к этой записи.
PS: За существование оной статьи отдельное спасибо другу проекта и члену нашей команды под ником “barn4k“.