Взято с [[https://wiki.nix-pro.com/view/OpenVPN_%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%B9_%D0%B8_%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D0%B2|https://wiki.nix-pro.com]] Там еще много интересного. ==Создание Certificate Authority (CA)== *Подготавливаем окружение: cd && mkdir -p myCA/signedcerts && mkdir myCA/private && cd myCA Предназначение подкаталогов, и их содержимое выглядит следующим образом:
~/myCA : содержит CA сертификат, базу данных сертификатов, сгенерированные сертификаты, ключи и CSR
~/myCA/signedcerts : содержит копии всех подписанных сертификатов
~/myCA/private : содержит секретный ключ
*Создаем начальную базу данных в ~/myCA поддиректории следующей командой: echo '01' > serial && touch index.txt В файле serial записывается текущий серийный номер подписываемого сертификата в шестнадцатиричном формате. В файл index.txt сохраняются данные о подписываемых сертификатах. * Создаем начальный файл caconfig.cnf файл, подходящий для создания CA сертификатов: vim ~/myCA/caconfig.cnf * Добавляем в него следующее содержимое: # Default configuration to use when one is not provided on the command line. # [ ca ] # Use local_ca policy to sign certificates default_ca = local_ca # Paths to files and directories needed to create certificates [ local_ca ] dir = /home//myCA certificate = $dir/cacert.pem database = $dir/index.txt new_certs_dir = $dir/signedcerts private_key = $dir/private/cakey.pem serial = $dir/serial # # Default expiration and encryption policies for certificates. # default_crl_days = 365 # A CRL is a Certificate Revocation List. When you issue a cert for say, 365 # days, its useful to have a method whereby you can revoke its validity before # it expires. For example, if it is compromised (password stolen, etc). So the # Cerificate Authority (you in this case) issues a Revocation List periodically # listing which certs have been revoked. # # The client application doesn't want to have to look for a new list every time # it validates a cert so each Revocation list has an expiry date. The 'default_crl_days' # param in the config file just specifies the default lifetime of any CRLs you might # issue if you don't set an explicit expiry date default_days = 365 default_md = md5 # policy = local_ca_policy x509_extensions = local_ca_extensions # # Default policy to use when generating server certificates. The following # fields must be defined in the server certificate. # [ local_ca_policy ] commonName = supplied stateOrProvinceName = supplied countryName = supplied emailAddress = supplied organizationName = supplied organizationalUnitName = supplied # # x509 extensions to use when generating server certificates. # [ local_ca_extensions ] #subjectAltName = DNS:alt.example.com # # When making a SSL/TLS connection the client requests a digital certificate from the server; # once the server sends the certificate, the client examines it and compares the name it was trying # to connect to with the name(s) included in the certificate. If a match is found the connection # proceeds as normal. If a match is not found the user may be warned of the discrepancy and the # connection may be aborted as the mismatch may indicate an attempted man-in-the-middle attack. # It is possible for one certificate to cover multiple names. The X.509 v3 specification introduced # the so-called subjectAltName field which allows one certificate to specify more than one domain and # it is possible to have wildcards in both the common name and subjectAltName fields. However it may be # impractical to obtain a single certificate that covers all names a server will be responsible for. basicConstraints=CA:FALSE # This goes against PKIX guidelines but some CAs do it and some software # requires this to avoid interpreting an end user certificate as a CA. #nsCertType = server # this option is required only if OpenVPN is running with ns-cert-type check # # ns-cert-type OpenVPN option Requires that peer certificate was signed # with an explicit nsCertType designation of "client" or "server". # This is a useful security option for clients, to ensure that the host # they connect with is a designated server. # # If the server certificate's nsCertType field is set to "server", then # the clients can verify this with --ns-cert-type server. # # This is an important security precaution to protect against a man-in-the-middle # attack where an authorized client attempts to connect to another client by impersonating # the server. The attack is easily prevented by having clients verify the server # certificate using any one of --ns-cert-type, --tls-remote, or --tls-verify. # # The default root certificate generation policy. # [ req ] default_bits = 2048 default_keyfile = /home//myCA/private/cakey.pem default_md = md5 # prompt = no distinguished_name = root_ca_distinguished_name x509_extensions = root_ca_extensions # Root Certificate Authority distinguished name. Change these fields to match # your local environment! # [ root_ca_distinguished_name ] commonName = MyOwn Root Certificate Authority stateOrProvinceName = NC countryName = US localityName = Asheville emailAddress = root@example.com organizationName = My Own Company organizationalUnitName = IT Department # [ root_ca_extensions ] basicConstraints = CA:true *Для каталога private, в целях безопасности частного ключа сервера, рекомендую установить права только для пользователя root: chmod go-rwx private * И наконец создаем сертификат CA: openssl req -batch -nodes -config ~/myCA/caconfig.cnf -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 365 ==Альтернативный вариант создания Certificate Authority (CA)== * С помощью приведенной ниже команды создается закрытый ключ и самоподписанный сертификат. openssl req -new -newkey rsa:1024 -nodes -keyout ca.key -x509 -days 500 \ -subj /C=US/ST=NC/L=Asheville/O=My\ Own\ Company/OU=IT\ Department/CN=MyOwn\ Root\ Certificate\ Authority/emailAddress=root@root@example.com \ -out ca.crt В результате выполнения команды появятся два файла ca.key и ca.crt. Просмотреть данные закрытого ключа и сертификата вы можете с помощью команд: openssl rsa -noout -text -in ca.key (для ключа) openssl x509 -noout -text -in ca.crt (для сертификата) Описание аргументов: req - Запрос на создание нового сертификата.
-new - Создание запроса на сертификат (Certificate Signing Request - CSR).
-newkey rsa:1024 - Автоматически будет создан новый закрытый RSA ключ длиной 1024 бита. Длину ключа можете настроить по своему усмотрению.
-nodes - Не шифровать закрытый ключ (См. примечание выше).
-keyout ca.key - Закрытый ключ сохранить в файл ca.key.
-x509 - Вместо создания CSR (см. опцию -new) создать самоподписанный сертификат.
-days 500 - Срок действия сертификата 500 дней. Размер периода действия можете настроить по своему усмотрению. Не рекомендуется вводить маленькие значения, так как этим сертификатом вы будете подписывать клиентские сертификаты.
-out ca.crt Сертификат сохранить в файл ca.crt.
-subj /C=US/ST=NC/L=Asheville/O=My\ Own\ Company/OU=IT\ Department/CN=MyOwn\ Root\ Certificate\ Authority/emailAddress=root@root@example.com - Данные сертификата, пары параметр=значение, перечисляются через '/'. Символы в значении параметра могут быть "подсечены" с помощью обратного слэша "\", например "O=My\ Inc". Также можно взять значение аргумента в кавычки, например, -subj "/xx/xx/xx".

Описание параметров:

С - Двухсимвольный код страны (Country). Необязательный параметр.
ST - Название региона/области/края/республики/... (State Name). Необязательный параметр.
L - Название города/поселка/... (Locality Name). Необязательный параметр.
O - Название организации (Organization Name). Необязательный параметр.
OU - Название отдела (Organization Unit). Необязательный параметр.
CN - Имя сертификата, при создании серверных сертификатов используется доменное имя сайта, для клиентских сертификатов может быть использовано что угодно (Common Name). Обязательный параметр. Максимальная длина 64 символа.
emailAddress - почтовый адрес (E-mail address). Необязательный параметр. Максимальная длина 40 символов.

Необязательные параметры могут быть пропущены, например: /C=US/emailAddress=root@example.com ==Создание сертификата X.509== Теперь, когда мы имеем CA, мы можем создавать сертификаты и ключи для машин, образующих туннель. Вместо '''host_x''' рекомендую указывать осмысленное имя для машины-сервера и клиентов, что бы потом не запутаться самому. * создаем новый CSR и ключ: HOST="host_x" openssl req -nodes -newkey rsa:2048 -keyout $HOST.key -keyform PEM -out $HOST.req -outform PEM \ -subj /C=US/ST=CA/L=Msk/O=My\ Organization\ Name/OU=Subunit\ of\ My\ Large\ Organization/CN=mydomain.com/emailAddress=root@mydomain.com Также данные в '''subject''' можно получить из конфигурационного файла. Пример: HOST="host_x" vim ~/myCA/$HOST.cnf содержимое $HOST.cnf: [ req ] prompt = no distinguished_name = server_distinguished_name [ server_distinguished_name ] commonName = mydomain.com stateOrProvinceName = CA countryName = US emailAddress = root@mydomain.com organizationName = My Organization Name organizationalUnitName = Subunit of My Large Organization создаем новый CSR и ключ: openssl req -nodes -newkey rsa:2048 -keyout $HOST.key -keyform PEM -out $HOST.req -outform PEM -config ~/myCA/$HOST.cnf * подписываем сертификат нашим CA сертификатом: openssl ca -in $HOST.req -out $HOST.crt -config ~/myCA/caconfig.cnf * На всякий пожарный проверьте действительность создаваемых сертификатов. openssl verify -CApath /~/myCA/private -CAfile ~/myCA/cacert.pem -purpose sslclient $HOST.crt * создаем ключик ta.key. Этот ключ используется для предотвращения DoS атак и UDP port flooding openvpn --genkey --secret ta.key * Далее создать ключ Диффи Хельман (подробнее о нем http://www.rsasecurity.com/rsalabs/node.asp?id=2248). Этот ключ используется для шифрования трафика при установлении соединения: openssl dhparam -out dh1024.pem 1024 ==Отзыв клиентского SSL сертификата== * Для того чтобы запретить доступ для какого-либо ранее сгенерированного SSL сертификата в конфиге сервера должна присутствовать следующая опция: crl-verify /path/to/crl.pem * Отозвать клиентский SSL сертификат можно следующей командой: openssl ca -revoke bad_crt_file -keyfile ca_key -cert ca_crt или openssl ca -config caconfig.conf -revoke bad_crt_file * Затем необходимо обновить CRL: openssl ca -gencrl -keyfile ca_key -cert ca_crt -out crl.pem или openssl ca -gencrl -config caconfig.conf -out crl.pem ==Расположение файлов сертификатов на клиенте и сервере== ^ Файл ^ Машина ^ Назначение ^ Доступ ^ | ca.crt| Сервер и клиенты|Сертификат корневого СА|Публичный| | ca.key|Только на сервере|Необходим для подписи других сертификатов|Секретный| | 1024.pem|Только на сервере| Diffie Hellman параметры| Публичный| | remote.domain.com.crt| Только на сервере|Сертификат сервера|Публичный| | remote.domain.com.key|Только на сервере|Ключ сервера|Секретный| |laptop.domain.com.crt|Только на клиенте|Сертификат клиента|Публичный| |laptop.domain.com.key|Только на клиенте| Ключ клиента| Секретный| ==Дополнительная информация о шифровании== *Настройки Diffie-Hellmann (DH): Когда OpenVPN узлы уверены в подлинности друг друга, DH может быть использован для создания закрытого разделяемого ключа для хэш функции и алгоритма шифрования. Комбинируя DH закрытый ключ с отрытым DH ключом другого OpenVPN узла, возможно создать закрытый разделяемых ключ, который будет известен только этим двум OpenVPN узлам. Этот ключ будет использоваться алгоритмом симметричного шифрования и хэш функцией, как это будет показано в следующих двух параграфах. *Алгоритм шифрования cipher AES-256-CBC Конфиденциальность данных обеспечивается симметричными алгоритмами шифрования 3DES или AES. По умолчанию используется алгоритм Blowfish. Список доступных алгоритмов можно получить так: #openvpn --show-ciphers DES-CBC 64 bit default key (fixed) IDEA-CBC 128 bit default key (fixed) RC2-CBC 128 bit default key (variable) DES-EDE-CBC 128 bit default key (fixed) DES-EDE3-CBC 192 bit default key (fixed) DESX-CBC 192 bit default key (fixed) BF-CBC 128 bit default key (variable) RC2-40-CBC 40 bit default key (variable) CAST5-CBC 128 bit default key (variable) RC5-CBC 128 bit default key (variable) RC2-64-CBC 64 bit default key (variable) AES-128-CBC 128 bit default key (fixed) AES-192-CBC 192 bit default key (fixed) AES-256-CBC 256 bit default key (fixed) '''CBC (Cipher Block Chaining)''' это режим шифрования используемый блочными алгоритмами шифрования такими как AES, DES или Blowfish. CBC использует маленькие порции данных, вместо обработки всего блока за один раз. Другие доступные режимы шифрования: EBC, OFB, CFB. Рекомендуется использовать CBC. *Алгоритмы хэш функций Целостность данных (защита от их изменения) достигается использованием хэш функций. HMAC часто используется в дополнении с SHA1 или MD5. OpenVPN использует по умолчанию HMAC-SHA1. Список доступных алгоритмов можно получить так: #openvpn --show-digests MD2 128 bit digest size MD5 128 bit digest size RSA-MD2 128 bit digest size RSA-MD5 128 bit digest size SHA 160 bit digest size RSA-SHA 160 bit digest size SHA1 160 bit digest size RSA-SHA1 160 bit digest size DSA-SHA 160 bit digest size DSA-SHA1-old 160 bit digest size MDC2 128 bit digest size RSA-MDC2 128 bit digest size DSA-SHA1 160 bit digest size RSA-SHA1-2 160 bit digest size DSA 160 bit digest size RIPEMD160 160 bit digest size RSA-RIPEMD160 160 bit digest size MD4 128 bit digest size RSA-MD4 128 bit digest size "openvpn --show-tls" отображает алгоритмы шифрование и MAC (Message Authentication Code) используемый SSL/TLS во время установления соединения. Их не нужно путать с шифрованием и MAC используемых для обеспечения безопасности OpenVPN туннеля.