Вы здесь

StrongSwan

Чтиво

Давеча захотел сделать удаленный заход в приватную сеть своего мини-датацентра. Изучив варианты, остановил выбор на StrongSwan. Ничего более иного не нашел. Pptp себя как-то дискредитировал в двух последних случаях - то пакеты не ходят, то файерволл мешает, то связь рвется... А может готовить его разучился. Вопчим, лебедь. Строго.

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

Итак. Есть задача подключить комп с Windows 7 в удаленную сеть средствами упомянутого лебедя. Установку самого лебедя опускаю, поскольку а) тривиально и б) в массе своей - не нужно.

Наперво замечу, что Windows 7, как сказано в мануалах на strongswan, полностью поддерживает IKEv2 (Internet Key Exchange). Для использования оной фичи нужны сертификаты и ключи. Потому, генерим ключ (длина ключа - на вкус, у меня 2048):

# 1024-битный ключ без парольной защиты
openssl genrsa -out caKey.pem 1024
# или, для систем, где "ходят разные", можно создать защищенный:
openssl genrsa -des3 -out caKey.pem 1024
и самоподписанный корневой сертификат:
openssl req -new -x509 -days 5000 -key caKey.pem -out caCert.pem
опять же, количество дней - по вкусу. Для удобства, я поправил файлик с конфигурацией openssl, чтобы основная часть полей заполнялась автоматически. В частности, заполнил поля:
countryName_default             = RU
0.organizationName_default     = StrongSwan
organizationalUnitName_default  = SecureGW
Кроме этого, для корректной работы openssl создал необходимые ему каталоги и файлы.

Получившийся корневой сертификат кладем в /etc/ipsec.d/cacerts/, ключ храним подальше и никому не показываем, особенно, если он не защищен паролем. Съедать не надо, он еще пригодится для создания сертификатов авторизации самого strongswan и клиентов.

Далее, обращаем внимание на то, что windows 7, хочет, что бы в сертификатах, используемых в авторизации наличествовали четко определенные вещи, без них в моем случае (из-за чтения хауту на русском языке;) лебедь рапортовал об установленном соединении, а винда ругалась, что "не может на это пойтить":

Your gateway certificate must have:

  • An Extended Key Usage flag explicitly allowing the certificate to be used for authentication purposes. It is currently unclear which OIDs are accepted by Windows, but it seems that the serverAuth EKU having the OID 1.3.6.1.5.5.7.3.1 (often called TLS Web server authentication) is ok. If you are using OpenSSL to generate your certificates then include the option
extendedKeyUsage = serverAuth
In Windows 7, you now have to add the "IP Security IKE Intermediate", this is done by adding the oid : 1.3.6.1.5.5.8.2.2 as extendedKeyUsage (a good page about ikev2/windows understanding is this one ) Which give extendedKeyUsage = serverAuth, 1.3.6.1.5.5.8.2.2
  • The hostname of the VPN gateway entered in the clients connection properties MUST be contained either in the subjectDistinguishedName of the server certificate
    C=CH, O=strongSwan Project, CN=vpn.strongswan.org
    or in a subjectAltName extension that can be added with the option
    subjectAltName = DNS:vpn.strongswan.org
  • Подробности тут

    Для этого опять внес поправки в конфиг openssl:

    [ usr_cert ]
    ...
    subjectAltName=DNS:myhost.mydomain.ru,IP:xx.xxx.xxx.xx
    subjectKeyIdentifier=hash
    authorityKeyIdentifier=keyid,issuer
    extendedKeyUsage = serverAuth,1.3.6.1.5.5.8.2.2
    
    где DNS:myhost.mydomain.ru,IP:xx.xxx.xxx.xx - имя и адрес моего лебединого гейта.

    Теперь можно выписать сертификаты для лебедя и для клиентской виндовс:

    # одной командой создаем ключ и запрос на создание сертификата для гейта
    openssl req -newkey rsa:1024 -keyout swanKey.pem -out swanReq.pem
    # выписываем сертификат, подписанный корневым
    openssl ca -in swanReq.pem -out swanCert.pem -cert caCert.pem -keyfile caKey.pem
    # то же саоме для клиента
    openssl req -newkey rsa:1024 -keyout clientKey.pem -out clientReq.pem
    openssl ca -in clientReq.pem -out clientCert.pem -cert caCert.pem -keyfile caKey.pem
    # клиентский пакуем в p12
    openssl pkcs12 -export -inkey clientKey.pem -in clientCert.pem -name clientcert -out client.p12
    

    Передаем на виндовс корневой сертификат и комплект p12. На стороне сервера все сертификаты складываем в /etc/ipsec.d/certs, а ключи в /etc/ipsec.d/private. Если ключи защещины паролем (а они, как правило, защищены), необходимо записать пассфразы в /etc/ipsec.secrets:

    : RSA swanKey.pem "secret"
    : RSA clientKey.pem "secret"
    
    Можно закриптовать секреты с помощью openssl passwd -1 "secret" и вставить получившееся вместо "secret".

    Остальное допишу позже.

    Добавить комментарий

    Filtered HTML

    • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
    • Разрешённые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
    • Строки и параграфы переносятся автоматически.

    Plain text

    • HTML-теги не обрабатываются и показываются как обычный текст
    • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
    • Строки и параграфы переносятся автоматически.