Pull to refresh

Шифрованное соединение с сервером на основе openSSL

Задача стояла следующая. Есть некий VDS сервер (назовем его Алиса), и есть администратор этого сервера, назовем его Боб.

Бобу очень не хочется, чтобы его общение с сервером (ввод паролей, электронная переписка и так далее) ходили по сети интернет в открытом виде. Эту задачу Боб решает с помощью стандарта X.509 и пакета openssl на основе алгоритма асинхронного шифрования RSA.



Для реализации задуманного Бобу нужно сгенерировать открытый и закрытый ключ.

С помощью закрытого ключа боб может расшифровать любой документ, зашифрованный его открытым ключом, а также «подписать» любой документ. Открытый ключ Боб может раздать всем желающим, с помощью этого ключа можно зашифровать сообщение Бобу, а также проверить подлинность файла, подписанного его электронной подписью.

Существует проблема передачи открытого ключа с помощью незащищенных каналов связи. Друг Боба не может быть уверен в том, что получил ключ именно от Боба и что это ключ именно Боба. Поэтому, любой открытый ключ должен быть подписан закрытым ключом третьей стороны, которой доверяют и Боб, и его мистический друг. Эта третья сторона называется удостоверяющим центром (УЦ) или центром сертификации. Список УЦ, которым «доверяет» ваш бразуер можно найти в настройках.

Ключ, подписанный электронной подписью, называется сертификатом. Но Боб не хочет обращаться к сторонним УЦ, а открытый ключ таки требует подписи. Поэтому первым действием Боба будет генерация самоподписанного сертификата. Иначе говоря, Боб должен сгенерировать закрытый ключ, потом открытый, а потом подписать открытый ключ закрытым.

1.Изготовление закрытого ключа и самоподписанного сертификата.
(дело происходит в директории /my/ssl)

#openssl req -x509 -new -out bob.crt -keyout bob.key -days 7777
Generating a 1024 bit RSA private key
++++++
++++++
writing new private key to bob.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase: //Пароль для ключа Боба
-----
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.
-----
Country Name (2 letter code) [xx]:
State or Province Name (full name) [xxxxxx]:
Locality Name (eg, city) [xxxxxx]:
Organization Name (eg, company) [My Company Ltd]:Bob
Organizational Unit Name (eg, section) []:Bob
Common Name (eg, your name or your server's hostname) []:bob.example.com
Email Address []:bob@xxx.xx
#ls
bob.crt bob.key


В принципе, с помощью этих ключей уже можно построить зашифрованный канал. При подключении клиента к серверу, сервер выдает свой открытый ключ, клиент шифрует этим ключем свой секретный ключ, который передает серверу. Сервер расшифровывает его своим закрытым ключом и обмен зашифрованный обмен начинается.

Но клиент не может быть уверен, что при установке соединения получает открытый ключ именно Боба, так как действия, описанные в пункте один, может произвести любой.

Поэтому Боб изготовляет другую пару открытый/закрытый ключ специально для сервера Alisa:

#mkdir alisa
#cd alisa
#openssl req -out alisa.example.com -pubkey -new -keyout alisa.exampe.com.key

Generating a 1024 bit RSA private key
++++++
++++++
writing new private key to 'alisa.example.com.key'
Enter PEM pass phrase: //пароль для ключа Алисы
Verifying - Enter PEM pass phrase:
-----
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.
-----
Country Name (2 letter code) [xx]:
State or Province Name (full name) [xxxxxxxx]:
Locality Name (eg, city) [xxxxxxxxxx]:
Organization Name (eg, company) [My Company Ltd]:alisa.example.com
Organizational Unit Name (eg, section) []:alisa.example.com
Common Name (eg, your name or your server's hostname) []:alisa.example.com
Email Address []:root@alisa.example.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
#ls
alisa.example.com.csr alisa.example.com.key

Данная команда сгенерировала открытый ключ не в виде сертификата, а в виде запроса на сертификат, который подлежит подписи удостоверяющим центром. Теперь это запрос (файл csr) можно отправить удостоверяющему центру, который подпишет его своим закрытым ключом, превратя его в тот самый искомый сертификат. А можно подписать закрытым ключом Боба:

#openssl x509 -req -days 7777 -in alisa.example.com.csr -CA ../bob.crt -CAkey ../bob.key -set_serial 01 -out alisa.example.com.crt
Signature ok
subject=/C=xx/ST=xxxxxx/L=xxxxxxxx/O=bob/OU=alisa.example.com/CN=bob/emailAddress=bob@xxxx.xx
Getting CA Private Key
Enter pass phrase for ../bob.key: //Пароль ключа Боба
#ls
alisa.example.com.crt alisa.example.com.csr alisa.example.com.key


Все, теперь Бобу достаточно передать на клиентскую машину по защищенным каналам связи (например SSH) свой открытый ключ (самоподписанный сертификат) и добавить его в свой список удостоверяющих центров. Теперь при соединении с сервером, Боб всегда может убедится с помощью своего открытого ключа, что предлагаемый ему открытый ключ Алисы – это именно её ключ.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.