Error opening ca private key

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: $ ./e...

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

@TinCanTech

Comments

@jeh1138

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

@SAkagiI

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

@ecrist

Does this still occur in v3.0.7 or master?

@Tulskie

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?

@abstractBoyd

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

@DmitriyBobrovskiy

Thank you @dredwolff it works, I had the same problem with sign-req but your solution helps!

@hiddeneyes02

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

@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

@TinCanTech

Please ignore the Mention above, that was an error.

@TinCanTech

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.

@TinCanTech

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.

@TinCanTech

However, this file-name problem can be solved.

@TinCanTech

@imbajibabu

./easyrsa —pki-dir=»D:/easy-rsa/easyrsa3/pki» build-server-full server nopass

This is perfectly working windows also.

@TinCanTech

Please try again with current git/master.

@TinCanTech

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.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 и не нахожу

А ты попробуй указывать абсолютные пути к файлам….

Аватара пользователя

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

Сам разобрался. :D

Компьютер позволяет решать все те проблемы, которые до изобретения компьютера не существовали.
Если на вопрос ни кто не знает ответа, то пора читать описание.

Доброго времени суток, дорогие читатели. Сегодня поговорим про такие вещи, как установка и настройка OpenVPN.

В прошлых статьях (раз, два) я рассказывал о том, что такое VPN и как его проверить в деле.

OpenVPN - иконка статьи

Прежде, чем приступить непосредственно к настройке всего этого хозяйства, сначала разберем как это будет работать. Рассмотрим два примера.

Пример первый:

Мы хотим подключиться к нашей домашней сети и использовать домашние же ресурсы. Дома у нас 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):

Схема сети. Пример 1

Теперь давайте приступим к настройке.

к содержанию ↑

Установка и настройка 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:

Выбор компонентов OpenVPN

Устанавливаем. В процессе установки адаптера может появиться сообщение о необходимости установить VPN драйвер. Соглашаемся и жмем «Установить«:

Предложение установки адаптера OpenVPN

Как только все установили, можно приступить к настройке.

Небольшой ликбез по технологии работы VPN, чтобы вы понимали для чего мы делаем те или иные действия.

Для того, чтобы создать защищенное соединение, в OpenVPN используется аутентификация на цифровых сертификатах стандарта Х.509.

  • Цифровой сертификат представляет собой специальный файл, при помощи которого, например, сайт показывает, что ему можно доверять, или вы можете подписать сертификатом почтовое сообщение/документ и отправить его другому человеку, который по этому сертификату поймет, что файл действительно пришел от вас, а не от кого-то другого, и при этом он не был изменен;
  • Цифровой сертификат невозможно подделать, но можно попытаться подменить (но это легко определить, посмотрев кем был выдан такой сертификат). Любой сертификат веб-сайта или организации подписывается вышестоящим по иерархии сертификатом (сертификатом удостоверяющего центра).

При этом, существуют специальные организации, которые выдают сертификаты конечным потребителям. Такой сертификат есть у любого сайта, поддерживающего протокол HTTPS. Например, открываете сайт gosuslugi.ru и видите, что напротив HTTPS висит замочек:

Защищенный сайт Gosuslugi.ru

Тыкаете на него и видите свойства сертификата. Можете там же просмотреть сам сертификат и узнать кем он был выпущен:

Сертификат веб-сайта Gosuslugi.ru

У 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, — указываем что хотим или оставляем по умолчанию.

После этого сохраняем изменения и запускаем скрипт. При первом запуске вы увидите что было скопировано два файла. Так и должно быть. У вас создалась папка, в которой будут лежать сертификаты и ключи:

Скрипт для генерации OpenVPN

Вводим 1 и нажимаем Enter. Вас попросят ввести информацию о сертификате. Т.к. мы ее заполнили ранее, то просто нажимаете Enter, пока вам не напишет «CA certificate successfully created«:

Выпуск СА сертификата

Кому интересно что это за поля и где их увидеть:

  • Открываете папку keys (или как вы ее назвали), открываете ca.crt, переходите на вкладку «Состав» и щелкаете по опции «Издатель«:

Состав сертификата УЦ

Теперь нужно выпустить ключевую последовательность Диффи-Хеллмана. Вводим 2 и ждем, пока ключи сгенерируются:

Генерация ключей Диффи-Хеллмана

После этого выпускаем сертификат для нашего сервера. Вводим 3, далее нас попросят ввести имя сервера:

Выпуск сертификата сервера

Далее методично нажимаем Enter пока не появится фраза «Sign the certificate?«, после чего нажимаем и 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). Заходите в свойства сетевого адаптера и меняете название на то, которое вам больше нравится: Сетевой адаптер OpenVPN
  • 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, — название журнала, в котором будет краткая информация о том, кто подключился и т.п.: Пример вывода файла openvpn-status.log
  • verb 4, — уровень детализации логов. Чем больше, тем выше детализация;
  • mute 20, — Не выводить в логе больше 20 одинаковых сообщений (чтобы не засорять его);
  • sndbuf 0, — буфер для отправленных пакетов. 0 означает, что OpenVPN будет использовать системные настройки, что обычно увеличивает вашу пропускную способность;
  • rcvbuf 0, — буфер для полученных пакетов. Аналогично предыдущему.

Для более детального файла конфигурации можем перейти в папку sample-config и там открыть файл конфигурации текстовым редактором. Там есть комментарии к каждой опции.

После того, как вы подготовили файл настроек, применяем их, дважды кликая на файл. Откроется окно OpenVPN и начнет запускаться сервер:

Подключенный сервер 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 клиент. Через пару минут он подключится:

Подключенный OpenVPN

Следом настроим наше файловое хранилище.

к содержанию ↑

Настройка файлового хранилища на базе Debian

Для начала отвечу на вопрос: «А почему линукс, а не винда?». Да просто на виртуалке его намного быстрее настроить и он меньше требует ресурсов. Есть еще более компактные дистрибутивы типа TinyCore (самый маленький дистрибутив, что я находил), которые вовсе занимают 30 MB оперативной памяти и 2 GB жесткого диска, но нам сейчас это не подходит :)

Подключаемся к Debian. Устанавливаем пакет Samba командой:

apt-get install samba

Создаем учетную запись для подключения к этому хранилищу командой:

smbpasswd -a "имя пользователя Linux"

Далее нас попросят ввести пароль для этого пользователя, что мы и делаем. При этом стоит обратить внимание, что пользователь должен уже существовать (в первом случае он мне не дал создать пользователя, т.к. тот не существовал):

Создание пользователя user в Samba

Создаем папку, которая и будет выступать нашей общей директорией:

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

Вводим учетные данные нашего Samba пользователя и видим, что всё доступно :)

Общая папка 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).

Схема сети. Пример 2

Собственно, теперь перейдем к настройке этого примера.

к содержанию ↑

Настройка 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

Вот как это выглядит у меня:

Содержимое файла interfaces

Это нужно для того, чтобы при перезагрузке сервера правила 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“.

Понравилась статья? Поделить с друзьями:
  • Error occurred during a cryptographic operation
  • Error open temp unitylockfile permission denied
  • Error occurred drop was not claimed
  • Error occurred did the dll properly inject перевод
  • Error occurred did the dll properly inject как исправить