Как стать автором
Обновить

Шифрованное соединение с сервером на основе 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) свой открытый ключ (самоподписанный сертификат) и добавить его в свой список удостоверяющих центров. Теперь при соединении с сервером, Боб всегда может убедится с помощью своего открытого ключа, что предлагаемый ему открытый ключ Алисы – это именно её ключ.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.