вторник, 18 ноября 2014 г.

Python. Генерация SSL сертификатов.

Для создания SSL сертификатов потребуется pyOpenSSL

Далее описан материал создания:
 1. Cамоподписанных сертификатов
 2. Подписанных сертификатов

 Установка:
pip install pyopenssl

1. Создание самоподписанных сертификатов
# _*_ coding: utf-8 _*_

import os
from OpenSSL import crypto

KEY_FILE = "app.key"
CERT_FILE = "app.crt"

def create_self_signed_cert(cert_dir):
    k = crypto.PKey()
    k.generate_key(crypto.TYPE_RSA, 1024)   #  размер может быть 2048, 4196

    #  Создание сертификата
    cert = crypto.X509()
    cert.get_subject().C = "RU"   #  указываем свои данные
    cert.get_subject().ST = "Tatarstan"   #  указываем свои данные
    cert.get_subject().L = "Naberezhnye Chelny"   #  указываем свои данные
    cert.get_subject().O = "xazrad"   #  указываем свои данные
    cert.get_subject().OU = "xazrad"   #  указываем свои данные
    cert.get_subject().CN = "xazrad.blogspot.com"   #  указываем свои данные
    cert.set_serial_number(1000)
    cert.gmtime_adj_notBefore(0)
    cert.gmtime_adj_notAfter(10*365*24*60*60)   #  срок "жизни" сертификата
    cert.set_issuer(cert.get_subject())
    cert.set_pubkey(k)
    cert.sign(k, 'sha1')

    with open(os.path.join(cert_dir, CERT_FILE), "w") as f:
        f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))

    with open(os.path.join(cert_dir, KEY_FILE), "w") as f:
        f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, k))


2. Создание подписанных сертификатов
# _*_ coding: utf-8 _*_

import os
from OpenSSL import crypto

KEY_FILE = "app.key"
CERT_FILE = "app.crt"
CA_CRT = "CA_CRT.crt"   #  сертификат, которым производится подпись
CA_KEY = "CA_KEY.key"   #  ключ, которым производится подпись

def create_signed_cert(cert_dir):
    #  Загружаем промежуточный сертификат для подписи
    ca_cert = crypto.load_certificate(crypto.FILETYPE_PEM, open(CA_CRT).read())
    #  Загружаем промежуточный ключ, последний параметр пароль
    ca_key = crypto.load_privatekey(crypto.FILETYPE_PEM, open(CA_KEY).read(), "password")

    k = crypto.PKey()
    k.generate_key(crypto.TYPE_RSA, 1024)    # размер может быть 2048, 4196

    cert = crypto.X509()     cert.get_subject().C = "RU"    #  указываем свои данные
    cert.get_subject().ST = "Tatarstan"    #  указываем свои данные
    cert.get_subject().L = "Naberezhnye Chelny"    #  указываем свои данные
    cert.get_subject().O = "xazrad"    #  указываем свои данные
    cert.get_subject().OU = "xazrad"    #  указываем свои данные
    cert.get_subject().CN = "xazrad.blogspot.com"    #  указываем свои данные
    cert.set_serial_number(1000)
    cert.gmtime_adj_notBefore(0)
    cert.gmtime_adj_notAfter(10*365*24*60*60)    #  срок "жизни" сертификата
    cert.set_issuer(ca_cert.get_subject())
    cert.set_pubkey(k)
    cert.sign(ca_key, "sha1")

    with open(os.path.join(cert_dir, CERT_FILE), "w") as f:
        f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))

    with open(os.path.join(cert_dir, KEY_FILE), "w") as f:
        f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, k))

Использование crypto.FILETYPE_ASN1 (вместо crypto.FILETYPE_PEM) возвращает битовое значение сертификатов.

суббота, 8 ноября 2014 г.

Virualenv & Node.js

Для установки Node.js в vitualenv необходима библиотека nodeenv
source .../bin/activate     #  активирование Python virtualenv
pip install nodeenv     #  установка nodeenv
nodeenv --python-virtualenv     #  установка nodejs в текущее окружение (может занять продолжительное время)

Далее через npm можно устанавливать пакеты. Например:
npm install -g less

Django. Pgbouncer. PostgreSQL schemas

Для работы django c Pgbouncer можно использовать библиотеку Django-PostgresPool

Если в проекте django используется несколько схем для подключения к БД, то в настройку DATABASES необходимо добавить ключ 'OPTIONS' например:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'postgres',
'USER': 'django',
'PASSWORD': 'django',
'HOST': '127.0.0.1',
'PORT': '5432',
'OPTIONS': {'options':'-c search_path=schema1,schema2'}
}

'schema1,schema2' - перечисление используемых схем в БД

Однако, если используется пул соединений Pgbouncer эта опция работать не будет

Для решения этой проблемы необходимо подключиться к сигналу connection_created. Для этого в модуле models.py достаточно разместить этот код

from django.dispatch import receiver
from django.db.backends.signals import connection_created

@receiver(connection_created)
def connection_created_handler(sender, **kwargs):
    conn = kwargs.get('connection')
    if conn is not None:
        cursor = conn.cursor()
        cursor.execute("SET search_path={}".format('schema1,schema2',))

При возникновении ошибки:
ProgrammingError: autocommit cannot be used inside a transaction
Установите psycopg2 версии 2.4.1
pip install psycopg2==2.4.1