PKI

Aliases

# ~/.bash_aliases

# --- openssl
alias catc='openssl x509 -text -noout -in'
alias grepc='sed "s/\\\n/\n/g" | sed "s/\"//g"  | openssl x509 -text -noout'

Терминология

Private Key

cat key.pem
# -----BEGIN RSA PRIVATE KEY-----
# MIIJKQIBAAKCAgEAs3AobSSIsQdlIn7WiRScgGLkVgoGeHJAiJji3KRxJgmzpzGk
# ...
# -----END RSA PRIVATE KEY-----
# or
# -----BEGIN PRIVATE KEY-----
# MIGkAgEBBDDIjVWDvyySfCJgbmccYc8e4+9yn4fwBcS/Ymjw0egGtgSriTMCHA3r
# ...
# -----END PRIVATE KEY-----

Certificate

Сертификат открытого ключа

# --- кодированное содержание crt-файла
cat cert.pem
# -----BEGIN CERTIFICATE-----
# MIICUDCCAfegAwIBAgIQS47DtENmQ2ru1NT0sCdcNjAKBggqhkjOPQQDAjBzMQsw
# ...
# -----END CERTIFICATE-----

openssl x509 -text -noout -in cert.pem
# alias catcert='openssl x509 -text -noout -in'
# alias grepcert='sed "s/\\\n/\n/g" | sed "s/\"//g"  | openssl x509 -text -noout'
# Certificate:
#     Data:
#         Version: 3 (0x2)
#         Serial Number:
#             4b:8e:c3:b4:43:66:43:6a:ee:d4:d4:f4:b0:27:5c:36
#         Signature Algorithm: ecdsa-with-SHA256
#         Issuer: C = US, ST = California, L = San Francisco, O = org1.example.com, CN = ca.org1.example.com
#         Validity
#             Not Before: Jun 25 05:20:00 2019 GMT
#             Not After : Jun 22 05:20:00 2029 GMT
#         Subject: C = US, ST = California, L = San Francisco, O = org1.example.com, CN = ca.org1.example.com
#         Subject Public Key Info:
#             Public Key Algorithm: id-ecPublicKey
#                 Public-Key: (256 bit)
#                 pub:
#                     04:b6:74:30:04:ea:65:e8:33:cc:69:e5:84:9c:58:
#                     5b:e5:f1:cf:9d:bc:18:7b:9d:4a:ee:dc:55:bf:cc:
#                     dc:ed:97:09:08:e4:57:9e:94:b8:48:b1:0d:db:3b:
#                     0d:32:bb:18:9d:b1:ae:c1:6d:90:1b:d9:9a:50:77:
#                     32:f3:65:30:3e
#                 ASN1 OID: prime256v1
#                 NIST CURVE: P-256
# ...

Certificate Signing Request (CSR)

Запрос на выпуск сертификата | CSR

cat server.csr
# -----BEGIN CERTIFICATE REQUEST-----
# MIIEXDCCAkQCAQAwFzEVMBMGA1UEAwwMMTAuMC4xMDAuMjQ5MIICIjANBgkqhkiG
# ...
# -----END CERTIFICATE REQUEST-----

openssl req -noout -text -in server.csr
# Certificate Request:
#     Data:
#         Version: 0 (0x0)
#         Subject: CN=10.0.100.249
#         Subject Public Key Info:
#             Public Key Algorithm: rsaEncryption
#                 Public-Key: (4096 bit)
#                 Modulus:
#                     00:e3:0c:00:ab:ce:51:ca:33:c5:db:98:3d:f4:67:
#                     ...
#                     7f:96:8d
#                 Exponent: 65537 (0x10001)
#         Attributes:
#             a0:00
#     Signature Algorithm: sha256WithRSAEncryption
#          c6:f9:63:08:76:65:39:bb:e5:da:00:9a:e1:5b:ae:9c:50:0b:
#          ...
#          0a:c8:26:31:28:3a:b3:e6

Создание доверенной зоны

Certification Authority

Создаем приватный ключ CA

openssl genrsa -aes256 -out ca-key.pem 4096
# ...

cat ca-key.pem
# -----BEGIN RSA PRIVATE KEY-----
# MIIJKQIBAAKCAgEAs3AobSSIsQdlIn7WiRScgGLkVgoGeHJAiJji3KRxJgmzpzGk
# ...
# -----END RSA PRIVATE KEY-----

Создаем файл конфигурации для сертификата (ca.cnf)

[req]
distinguished_name     = req_distinguished_name
x509_extensions        = v3_ca
prompt = no

[req_distinguished_name]
countryName            = RU
stateOrProvinceName    = Krasnodar
localityName           = Krasnodar
organizationName       = Org1
organizationalUnitName = []
commonName             = CA
emailAddress           = []

[v3_ca]
basicConstraints        = critical, CA:TRUE
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always, issuer:always
keyUsage                = critical, cRLSign, digitalSignature, keyCertSign

[v3_ca] references | how to

Создаем сертификат открытого ключа CA, время действия - 10 лет.

openssl req -new -x509 -days 3650 -key ca-key.pem -config ca.cnf -sha256 -out ca-cert.pem
# ...

cat ca-cert.pem
# -----BEGIN CERTIFICATE-----
# MIICUDCCAfegAwIBAgIQS47DtENmQ2ru1NT0sCdcNjAKBggqhkjOPQQDAjBzMQsw
# ...
# -----END CERTIFICATE-----

Назначаем права доступа ключу и сертификату

# приватный ключ "только для чтения" и только для текущего пользователя
chmod -v 0400 ca-key.pem
# сертификат "только для чтения" для всех пользователей
chmod -v 0444 ca.pem

Participant

Создаем приватный ключ для участника "доверенной зоны"

openssl genrsa -out org1-key.pem 4096
# ...

cat org1-key.pem
# -----BEGIN RSA PRIVATE KEY-----
# MIIJKQIBAAKCAgEAs3AobSSIsQdlIn7WiRScgGLkVgoGeHJAiJji3KRxJgmzpzGk
# ...
# -----END RSA PRIVATE KEY-----

Создаем файл запроса сертификата для участника

openssl req \
    -subj "/C=RU/ST=Krasnodar/L=Krasnodar/O=ORG1/OU=DRP/CN=Nik M" \
    -sha256 \
    -new \
    -key org1-key.pem \
    -out org1.csr
# ...

cat org1.csr
# -----BEGIN CERTIFICATE REQUEST-----
# MIIEXDCCAkQCAQAwFzEVMBMGA1UEAwwMMTAuMC4xMDAuMjQ5MIICIjANBgkqhkiG
# ...
# -----END CERTIFICATE REQUEST-----

Выпускаем сертификат для участника (на 1 год)

openssl x509 \
    -req \
    -days 365 \
    -sha256 \
    -in org1.csr \
    -CA ca.pem \
    -CAkey ca-key.pem \
    -CAcreateserial \
    -out org1-cert.pem
# ...

cat org1-cert.pem
# -----BEGIN CERTIFICATE-----
# MIICUDCCAfegAwIBAgIQS47DtENmQ2ru1NT0sCdcNjAKBggqhkjOPQQDAjBzMQsw
# ...
# -----END CERTIFICATE-----

После выпуска сертификата файл запроса (csr) можно удалить.

rm org1.csr

Валидация

Контрольные суммы открытых ключей из приватного ключа и сертификата должны совпадать

# -----BEGIN PRIVATE KEY-----
openssl pkey -pubout -outform PEM -in key.pem | openssl md5
# -----BEGIN RSA PRIVATE KEY-----
openssl rsa -pubout -outform PEM -in key.pem | openssl md5

# -----BEGIN CERTIFICATE-----
openssl x509 -noout -pubkey -outform PEM -in cert.pem | openssl md5

# -----BEGIN CERTIFICATE REQUEST-----
openssl req -noout -pubkey -outform PEM -in file.csr  | openssl md5


# ====
# validation ssh rsa key pair
# https://serverfault.com/a/767683/496157
# --- generate pub key and calc md5
ssh-keygen -y -f id_rsa | cut -d' ' -f 2 | openssl md5
# --- calc md5 for existing pub key
cut -d' ' -f 2 id_rsa.pub | openssl md5

PKEY Create

# Создаем приватный ключ CA
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ca-key.pem
cat ca-key.pem 
# -----BEGIN PRIVATE KEY-----
# MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgyWERDfrCl8RTSBum
# ... (одна строка)
# tHJ7vssc1KGbKcrn6USMNEAIK5ZWo/6xCYfax5yw9MnYgUglLijq3c1W
# -----END PRIVATE KEY-----