Security Teams



:::
  Ответ в темуСоздание новой темыСоздание опроса

> Perl: SSL connection howto
0.0.7
Дата 7.03.2007 - 16:50
Цитировать сообщение
Offline



Activist
**

Профиль
Группа: -users-
Сообщений: 63
Пользователь №: 3957
Регистрация: 9.07.2006



Рейтинг:
(0%) -----


Кто-нибудь пытался работать с SSL в перле? Как написать клиент/сервер, использующий безопасное соединение? Какой модуль использовать?
PMПисьмо на e-mail пользователю
Top
nameless
Дата 8.03.2007 - 05:25
Цитировать сообщение
Offline



.:Тень:.
******

Профиль
Группа: -experts-
Сообщений: 1745
Пользователь №: 18
Регистрация: 19.02.2005



Рейтинг:
(90%) XXXXX


Perl Cookbook ст. 846
Цитата
Решение
Установите Crypt::SSLeay, и LWP автоматически начнет работать с https://-URL. Переустанавливать LWP при этом не придется.


Очень советую всем перл кодерам эту книгу.


--------------------
Мы расправим крылья
PM
Top
drmist
Дата 8.03.2007 - 14:17
Цитировать сообщение
Offline



Professional
*****

Профиль
Группа: -users-
Сообщений: 1165
Пользователь №: 222
Регистрация: 14.04.2005



Рейтинг:
(0%) -----


vxk7m
А если хочется работать не с https, а с sftp или irc с прикрученным ssl?
советую IO::Socket::SSL.


--------------------
Когда нельзя еще больше хочется...
PMСайт пользователя
Top
0.0.7
Дата 8.03.2007 - 18:30
Цитировать сообщение
Offline



Activist
**

Профиль
Группа: -users-
Сообщений: 63
Пользователь №: 3957
Регистрация: 9.07.2006



Рейтинг:
(0%) -----


Большое спасибо. А можно пару примеров?
PMПисьмо на e-mail пользователю
Top
nameless
Дата 9.03.2007 - 05:33
Цитировать сообщение
Offline



.:Тень:.
******

Профиль
Группа: -experts-
Сообщений: 1745
Пользователь №: 18
Регистрация: 19.02.2005



Рейтинг:
(90%) XXXXX


https://search.cpan.org/~dland/Crypt-SSLeay-0.53/SSLeay.pm


--------------------
Мы расправим крылья
PM
Top
drmist
Дата 9.03.2007 - 11:25
Цитировать сообщение
Offline



Professional
*****

Профиль
Группа: -users-
Сообщений: 1165
Пользователь №: 222
Регистрация: 14.04.2005



Рейтинг:
(0%) -----


Пример клиента, использующего SSL-соединение (давольно полезная тулза - можно дебажить протоколы http и irc, поверх которых наложен ssl)
Код
#!/usr/local/bin/perl

#     =:: ssl-telnet.pl ::=
# Coded by drmist [SaTaNiC Team]
#   web: www.security-teams.net
use IO::Socket::SSL;

$| = 1;
$addr = shift;
$port = shift;

print "Connecting to $addr:$port... ";
$sock = IO::Socket::SSL->new("$addr:$port") or die "failed!\n";
print "success!\n";

if($child = fork()) {
 while(sysread($sock, $buff, 512)) {
   print $buff;
 }
 kill $child, SIGINT;
} else {
 while($line = <STDIN>) {
   $line =~ s|\n|\r\n|g;
   print $sock $line;
 }
 shutdown($sock, SHUT_RDWR);
}
close $sock;


--------------------
Когда нельзя еще больше хочется...
PMСайт пользователя
Top
drmist
Дата 9.03.2007 - 11:50
Цитировать сообщение
Offline



Professional
*****

Профиль
Группа: -users-
Сообщений: 1165
Пользователь №: 222
Регистрация: 14.04.2005



Рейтинг:
(0%) -----


Пример сервера. Тут немного сложнее, ибо сервер нуждается в сертификате и key-файле.
Первым делом создаем RSA-ключи:
Код
openssl req -newkey rsa:4096 -days 10000 -nodes -keyout server-key.pem -out server-req.pem

где 4096 - длина ключа, 10000 - срок жизни ключа в днях. Я выбрал большую длину ключа, потому мне кажется, что ключ обновлять не придется. По хорошему длину надо выбрать 1024 или 2048 и обновлять ключ раз в пару месяцев. Затем нужно найти контору, выдающую ssl-сертификаты, выслать ей server-req.pem и заплатить пару десятков баксов. Через знакомых можно сделать это бачей за 20 или вобще бесплатно, если таких знакомых нет, может потребоваться баксов 100 или больше в зависимости от срока службы ключа и от респектабельности конторы.
Если денег нет - ничего страшного, можно создать сертификат самому. Теоретически это создает уязвимость в протоколе (если не ошибаюсь - к атаке "человек по середине"), но на практике такую атаку реализовать довольно сложно, потому многие подписывают ключи сами.
Создаем rsa-ключи для подписи:
Код
openssl genrsa -out ./ca-key.pem 2048
openssl req -new -x509 -nodes -days 999 -key ./ca-key.pem -out ca.pem

Создаем сертификат:
Код
openssl x509 -req -in server-req.pem -days 10000 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

SSL сервер на перле:
Код
#! /usr/bin/perl

#     =:: ssl-server.pl ::=
# Coded by drmist [SaTaNiC Team]
#   web: www.security-teams.net

use IO::Socket::SSL;

$port = 31337;
$pass = "password";
$cert_file = "path/to/server-cert.pem";
$key_file = "path/to/server-key.pem";
$logo = "===:::STNC Perl SSL server:::===\n".
       "     web: www.security-teams.net\n";

$server = IO::Socket::SSL->new(
           LocalPort => $port,
           Listen    => SOMAXCONN,
           SSL_cert_file => $cert_file,
           SSL_key_file => $key_file
         ) or die IO::Socket::SSL::errstr();

print "Server is binded on port $port...\n";

while($client = $server->accept()) {
 if(!fork()) {
   print $client $logo;
   print $client "Password: ";
   $line = <$client>;
   $line =~ s|\r||g;
   $line =~ s|\n||g;
   if($line eq $pass) {
     print $client "Welcome!\n";
   } else {
     print $client "Bie!\n";
   }
   $client->close(SSL_no_shutdown => 1);
   exit;
 }
 $client->close(SSL_no_shutdown => 1);
}

Предвижу вопрос: зачем соединение закрывается таким странным образом: $client->close(SSL_no_shutdown => 1). Вырезка из "man IO::Socket::SSL"
Код
      close(...)
          There are a number of nasty traps that lie in wait if you are not
          careful about using close().  The first of these will bite you if
          you have been using shutdown() on your sockets.  Since the SSL pro-
          tocol mandates that a SSL "close notify" message be sent before the
          socket is closed, a shutdown() that closes the socket's write chan-
          nel will cause the close() call to hang.  For a similar reason, if
          you try to close a copy of a socket (as in a forking server) you
          will affect the original socket as well.  To get around these prob-
          lems, call close with an object-oriented syntax (e.g.
          $socket->close(SSL_no_shutdown => 1)) and one or more of the fol-
          lowing parameters:

          SSL_no_shutdown
            If set to a true value, this option will make close() not use the
            SSL_shutdown() call on the socket in question so that the close
            operation can complete without problems if you have used shut-
            down() or are working on a copy of a socket.

Хочу обратить внимание, что ключи по-хорошему не тухло было бы шифровать (только не des'ом и желательно дяже не 3des'ом, лучше всего blowfish'ем). Как это сделать, что изменить при этом в сервере, как клиент может проверить сертификат сервера и тп можно узнать из man openssl и man IO::Socket::SSL.


--------------------
Когда нельзя еще больше хочется...
PMСайт пользователя
Top
0.0.7
Дата 9.03.2007 - 17:16
Цитировать сообщение
Offline



Activist
**

Профиль
Группа: -users-
Сообщений: 63
Пользователь №: 3957
Регистрация: 9.07.2006



Рейтинг:
(0%) -----


Спасибо, думаю вопрос исчерпан. worthy.gif
PMПисьмо на e-mail пользователю
Top
skrayd
Дата 10.12.2010 - 17:02
Цитировать сообщение
Offline



Junior
*

Профиль
Группа: -users-
Сообщений: 2
Пользователь №: 7178
Регистрация: 8.12.2010



Рейтинг:
(0%) -----


Народ Подскажите пожалуйста Есть апач на 80 порту. Стоит OpenSSL. Программка Webmin работает по SSL соединению.
Может есть у кого скрипт на Перле, чтобы он включал SSL режим при работе с определенным каталогом Апача или подобное что-то? Помогите плиз На майл
PMПисьмо на e-mail пользователюСайт пользователяAOLYahooMSN
Top

Опции темы Ответ в темуСоздание новой темыСоздание опроса