Розеттский камень GnuTLS/OpenSSL

Содержание

Создание приватного ключа

С помощью certtool из GnuTLS:

$ certtool --generate-privkey --bits 4096 --no-text --outfile ca.key
$ chmod go= ca.key

С помощью OpenSSL:

$ openssl genrsa -out ca.key 4096
$ chmod go= ca.key

Создание самозаверенного сертификата удостоверяющего центра

С помощью certtool из GnuTLS:

$ cat > ca.tpl <<END
organization = "Test Inc."
unit = "Sleeping dept"
locality = Ufa
state = "Bashkortostan Republic"
country = RU
cn = "CA Test"
serial = 1
expiration_days = 365
ca
cert_signing_key
crl_signing_key
END
$ certtool --generate-self-signed --template ca.tpl --load-privkey ca.key --outfile ca.crt

Опция serial = 1 задаёт серийный номер сертификата. При повторной выдаче сертификатов с теми же данными нужно увеличивать серийный номер сертификата, чтобы клиенты, запомнившие предыдущий сертификат, не отклоняли новый как поддельный, а принимали его как новую версию предыдущего сертификата.

Поле unit указывать не обязательно.

С помощью OpenSSL:

$ cat > ca.cnf <<END
[req]
default_bits = 4096
default_md = sha256
default_days = 365
distinguished_name = req_distinguished_name
x509_extensions = v3_ca
prompt = no

[req_distinguished_name]
0.organizationName = "Test Inc."
organizationalUnitName = "Sleeping dept"
localityName = Ufa
stateOrProvinceName = "Bashkortostan Republic"
countryName = RU
commonName = "CA Test"

[v3_ca]
basicConstraints = critical, CA:true, pathlen:0
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
END
$ openssl req -new -key ca.key -config ca.cnf -x509 -out ca.crt

Поле organizationUnitName указывать не обязательно.

Опция pathlen:0 запрещает подписывать этим сертификатом сертификаты промежуточных удостоверяющих центров. Если в цепочке заверения сертификатов допускается один промежуточный удостоверяющий центр, то эту опцию можно поменять на pathlen:1 и т.п.

Создание запроса сертификата

С помощью certtool из GnuTLS:

$ certtool --generate-privkey --bits 4096 --no-text --outfile www.key
$ chmod go= www.key
$ cat > www.tpl <<END
organization = "Test Inc."
unit = "Sleeping dept"
locality = Ufa
state = "Bashkortostan Republic"
country = RU
cn = "WWW Server Test"
serial = 1
expiration_days = 365
dns_name = "localhost"
ip_address = "127.0.0.1"
tls_www_server
encryption_key
END
$ certtool --generate-request --template www.tpl --load-privkey www.key --outfile www.csr

Опция serial = 1 задаёт серийный номер сертификата. При повторной выдаче сертификатов с теми же данными нужно увеличивать серийный номер сертификата, чтобы клиенты, запомнившие предыдущий сертификат, не отклоняли новый как поддельный, а принимали его как новую версию предыдущего сертификата.

Поле unit указывать не обязательно.

При необходимости можно повторять опции dns_name и ip_address для задания дополнительных имён и адресов, принадлежащих серверу.

С помощью OpenSSL:

$ cat > www.cnf <<END
[req]
default_bits = 4096
default_md = sha256
default_days = 365
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no

[req_distinguished_name]
0.organizationName = "Mathopd Test Inc."
#organizationalUnitName = "Sleeping dept"
localityName = Ufa
stateOrProvinceName = "Bashkortostan Republic"
countryName = RU
commonName = localhost

[v3_req]
basicConstraints = CA:false
keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment
END
$ openssl req -new -key www.key -config www.cnf -out www.csr

Поле organizationUnitName указывать не обязательно.

Доменное имя защищаемого сервера в случае с OpenSSL необходимо указать в опции commonName. Если нужно доказать дополнительные доменные имена и/или IP-адреса, то для этого в секцию [v3_req] нужно можно добавить опцию subjectAltName = @alt_names и описать дополнительные доменные имена и IP-адреса в секции [alt_names]:

[alt_names]
DNS.1 = localhost.localdomain
IP.1 = 127.0.0.1

Заверение сертификата

С помощью certtool из GnuTLS:

$ certtool --generate-certificate --load-request www.csr --load-ca-certificate ca.crt \
           --template www.tpl --load-ca-privkey ca.key --outfile www.crt

С помощью OpenSSL:

$ openssl x509 -req -in www.csr -CA ca.crt -CAkey ca.key -CAserial ca.srl -CAcreateserial -out www.crt

При заверении сертификата создаётся файл ca.srl с отмеченными в нём серийными номерами выданных сертификатов, так что в отличие от утилиты certool из GnuTLS, обновлять вручную серийный номер нового сертификата с теми же данными не требуется.

Создание параметров Диффи-Хеллмана

С помощью certtool из GnuTLS:

$ certtool --generate-dh-params --outfile www.dh

С помощью OpenSSL:

$ openssl dhparam -out www.dh 4096