This page is CODEPAGE KOI8-R! Changes in your browser settings.
OPENSSL
На основе текста:
Автор: Vsevolod A. Stakhov/CEBKA
E-mail: VStakhov tehnopark org
---------------------------------------------------------------
Постоянная ссылка к статье: http://www.nixp.ru/articles/openssl
---------------------------------------------------------------
OpenSSL может использоваться во множестве случаев и умеет выполнять следующие задачи:
* Создавать и управлять ключами RSA и DSA - команды rsa, dsa, dsaparam
* Создавать сертификаты формата x509, запросы на сертификацию, восстановление -
команды x509, req, verify, ca, crl, pks12, pks7
* Зашифровывать данные с помощью симметрического или асимметрического шифрования -
команды enc, rsautl
* Высчитывать хеши различных типов - команда dgst
* Работа с S/MIME - команда s/mime
* Проверка работы серверов и клиентов ssl - команды s_client, s_server.
-----------------------------------------------------------------------
Standard commands openssl
asn1parse ca ciphers crl crl2pkcs7
dgst dh dhparam dsa dsaparam
enc engine errstr gendh gendsa
genrsa nseq ocsp passwd pkcs12
pkcs7 pkcs8 prime rand req
rsa rsautl s_client s_server s_time
sess_id smime speed spkac verify
version x509
Message Digest commands (see the `dgst' command for more details)
md2 md4 md5 mdc2 rmd160
sha sha1
Cipher commands (see the `enc' command for more details)
aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb aes-256-cbc
aes-256-ecb base64 bf bf-cbc bf-cfb
bf-ecb bf-ofb cast cast-cbc cast5-cbc
cast5-cfb cast5-ecb cast5-ofb des des-cbc
des-cfb des-ecb des-ede des-ede-cbc des-ede-cfb
des-ede-ofb des-ede3 des-ede3-cbc des-ede3-cfb des-ede3-ofb
des-ofb des3 desx rc2 rc2-40-cbc
rc2-64-cbc rc2-cbc rc2-cfb rc2-ecb rc2-ofb
rc4 rc4-40 rc5 rc5-cbc rc5-cfb
rc5-ecb rc5-ofb
-----------------------------------------------------------------------
На машине с процессором,
# cat /var/run/dmesg.boot | grep CPU
##################################################
CPU: AMD Athlon(tm) XP (1102.51-MHz 686-class CPU)
##################################################
Скорость генерации ssl будет:
sh# openssl speed
-----------------------------------------------------------------------------------------
OpenSSL 0.9.7e-p1 25 Oct 2004
built on: Fri Jan 12 06:26:06 UTC 2007
options:bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) aes(partial) blowfish(idx)
compiler: cc
available timing options: USE_TOD HZ=128 [sysconf value]
timing function used: getrusage
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
md2 785.32k 1694.47k 2384.26k 2652.44k 2742.97k
mdc2 1914.96k 2230.24k 2331.17k 2366.23k 2373.75k
md4 6282.25k 22541.42k 68293.74k 138635.25k 198016.44k
md5 4960.79k 17123.82k 47522.60k 84120.42k 110968.53k
hmac(md5) 6644.73k 21930.99k 56450.91k 92847.05k 114630.92k
sha1 5309.37k 16313.24k 38613.16k 58646.08k 69140.87k
rmd160 3694.50k 11445.42k 27515.02k 42453.17k 50361.86k
rc4 85999.34k 98077.49k 101002.39k 102156.52k 102641.80k
des cbc 28164.45k 29525.35k 29879.12k 30003.74k 29949.25k
des ede3 10603.55k 10785.04k 10856.83k 10877.25k 10836.85k
idea cbc 0.00 0.00 0.00 0.00 0.00
rc2 cbc 9929.57k 10457.93k 10592.37k 10614.50k 10632.55k
rc5-32/12 cbc 72167.12k 85850.02k 89506.75k 90806.62k 91260.29k
blowfish cbc 42786.60k 45905.62k 46749.15k 47040.58k 47186.61k
cast cbc 39661.75k 42370.65k 43032.10k 43342.49k 43246.62k
aes-128 cbc 21211.86k 21920.99k 22280.49k 22201.65k 22295.26k
aes-192 cbc 18648.44k 19114.85k 19378.33k 19483.23k 19490.68k
aes-256 cbc 16466.24k 16989.53k 17210.29k 17258.22k 17283.63k
sign verify sign/s verify/s
rsa 512 bits 0.0014s 0.0001s 737.5 8574.4
rsa 1024 bits 0.0058s 0.0003s 171.1 3377.7
rsa 2048 bits 0.0318s 0.0009s 31.4 1112.4
rsa 4096 bits 0.2016s 0.0031s 5.0 324.3
sign verify sign/s verify/s
dsa 512 bits 0.0010s 0.0012s 984.9 825.6
dsa 1024 bits 0.0027s 0.0032s 373.6 313.6
dsa 2048 bits 0.0084s 0.0103s 119.0 96.6
-----------------------------------------------------------------------------------------
Можно так же сделать выборку из групп алгоритмов по схеме
--------------------
openssl ciphers NAME
--------------------
где NAME - это символическое название
группы алгоритмов. Обычно используются значения
LOW - алгоритмы низкого уровня безопасности(<128 бит)
MEDIUM - алгоритмы среднего уровня стойкости(128 бит)
HIGH - алгоритмы высокой стойкости(> 128 бит)
ALL - все алгоритмы
NULL - алгоритмы без шифрования.
sh# openssl ciphers HIGH
----------------------------------------------------------------------------------------------------------------------------------------------------
ADH-AES256-SHA:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA:ADH-DES-CBC3-SHA:DES-CBC3-MD5
----------------------------------------------------------------------------------------------------------------------------------------------------
Именно это и интересно... ;)
Создание файла с рандомными данными и но основе файла -rand и длинны num:
-----------------------------------------
openssl rand [-out file] [-rand file] num
-----------------------------------------
Хотя можно просто получить строку на stdout с рандомными данными:
sh# openssl rand -rand /dev/urandom 50
------------------------------------
аF╥tецOО`'╬taaКщUzдnИ ЦУ║Ц2/Ы©eПKP╧e
------------------------------------
В качесте файла для -rand можно указать /dev/random или /dev/urandom
или создать свой файл с рандомными данными и его использовать.
sh# dd if=/dev/random of=random.txt count=128
-------------------------------------------------------------
128+0 records in
128+0 records out
65536 bytes transferred in 0.005290 secs (12388584 bytes/sec)
-------------------------------------------------------------
Ну и на основе его сгенерим строку:
sh# openssl rand -rand random.txt 50
---------------------------------
zъEcIQФIСpГG
╦╣Т╝╜╪]rik╥6╘#Л27╥1/ч?ОЪОЮЗ
U
---------------------------------
RSA - криптографический алгоритм с открытым ключом для шифрования и цифровой подписи.
Команда genrsa создает секретный ключ длиной bits в формате PEM, шифрует его одним из алгоритмов:
des (56 бит), des3 (3-й des 168 бит) или idea (128 бит) иначе если шифрование не указано ключ не
шифруется.
---------------------------------------------------------------------
openssl genrsa [-out file] [-des | -des3 | -idea] [-rand file] [bits]
---------------------------------------------------------------------
sh# openssl genrsa -out rsa-key.pem -des3 -rand /dev/urandom 4096
----------------------------------------------------
2048 semi-random bytes loaded
Generating RSA private key, 4096 bit long modulus
...........++
.....................++
e is 65537 (0x10001)
Enter pass phrase for rsa-key.pem: xxxxxx
Verifying - Enter pass phrase for rsa-key.pem: xxxxxx
-----------------------------------------------------
Мы создали секретный ключ, зашифровали его и записали в файл (в текстовом виде).
Если его ключ пропустить через cat на stdout, можно будет увидеть в начале
ключа алгоритм шифрования.
sh# cat rsa-key.pem
################################################################
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,94FC35143D398EB5
yzsYB3C0PDTWy9vLu+gifkm6oGXnLe5Mz9wSVN/rELBPwzDFmHIEfTPpeBeja8pl
p+WaZh5ch6unqsITud4j69JN+07JZ6oJyZPsNioVKftgprzGHzuDH7X6dnLT8+jx
RmfNurbxkAmZow7tStYRU4KB6rLNjU7f7rHNoJsZYWtPZyFPxqMfs2T/TFj05Gy5
-SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP-
jajk9rrphJ4zVt8+42EwCSE8RGdh87Vu8WWPAKm/dASggiFUY9Sd1sCireWd+0Vb
ARAXy+b7yGUSpeSgc41jqZvkX/B4GfPAH10hPnuA97biwDFiMRxxjoOvNmhHT0GQ
sVXhGJh0wweDorUErbx3Wu6gOvGSzb+/gs1gZw1KVG1JYU2TKZqfYy+XxKt7EvES
-----END RSA PRIVATE KEY-----
################################################################
Для создания публичного ключа rsa на основе секретного используется
команда openssl rsa. Даная команда имеет следующий формат:
-----------------------------------------------------------------------------
openssl rsa -in filename [-out file] [-des | -des3 |-idea] [-check] [-pubout]
-----------------------------------------------------------------------------
Утилита openssl rsa способна изменять пароль и алгоритм шифрования секретного
ключа, будучи вызвана с параметром -in и -out.
Если применить параметр -pubout, то в указанный файл -out будет записан
публичный ключ, вычисленный на основе -in секретного. Например, создание
публичного ключа на основании секретного:
sh# openssl rsa -in rsa-key.pem -out pub-rsa-key.pem -pubout
----------------------------------------
Enter pass phrase for rsa-key.pem: xxxxx
writing RSA key
----------------------------------------
sh# cat pub-rsa-key.pem
################################################################
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArdK5buoc52OrEe+45S0w
0rRTpfawqNNH0U5jqI+AckhkyeKzgkp4BNFvFHpz87LmLqk8RWJpZbxSrrjGNpCN
-SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP-
tDsIgze3/Bik38q+mJYpuAykN4FsBusvdsSnQV6JMIsJ5LUKxxTdm/J01Jdk6IVI
sqeVd85S6rc/fHYGGp+Rb/nXVf9SX1Ey9cGIUArh5fF107GjNVlH+Q0bXS49jaBD
6Fmz7nvizqsta55TXfJ/B1ECAwEAAQ==
-----END PUBLIC KEY-----
################################################################
Хотя можно и поменять пароль и алгоритм шифрования у секретного
ключа rsa-key.pem:
sh# openssl rsa -in rsa-key.pem -out rsa-key1.pem -aes256
-----------------------------------------
Enter pass phrase for rsa-key.pem: xxxxxx
writing RSA key
Enter PEM pass phrase: xxxxxxx
Verifying - Enter PEM pass phrase: xxxxxx
-----------------------------------------
Просмотр результата:
# cat rsa-key1.pem
################################################################
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,DB6E2C246ED94086A0A73254C0FB3B51
jbbHPlMDGgBIeCONSJ+t7qiMcXMzUqgGrBmtXybvTjfNGGXcBwR0bvmDBYwMqOP2
XRQj6LCx00v1fihprh59yclKUwsfUgckJbzA3VUp2+xZ+i1dPUqOxFMsc4asVQBl
b3UbPzQrxvXCVOlSONS3mxu2HORHTTjikp1yEXvmy1SMaR8nCuSdzNfeGGU8Bc+o
-SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP-
h+2WCQmGLNg2WGPT13H+/cSekvtLDD7LAsJnRI+jwaaib/xdnykWw744GA48sz7d
3Bp/hhgs3cMiKNMI+NHO2PfmamQNhv6UziLEUM1oPxhySfjnYUwk2VnkVIb/Z+Gw
sHVOj9UQD3eJr6ug/PTEXNYWSQzSBBI+j3UWq2FYp9Vz/HSTa87Fpl/QoKZ+15A6
-----END RSA PRIVATE KEY-----
################################################################
DSA - алгоритм с использованием открытого ключа для создания электронной
подписи, НО НЕ ДЛЯ ШИФРОВАНИЯ!
Для создания ключей DSA используется утилита openssl gendsa, аналогичная genrsa,
но есть два отличия:
1. Для DSA-ключей нельзя указывать длину в битах
2. Ключи DSA могут генерироваться согласно параметрам, записанным в файл
paramfile утилитой openssl dsaparam. dsaparam имеет следующий формат:
-------------------------------------------------------------------
openssl dsaparam [-rand file{s}] [-C] [-genkey] [-out file] numbits
-------------------------------------------------------------------
numbits - длина желаемого ключа,
-С - заставляет dsaparam вывести на stdout код на СИ
-genkey - выходной файл с параметрами, дополнительно записывается созданный
секретный ключ DSA, но нельзя его сразу же зашифровать, поэтому удобнее воспользоваться
утилитой openssl gendsa, которая имеет схожий синтаксис с командой genrsa, но вместо
числа бит указывается файл параметров, созданный dsaparam:
sh# openssl dsaparam -rand /dev/urandom -C -genkey -out dsaparam.cfg 4096
----------------------------------------------------------------------------------------------------------------------
2048 semi-random bytes loaded
Generating DSA parameters, 4096 bit long prime
This could take some time
............+.....+..............+..+.....+.......+.+.............+++++++++++++++++++++++++++++++++++++++++++++++++++*
+.....+.+...............................+..............+........+..........+..........+.................+..............
....................................+.......+........+..+.......+.......+....+...+..+........+.+...............+.......
................+...........+..........................+.....+..........+.+......+..+.....+..+....+.+.........+........
..+..+.....+....+.....+..+.+.........+.+......+.....................+...........+.....+...+............+.+.............
.........+....+.............................+...+.....+...+...............+..+....................+....................
...........+...+..+........+.......+...+................+.+.....+.+.+.....+.........+..+........+...+.............+....
..+.....+..........+++++++++++++++++++++++++++++++++++++++++++++++++++*
static unsigned char dsa4096_p[]={
0x9C,0xAC,0xDF,0xD9,0x9B,0x37,0xEB,0xB3,0x25,0x19,0xF3,0x84,
0x73,0x58,0xF4,0x7A,0xAB,0xA2,0x0F,0x3B,0x7B,0xF9,0x87,0x01,
0x43,0x67,0x62,0x68,0xB7,0x00,0xDD,0xB3,0x8B,0x28,0xE5,0x21,
0xF0,0x96,0x01,0xBF,0x58,0x0B,0xC2,0x14,0x2A,0x52,0xFE,0xF1,
0xE8,0x5B,0x1C,0xEB,0x10,0x86,0x51,0xFA,0x05,0x0B,0xD9,0xE7,
0x56,0xB7,0x23,0xDB,0xF4,0x5E,0x0A,0xB8,0xF1,0x80,0x93,0x07,
0x7F,0xE1,0xC4,0x13,0x46,0xA9,0x56,0x2E,0xCC,0xDC,0x9A,0x03,
0x44,0x49,0x7A,0xEF,0x31,0x6E,0x99,0x57,
};
static unsigned char dsa4096_q[]={
0xF9,0x4A,0x7F,0x66,0x28,0xB6,0xC4,0x51,0x83,0x97,0x17,0x6A,
0x98,0x59,0xB8,0x18,0x1D,0xC3,0x03,0xAD,
};
static unsigned char dsa4096_g[]={
0x15,0x7D,0x50,0xB1,0xD3,0xD5,0x98,0x36,0x0D,0x66,0x66,0xB5,
0xF0,0x72,0x07,0x83,0x10,0x5B,0xD5,0x00,0x56,0x50,0x51,0x8F,
0x0E,0x82,0x1D,0x57,0x2D,0x1B,0x5A,0x78,0xCA,0x96,0x95,0x60,
0xE6,0x17,0xD3,0x1D,0x64,0xA5,0x8E,0xB5,0x96,0x87,0x14,0xB5,
0x75,0x70,0x6F,0x01,0x3A,0xB4,0xB4,0x43,0x4C,0x5D,0x21,0x51,
0xB5,0xFB,0x65,0x36,0x9B,0x44,0xA8,0x35,0xFF,0x53,0x82,0x89,
0x27,0x2F,0xC0,0x03,0xC7,0xBB,0x24,0xF5,
};
DSA *get_dsa4096()
{
DSA *dsa;
if ((dsa=DSA_new()) == NULL) return(NULL);
dsa->p=BN_bin2bn(dsa4096_p,sizeof(dsa4096_p),NULL);
dsa->q=BN_bin2bn(dsa4096_q,sizeof(dsa4096_q),NULL);
dsa->g=BN_bin2bn(dsa4096_g,sizeof(dsa4096_g),NULL);
if ((dsa->p == NULL) || (dsa->q == NULL) || (dsa->g == NULL))
{ DSA_free(dsa); return(NULL); }
return(dsa);
}
----------------------------------------------------------------------------------------------------------------------
Вывалило целую кучу... ;)
# cat dsaparam.cfg
################################################################
-----BEGIN DSA PARAMETERS-----
MIIEIAKCAgEAnKzf2Zs367MlGfOEc1j0equiDzt7+YcBQ2diaLcA3bOLKOUhO8Mm
MJnGy2y7nkNQNYXampOVXqQjEdC1I7UW+Va4mPgtvypv5THGiVD3UBscseggBefm
BDeY7dwS6jmYFRn6CMnd+uAZ0H9lqVGkmWBRYOjfc0VIrLXMNUJ5ZTZsyEiTZdRO
-SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP-
Z8jn4e8r15CVy5bwB349a/JqWY2TVWZpS54PkSr53jHIOabfgg3lk7R/uYwuDpoQ
JZoR1ADPtjrOJafgIoRdEjDRDWXVZexmZuk0ovGYdmZso402bOSs7tnWTIcGo+jB
UyXtawsyJyfjGZ5sD4ROqcJ0LASFzb08GzAT6xnlBlVOTJPpamshYYdy76InpCiS
-----END DSA PARAMETERS-----
-----BEGIN DSA PRIVATE KEY-----
MIIGPQIBAAKCAgEAnKzf2Zs367MlGfOEc1j0equiDzt7+YcBQ2diaLcA3bOLKOUh
O8MmMJnGy2y7nkNQNYXampOVXqQjEdC1I7UW+Va4mPgtvypv5THGiVD3UBscsegg
BefmBDeY7dwS6jmYFRn6CMnd+uAZ0H9lqVGkmWBRYOjfc0VIrLXMNUJ5ZTZsyEiT
-SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP-
EBPjQsX2gsRlvdmmaf/z858RWG9MvrphIaEbizFN84sScOthMpMGL6YlD1XT5Dj9
1NYD4V4NLgBJBZwoS/QauXVd2LFjA5D04hcn0DCd4ULISDsNcwdAANBxdwIUWD8q
8QCZu53qhVS3pwBj5HqrRPk=
-----END DSA PRIVATE KEY-----
################################################################
И на основе полученого файла создаём ключ dsa
sh# openssl gendsa -out dsa-key.pem -rand /dev/urandom -des3 dsaparam.cfg
-----------------------------------------
2048 semi-random bytes loaded
Generating DSA key, 4096 bits
Enter PEM pass phrase: xxxxxx
Verifying - Enter PEM pass phrase: xxxxxx
-----------------------------------------
sh# cat dsa-key.pem
################################################################
-----BEGIN DSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,D4AF71B418716E88
MkZYoSS++hsORUD0XUFjYSlScs8I0p3QvkdCA2QFDmaNVYVb74hKfO9j2heBjqhd
XFajlGuFVJRVwH6sZZcDLvI2grQiUrdn6FNHx57MO1DUDJoiq7VQIhlQtDBP6jZA
p1fU8K0o/t/NGkU2OhRZ6L6uZbjtrCxj7XCG/TlQiiYR4A70P1wh6OG9fwKDX9Sa
-SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP-
VhFJFsWQ9PWTu/GoeWY+8ll1Dx+LjARZHdGwrSZqyfWAWzC2e5TdsFUEggjhyObi
gFZZndYNuTkYZdJdI/sL4rVjULlisJtH1fXT2DmtjPyKmL+ItvqYmxLRnc/+UvMX
CRREooQyKlIBosAkAcT6sDzgjDCwbzKjuw+IcU0g0mhU+UPVflbqt6BHjNa2uKXO
/tMY7ruXo5tE1BaJC+friTdSdWiZ/mGS
-----END DSA PRIVATE KEY-----
################################################################
И по аналогии с rsa мы можем создать public dsa key
sh# openssl dsa -in dsa-key.pem -out pub-dsa-key.pem -pubout
-----------------------------
read DSA key
Enter PEM pass phrase: xxxxxx
writing DSA key
-----------------------------
# cat pub-dsa-key.pem
################################################################
-----BEGIN PUBLIC KEY-----
MIIGOjCCBC0GByqGSM44BAEwggQgAoICAQCcrN/ZmzfrsyUZ84RzWPR6q6IPO3v5
hwFDZ2JotwDds4so5SE7wyYwmcbLbLueQ1A1hdqak5VepCMR0LUjtRb5VriY+C2/
Km/lMcaJUPdQGxyx6CAF5+YEN5jt3BLqOZgVGfoIyd364BnQf2WpUaSZYFFg6N9z
-SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP-
f8/yH3ss+s9+1YB2gut0tNpCyZNFAiSBBQ+Xnh6Y95DJxpNYtA2GfZ64kS3wp8Go
S/0M/lUxAIrOO1dTI+hx7w+9iKkQjwvwRdE5CkTLg1mLpj/95W9RZYOHuwsKR9Wv
5dt9ccaThe4gjWK72+w=
-----END PUBLIC KEY-----
################################################################
Шифрование файлов с помошью openssl.
Наиболее популярными являются следующие:
------------------------------------------------
base-64 (преобразование в текстовый вид)
bf (blowfish - 128 бит)
des (56 бит)
des3 (168 бит)
rc4 (128 бит)
rc5 (128 бит)
rc2 (128 бит)
idea (128 бит)
------------------------------------------------
Зашифруем:
sh# openssl des3 -in /var/log/messages -out messages.des3
----------------------------------------------------------
enter des-ede3-cbc encryption password: xxxxxx
Verifying - enter des-ede3-cbc encryption password: xxxxxx
----------------------------------------------------------
Если посмотреть, файл стал нечитабельным
Расшифруем:
sh# openssl des3 -d -in messages.des3 -out messages
----------------------------------------------
enter des-ede3-cbc decryption password: xxxxxx
----------------------------------------------
Снова можно любоваться содержимым файла.
sh# openssl base64 -in /var/log/messages -out messages.base64
Файл преобразовался но пароль не нужно было вводить, так как
не произошло шифрование.
Но не нужно забывать что:
-d - рашифровка
-a - подмешивание base64, например, к blowfish
-k - задать пароль как параметр...
Пример в обе стороны:
sh# openssl bf -a -k 123456 -in /var/log/messages -out messages.bf-b64
sh# openssl bf -a -d -k 123456 -in messages.bf-b64 -out messages
С помощью openssl можно производить вычесление хэшей (контрольных сумм).
Алгоритмы хеширования могут применяться следующие:
-------------------------
md2 (128 бит)
md4 (128 бит)
md5 (128 бит)
mdc2 (128 бит)
sha (160 бит)
sha1 (160 бит)
ripemd160 (160 бит)
-------------------------
sh# openssl md5 messages
-----------------------------------------------
MD5(messages)= 4dbd7d70812c470da225b5033306eb3d
-----------------------------------------------
sh# openssl rmd160 messages
-------------------------------------------------------------
RIPEMD160(messages)= 900163f2e67b80b1e1bdbfa03bf335bae0d53252
-------------------------------------------------------------
Чё-так типа того. ;)
Утилита openssl dgst может использоваться для подписывания сообщения секретным
ключом и проверки ЭЦП публичным ключом. Для этого используется следующий синтаксис:
--------------------------------------------------------------
openssl dgst -sign private_key -out signature -hashalg file[s]
--------------------------------------------------------------
Создадим файл с сигнатурой file.sig на основе приватного ключа для messages
sh# openssl dgst -sign rsa-key.pem -out file.sig -md5 /var/log/messages
-----------------------------------------
Enter pass phrase for rsa-key.pem: xxxxxx
-----------------------------------------
И проверка по сигнатуре с публичным ключом выдала успех иначе (Verification Failure):
sh# openssl dgst -signature file.sig -verify pub-rsa-key.pem /var/log/messages
-----------
Verified OK
-----------
Теперь самое интересное и НУЖНОЕ: С-Е-Р-Т-И-Ф-И-К-А-Т-Ы
Файлы сертификатов X.509
Получение, выдача, передача и резервное копирование сертификатов и секретных ключей сопровождаются сохранением
их данных в специальных файлах. Чаще всего для этого используются файлы со следующими расширениями:
*.cer - сертификат, сохраненный в стандарте CER. Может включать сертификат, секретный ключ, путь сертификации.
*.der - сертификат, сохраненный в стандарте DER. Может включать сертификат, секретный ключ, путь сертификации.
*.crt - файл сертификата в формате CER, DER или Netscape.
*.pem - сертификат в кодировке Base64. Может также включать полный путь удостоверения сертификата и секретный ключ.
*.p8 - файл, содержащий секретный ключ, защищенный по стандарту PKCS#8.
*.p12 (в Windows используется расширение *.pfx) - файл сертификата, защищенный по стандарту PKCS#12.
Может включать сертификат, секретный ключ, путь сертификации.
Логика такая:
Сертификат содержит публичный ключ, подписанный одним из корневых доверенных центров сертификации
(или комплементарным секретным ключом), данные об организации, выдавшей сертификат и в некоторых
случаях зашифрованный секретный ключ, а также отпечаток (хеш) публичного ключа. Сертификаты имеют
время действия, по окончанию которого они автоматически считаются недействительными.
Реализация в теории (ПРАВИЛЬНАЯ):
1. Клиент создает сертификат
2. Клиент отправляет свой публичный сертификат (PKCS#7) в центр сертификации
3. В центре сертификации обрабатывается запрос клиента (запрос на сертификацию) и
и сертификат клиента подписывается секретным ключом центра сертификации
4. Клиент, имея публичный ключ центра сертификации, проверяет подлинность подписи и
может далее использовать свой сертификат
Для организации:
1. На сервере создается сертификат организации
2. Генерируется запрос на сертификацию и отправляется к некоему доверенному центру сертификации
(который будет известен всем клиентам и персоналу данной организации);
3. Получается сертификат организации, который можно использовать при создании сертификатов клиентов
Последние создаются так:
a) клиент посылает запрос на выдачу сертификата;
b) сервер создает сертификат клиента и подписывает его сертификатом организации;
c) клиент получает сертификат клиента и сертификат организации;
На практике:
После проверки достоверности ключа организации проверяется достоверность сертификата клиента.
После такой операции клиент будет точно уверен, что получил сертификат от данной организации,
и может его использовать для работы с ней.
Реализация в теории (НЕ ПРАВИЛЬНАЯ):
Зачастую сертификат организации бывает подписан самим собой, что требует от клиента
добавить сертификат организации к доверенным, напротив в ПРАВИЛЬНОЙ схеме сертификат
организации принадлежит к группе промежуточных центров сертификации.
На практике:
Создадим конфиг
sh# cat cert.cnf
-------------------------------------------------------
[ req ]
# длинна ключа
default_bits = 4096
# имя ключа
default_keyfile = key.pem
# имя организации выдающей сертификат
distinguished_name = JSC_Fort_Dialog
# если не указать этот параметр, то
# придёться интерактивно задавать
# данные для заполнения полей...
prompt = no
[ JSC_Fort_Dialog ]
# страна
CN=RU
# область
ST=Tatarstan
# город
L=Nab.Chelny
# организация
O=JSC Fort Dialog
# отделение
OU=OIT
# Имя для сертификата (персоны, получающей сертификат)
CN=RootCA
# почтовый ящик организации
emailAddress=admin@chelny.fortd.ru
-------------------------------------------------------
Создадим новый сертификат CA стандарта X.509 на основе нашего закрытого ключа использую
вышенаписаны конфиг сроком на 1 год. Итак, сначала создадим ключ, потом сертификат...
sh# openssl genrsa -out CAkey.pem -des3 -rand /dev/urandom 4096
sh# openssl req -x509 -new -key CAkey.pem -config cert.cnf -out CAcert.pem -days 365
Получили self-signed (самоподписаный, корневой) сертификат, именно этим сертификатом
можно подписывать клиентские сертификаты.