Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Технологии защиты программного обеспечения > Сертификат openSSL


Автор: Cheloveck 6.4.2010, 10:17
Итак, сабж: 
Имеем openssl. Нужно создать самоподписанный сертификат организации и подписанный им сертификат сервера.

С сертификатом организации проблем не возникает. Делаю так:
Код

openssl rand -out random.rnd 2048
openssl genrsa -rand random.rnd -out organization.key -des3
openssl req -new -key organization.key -config organization.cfg -out organization.csr
openssl x509 -req -signkey organization.key -in organization.csr -extfile organization.cfg -out organization.crt -days 365

в organization.cfg следующее:
Код

[ req ]
prompt = no
default_bits = 1024
distinguished_name = req_DN
extensions = v3_req

[ req_DN ]
countryName = RU
stateOrProvinceName = Tula
localityName = city
0.organizationName = MyCA
organizationalUnitName = "Certificate Authority"
commonName = "CA Common name"
emailAddress = [email protected]
[ v3_req ]
subjectAltName   = email:copy
basicConstraints = CA:true
nsComment        = "CA certificate of our organization"
nsCertType       = sslCA


далее нужно создать сертификат сервера и подписать его сертификатом организации. Вот проблемы с последним, программа виснет, а по нажатии ctrl+c выдаёт сообщение
Код

2036:error:0906D06C:PEM routines:PEM_read_bio:no start line:.\crypto\pem\pem_lib.c:698:Expecting: CERTIFICATE REQUEST

Итак, что я делаю
Код

openssl genrsa -rand random.rnd -out server.key
openssl req -new -key server.key -config server.cfg -out server.csr
openssl x509 -req -signkey organization.key -CA organization.crt -extfile server.cfg -out server.crt -days 365

Ну и содержимое server.cfg:
Код

[ req ]
default_bits  = 1024
distinguished_name = req_DN
extensions = v3_req
prompt = no
[ req_DN ]
countryName = RU
stateOrProvinceName = Tula
localityName = city
0.organizationName = MyServer
organizationalUnitName = OSSL_Server
commonName = Server_common
emailAddress = [email protected]
[ v3_req ]
subjectAltName   = email:copy
basicConstraints = CA:FALSE
nsComment        = "Server"
nsCertType       = server


Подскажите, что я делаю не так?

Автор: Cheloveck 6.4.2010, 20:55
Вобщем я нашёл толковое руководство. Кому интересно - оно http://www.bruy.info/ssl.html.

Автор: Cheloveck 7.4.2010, 17:34
Я переписал скрипт приведённый по ссылке в предыдущем посте на JScript (для запуска под M$ Windows). Выложу для тут, чтобы другие не мучались
Код

function Run()
{
    //
    // argument line handling
    //
    var stdout = WScript.StdOut;
    var args = WScript.Arguments;
    if(args.length != 1)
    {
        stdout.WriteLine("Usage: cscript " + WScript.ScriptName + " file.csr");
        return(1);
    }
    var csr_filename = new String(args(0));
    var crt_filename = new String;
    if(csr_filename.search(".csr$") == -1)
        crt_filename = new String(csr_filename + ".crt");
    else
    {
        var re = /csr$/;
        crt_filename = csr_filename.replace(re, "crt");
    }

    //
    // make sure environment exists
    //
    var fso = WScript.CreateObject("Scripting.FileSystemObject");
    if(!fso.FolderExists("ca.db.certs"))
        fso.CreateFolder("ca.db.certs");
    if(!fso.FileExists("ca.db.serial"))
    {
        var f = fso.OpenTextFile("ca.db.serial", 2, true);
        f.WriteLine("01");
        f.Close();
    }
    if(!fso.FileExists("ca.db.index"))
        fso.CreateTextFile("ca.db.index");
        
    //
    // create an own SSLeay config
    //
    var fconf = fso.OpenTextFile("ca.config", 2, true);
    var dir = "D:/openssl/share";
    fconf.WriteLine("[ ca ]");
    fconf.WriteLine("default_ca = CA_own");
    fconf.WriteLine("[ CA_own ]");
    fconf.WriteLine("dir = " + dir);
    fconf.WriteLine("certs = " + dir + "/certs");
    fconf.WriteLine("new_certs_dir = " + dir + "/ca.db.certs");
    fconf.WriteLine("database = " + dir + "/ca.db.index");
    fconf.WriteLine("serial = " + dir + "/ca.db.serial");
    fconf.WriteLine("RANDFILE = " + dir + "/ca.db.rand");
    fconf.WriteLine("certificate = " + dir + "/certs/ca.crt");
    fconf.WriteLine("private_key = " + dir + "/private/ca.key");
    fconf.WriteLine("default_days = 365");
    fconf.WriteLine("default_crl_days = 30");
    fconf.WriteLine("default_md = md5");
    fconf.WriteLine("preserve = no");
    fconf.WriteLine("policy = policy_anything");
    fconf.WriteLine("[ policy_anything ]");
    fconf.WriteLine("countryName = optional");
    fconf.WriteLine("stateOrProvinceName = optional");
    fconf.WriteLine("localityName = optional");
    fconf.WriteLine("organizationName = optional");
    fconf.WriteLine("organizationalUnitName = optional");
    fconf.WriteLine("commonName = supplied");
    fconf.WriteLine("emailAddress = optional");
    fconf.Close();
    
    //
    // sign the certificate
    //
    var shell = WScript.CreateObject("WScript.Shell");
    stdout.WriteLine("CA signing: " + csr_filename + " -> " + cert_filename + ":");
    shell.Run("openssl ca -config ca.config -out " + crt_filename + " -infiles " + csr_filename, 1, true);
    stdout.WriteLine("CA verifying: " + crt_filename + " <-> CA cert");
    shell.Run("openssl verify -CAfile " + dir + "/certs/ca.crt " + crt_filename, 1, true);
    
    //
    // cleanup after SSLeay
    //
    if(fso.FileExists("ca.config"))
        fso.DeleteFile("ca.config", true);
    if(fso.FileExists("ca.db.serial.old"))
        fso.DeleteFile("ca.db.serial.old", true);
    if(fso.FileExists("ca.db.index.old"))
        fso.DeleteFile("ca.db.index.old", true);
}

Run();


Автор: Akella 12.7.2010, 22:31
Цитата(Cheloveck @  6.4.2010,  10:17 Найти цитируемый пост)
Нужно создать самоподписанный сертификат организации и подписанный им сертификат сервера.

что это и для чего?

Автор: Cheloveck 13.7.2010, 14:31
Цитата(Akella @  12.7.2010,  22:31 Найти цитируемый пост)
что это и для чего?

Это для SSL/TLS. Честно говоря, я уже сам толком не помню, надо заново разбираться))

Добавлено через 41 секунду
ps я заюзал GnuTLS без сертификатов вообще.

Автор: Akella 16.7.2010, 15:23
я имел ввиду, что ты это использовал для передачи\получения данных?

Автор: Cheloveck 16.7.2010, 19:42
Цитата(Akella @  16.7.2010,  15:23 Найти цитируемый пост)
я имел ввиду, что ты это использовал для передачи\получения данных? 

Если о данном скрипте, то здесь вообще не идёт речи о передаче, тут только подписывается сертификат. А для передачи я хотел использовать openSSL, но, как уже говорил, заюзал GnuTLS.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)