четверг, 29 июля 2021 г.

OpenSSL Шпаргалка по командам

Как работает HTTPS.

Сервер создает свой приватный ключ.
С помощью приватного ключа сервер создает запрос на подпись публичного сертификата, который должен будет подписать удостоверяющий центр. В запросе содержится публичный ключ и данные о владельце сервера. Эти данные будут являться частью сертификаты и будут доступными для просмотра.
Запрос на подпись публичного сертификата отправляется в удостоверяющий центр.
Удостоверяющий центр подписывает запрос с помощью своего приватного ключа и создает для сервера его публичный сертификат.
Браузер подключается к серверу через HTTPS.
Сервер отправляет в браузер свой публичный сертификат.
Браузер проверяет в удостоверяющем центре, что полученный публичный сертификат принадлежит серверу.
Если это подтверждается, то браузер зашифровывает публичным сертификатом свой ключ для симметричного шифрования и отправляет его серверу.
Сервер с помощью своего приватного ключа расшифровывает ключ для симметричного шифрования, полученный от браузера.
Далее при обмене данными браузер и сервер будут шифровать их с помощью этого симметричного ключа шифрования, который теперь есть у обоих.

Файл OpenSSL входит в состав Git и находится в папке: 

"C:\Program Files\Git\usr\bin\openssl.exe"

Узнать версию OpenSSL: 

openssl.exe version -a

Узнать набор команд OpenSSL

openssl.exe help

Список всех команд OpenSSL:

asn1parse         ca                   ciphers           cms          
crl                    crl2pkcs7        dgst               dhparam
dsa                   dsaparam        ec                  ecparam
enc                   engine             errstr             gendsa
genpkey           genrsa             help               list
nseq                 ocsp                passwd          pkcs12
pkcs7               pkcs8              pkey              pkeyparam
pkeyutl            prime              rand               rehash
req                   rsa                   rsautl             s_client
s_server           s_time            sess_id           smime
speed               spkac              srp                 storeutl
ts                     verify              version           x509

Получить список доступных алгоритмов шифрования:

openssl.exe ciphers -v 'ALL:COMPLEMENTOFALL'

Создание приватного ключа с сохранением его в файл private.key, алгоритмом шифрования RSA, размером ключа 2048 бит, защитой aes-128-cbc: 

openssl.exe genpkey \
-out private.key \
-algorithm RSA \
-pkeyopt rsa_keygen_bits:2048 \
-aes-128-cbc
..........................................+++++
...................................................................+++++
Enter PEM pass phrase: ************
Verifying - Enter PEM pass phrase: ************

При создании ключа можно задать пароль для доступа к нему - passphrase, например: 12345.

Для создания ключа лучше использовать алгоритм RSA с размером ключа 2048 бит.

Содержимое созданного приватного ключа в файле private.key выглядит так:

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQInW7GrFjUhUcCAggA
MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBBn8AErtRKB9p7ii1+g2OhWBIIE
0MnC2dwGznZqpTMX0MYekzyxe4dKlJiIsVr1hgwmjFifzEBs/KvHBV3eIe9wDAzq
[21 lines removed...]
IfveVZzM6PLbDaysxX6jEgi4xVbqWugd9h3eAPeBv9Z5iZ/bZq5hMbt37ElA2Rnh
RfmWSzlASjQi4XAHVLCs6XmULCda6QGvyB7WXxuzbhOv3C6BPXR49z6S1MFvOyDA
2oaXkfS+Ip3x2svgFJj/VpYZHUHwRCzXcDl/CdVg9fxwxcYHuJDH16Qfue/LRtiJ
hqr4fHrnbbk+MZpDaU+h4shLRBg2dONdUEzhPkpdOOkF
-----END ENCRYPTED PRIVATE KEY-----

Посмотреть расшифрованное содержимое приватного ключа из файла private.key можно так:

openssl.exe pkey -in private.key -text -noout

Enter pass phrase for private.key: ****************

RSA Private-Key: (2048 bit, 2 primes)
modulus:
    00:be:79:08:22:1a:bc:78:3c:17:34:4a:d3:5f:2b:
    [...]
publicExponent: 65537 (0x10001)
privateExponent:
    10:20:95:54:b5:e8:d1:51:5d:31:9b:48:4c:5d:90:
    [...]
prime1:
    00:f5:3f:74:cf:ef:8f:93:e9:54:b3:79:a1:f2:91:
    5a:7e:15:13:26:f7:f9:d7:a8:f3:f9:6b:2b:90:93:
    57:54:cc:84:c9:ea:6f:9f:39:ad:ad:60:4c:f0:68:
    16:db:1a:49:51:56:87:f1:70:ae:c9:42:89:2a:38:
    55:3e:17:a0:78:a7:52:49:10:79:cf:99:ae:53:c8:
    e0:60:5d:7e:91:26:86:3b:79:d2:70:c0:39:38:dd:
    ed:ee:75:c0:15:c6:30:51:00:a8:93:f3:8b:25:01:
    04:25:72:fc:9c:e9:73:d0:93:11:2d:82:e2:e3:d0:
    66:c0:36:2f:b6:de:de:0d:47
prime2:
    00:c6:d2:ce:66:b5:35:6b:35:d7:bb:b0:e3:f4:2d:
    [...]
exponent1:
    00:e9:2e:e9:b9:5f:f5:2b:54:fa:c5:1f:4c:7d:5f:
    [...]
exponent2:
    00:83:ea:bc:ad:a2:cf:a5:a9:9c:d0:d8:85:f6:ae:
    [...]
coefficient:
    68:18:a7:4f:aa:86:a7:e0:92:49:76:8d:24:65:fa:
    [...]

Вытаскивание отдельного публичного ключа из приватного ключа файла private.key в отдельный файл public.key:

openssl.exe pkey -in private.key -pubout -out public.key

Enter pass phrase for private.key: ****************

Содержимое извлеченного публичного ключа в файле public.key выглядит так:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvnkIIhq8eDwXNErTXytD
U1JGrYUgFsN8IgFVMJmAuY15dBvSCO+6y9FA0H08utJVtHScyWeOlo1uo0TQ3RWr
Pe7W3O2SaW2gIby2cwzGf/FBExZ+BCNXkN5z8Kd38PXDLt8ar+7MJ3vrb/sW7zs2
v+rtfRar2RmhDPpVvI6sugCeHrvYDGdA/gIZAMMg3pVFivPpHnTH4AR7rTzWCWlb
nCB3z2FVYpvumrY8TvIo5OioD2I+TQyvlxDRo14QWxIdZxvPcCUxXMN9MC8fBtLu
IlllDmah8JzF2CF5IxVgVhi7hyTtSQfKsK91tAvN30F9qkZNEpjNX37M5duHUVPb
tQIDAQAB
-----END PUBLIC KEY-----

Имея приватный ключ можно создать запрос на подпись публичного сертификата. В запросе содержится публичный ключ и данные о владельце сервера. Эти данные будут являться частью сертификаты и будут доступными для просмотра.

Создание запроса на подпись публичного сертификата с использованием приватного ключа private.key и записью публичного сертификата в файл sign-request.csr:

openssl.exe req -new -key private.key -out sign-request.csr

Enter pass phrase for private.key: ****************

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:New Yourk
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Your Company Name Ltd
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.your-site.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Получившийся запрос на подпись публичного сертификата в файле sign-request.csr можно подписать самому с помощью приватного ключа (в этом случае получится самоподписанный сертификат) или отправить на подпись в удостоверяющий центр, чтобы получить публичный сертификат.

Посмотреть содержимое запроса на подпись публичного сертификата из файла sing-request.csr можно так:

openssl.exe req -text -in sign-request.csr -noout

Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C = US, L = New Yourk, O = Your Company Name Ltd, CN = www.your-site.com
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:8a:d5:de:69:30:c7:77:b0:a0:54:f7:b3:34:9a:
                    96:1c:23:81:e3:9c:0c:81:a6:8a:a5:14:76:f4:4c:
                    b3:10:cb:ee:50:d1:ea:70:e9:7f:8f:75:67:f9:12:
                    83:b0:11:e7:6c:64:de:bc:af:bd:3f:43:da:b8:41:
                    96:75:34:63:85
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        Attributes:
            a0:00
    Signature Algorithm: ecdsa-with-SHA256
         30:44:02:20:52:b9:cf:ca:d1:25:1c:b7:57:65:fb:24:5d:95:
         15:f0:39:79:36:6c:d6:0a:42:6e:26:7c:54:e8:71:17:a5:99:
         02:20:5a:e0:cd:b3:60:ec:2c:fc:29:8c:f9:21:01:08:9a:a3:
         0d:fc:9a:d3:4f:24:fb:23:4f:c6:d7:a2:14:d1:54:f9

Создание запроса на подпись публичного сертификата на основе уже существующего публичного сертификата из файла public.crt:

openssl.exe x509 -x509toreq -in public.crt -out sign-request.csr -signkey private.key

Данную процедуру удобно выполнить, если вы хотите просто обновить публичный сертификат с истекшим сроком действия.

Создание запроса на подпись публичного сертификата на основе данных из конфигурационного файла config.cnf:

openssl.exe req -new -config config.cnf -key private.key -out sing-request.csr

Данную процедуру удобно выполнить, если вы не хотите создавать запрос на подпись в интерактивном режиме, вводя данные вручную так, как делали это выше по тексту.

Данные, находящиеся в файле config.cnf:

[req]
prompt = no
distinguished_name = dn
req_extensions = ext
input_password = PASSPHRASE

[dn]
CN = www.your-site.com
emailAddress = webmaster@www.your-site.com
O = Your Company Name Ltd
L = New Your
C = US

[ext]
subjectAltName = DNS:www.your-site.com,DNS:your-site.com

Создание самоподписанного публичного сертификата с помощью подписи запроса на подпись из файла sign-request.csr своим же приватным ключом private.key:

openssl.exe x509 -req -days 365 -in sign-request.csr -signkey private.key -out public.crt

Signature ok
subject=C = US, L = New Your, O =Your Company Name Ltd, CN = www.your-site.com
Getting Private key
Enter pass phrase for private.key: ****************

Создание самоподписанного публичного сертификата без промежуточного создания запроса на подпись публичного сертификата, используя только приватный ключ private.key:

openssl.exe req -new -x509 -days 365 -key private.key -out public.crt

Чтобы сразу ввести всю информацию с данными владельца сервера можно выполнить такую команду:

openssl.exe req -new -x509 -days 365 -key private.key -out public.crt \
 -subj "/C=US/L=New York/O=Your Company Name Ltd/CN=www.your-site.com"

Создание публичного сертификата, который может использоваться сразу для нескольких сайтов:

Сперва поместите дополнительную информацию об адресах сайтов в файл hostnames.txt:

subjectAltName = DNS:*.your-site.com, DNS:your-site.com

Создайте публичный сертификат с использованием файла hostnames.txt:

openssl.exe x509 -req -days 365 \
-in sign-request.csr -signkey private.key -out public.crt \
-extfile hostnames.ext

Если вы посмотрите на содержимое созданного публичного сертификата в файле public.crt, то так вы увидите новую секцию с данными ваших адресов сайтов:

X509v3 extensions:
    X509v3 Subject Alternative Name: 
        DNS:*.your-site.com, DNS:your-site.com

Просмотр содержимого публичного сертификата из файла public.crt:

openssl x509 -text -in public.crt -noout

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            76:bc:fb:f6:06:0e:61:eb:99:5e:83:ea:ef:92:0b:32:4f:fd:3b:51
        Signature Algorithm: ecdsa-with-SHA256
        Issuer: C = US, L = New York, O = Your Company Name Ltd, CN = www.your-site.com
        Validity
            Not Before: Aug 15 09:31:54 2020 GMT
            Not After : Aug 15 09:31:54 2021 GMT
        Subject: C = US, L = New York, O = Your Company Name Ltd, CN = www.your-site.com
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)
                pub:
                    04:8a:d5:de:69:30:c7:77:b0:a0:54:f7:b3:34:9a:
                    96:1c:23:81:e3:9c:0c:81:a6:8a:a5:14:76:f4:4c:
                    b3:10:cb:ee:50:d1:ea:70:e9:7f:8f:75:67:f9:12:
                    83:b0:11:e7:6c:64:de:bc:af:bd:3f:43:da:b8:41:
                    96:75:34:63:85
                ASN1 OID: prime256v1
                NIST CURVE: P-256
        X509v3 extensions:
            X509v3 Subject Alternative Name: 
                DNS:*.your-site.com, DNS:your-site.com
    Signature Algorithm: ecdsa-with-SHA256
         30:45:02:20:4d:36:34:cd:e9:3e:df:18:52:e7:74:c4:a1:97:
         91:6a:e7:c1:6d:12:01:63:d1:fd:90:28:32:70:24:5c:be:35:
         02:21:00:bd:02:64:c9:8b:27:8f:79:c7:a4:41:7c:31:2f:98:
         29:3e:db:8c:f3:f1:d7:bb:fa:fe:95:48:be:16:e1:ab:1b

Самоподписанные публичные сертификаты содержат в себе меньше данных, чем тем, что были подписаны и созданы удостоверяющим центром.

Приватные ключи и публичные сертификаты могут создаваться в разных форматах.

Самые распространённые форматы:

Binary (DER) certificate - содержит X.509 сертификат в сырой форме, используя кодировку DER ASN.1

ASCII (PEM) certificate(s) - содержит DER-сертификат в кодировке Base64, который начинается с заголовка  -----BEGIN CERTIFICATE----- и заканчивается подвалом  -----END CERTIFICATE----- . Обычно встречается в виде одного сертификата, находящегося в одном файле.

Legacy OpenSSL key format - содержит приватный ключ в сырой форме, используя кодировку DER ASN.1

ASCII (PEM) key - содержит DER-приватный ключ в кодировке Base64 и иногда некоторые метаданные (например алгоритм, использующийся для защиты паролем). Текст в заголовке и подвале ключа могут отличаться в зависимости от того, какой формат ключа использовался при создании этого ключа.

PKCS#7 certificate(s) - комплексный формат, созданный для транспортировки подписанных и зашифрованных данных, описанный в "RFC 2315". Обычно встречается в виде файлов с расширением ".p7b" и."p7c" и может включать в себя всю цепочку сертификатов при необходимости. Этот формат поддерживается утилитой "Java keytool".

PKCS#8 key - новый формат для хранения приватного ключа, описанный в "RFC 5208". Если вам по какой-либо причине необходимо преобразовать PKCS # 8 в устаревший формат, используйте команду pkcs8.

PKCS#12 (PFX) key and certificate(s) - комплексный формат, который может хранить в себе и защищать серверный приватный ключ вместе со всей цепочкой сертификатов. Он обычно встречается в виде файлов с расширением ".p12" и ".pfx". Этот формат обычно используется в программах Microsoft, но также используется в качестве клиентских сертификатов. В наши дни имя PFX используется как синоним PKCS#12 не смотря на то, что название PFX имеет отношение к другому старому формату (ранней версии PKCS#12). Маловероятно, что вы где-то столкнетесь со старой версией.

Конвертация форматов PEM и DER.

Конвертировать сертификат из формата PEM в DER:

openssl.exe x509 -inform PEM -in public.pem -outform DER -out public.der

Конвертировать сертификат из формата DER в PEM:

openssl.exe x509 -inform DER -in public.der -outform PEM -out public.pem

Конвертировать PEM в PKCS#12PKCS#12 (PFX):

openssl.exe pkcs12 -export \
    -name "My Certificate" \
    -out public.p12 \
    -inkey private.key \
    -in public.crt \
    -certfile intermediate-certificates-chain.crt

Enter Export Password: ****************
Verifying - Enter Export Password: ****************

Конвертировать PKCS#12PKCS#12 (PFX) в PEM:

openssl pkcs12 -in public.p12 -out public.pem -nodes

После этого нужно открыть в редакторе файл public.pem и вручную отделить индивидуальный приватный ключ, сертификат и файлы промежуточных сертификатов.

OpenSSL также может выделить нужные компоненты для вас с помощью следующих команд:

openssl.exe pkcs12 -in public.p12 -nocerts -out private.key -nodes
openssl.exe pkcs12 -in public.p12 -nokeys -clcerts -out public.crt
openssl.exe pkcs12 -in public.p12 -nokeys -cacerts -out intermediate-certificates-chain.crt

Конвертировать PEM в PKCS#7:

openssl.exe crl2pkcs7 -nocrl -out public.p7b -certfile public.crt -certfile intermediate-certificates-chain.crt

Конвертировать  PKCS#7 в PEM:

openssl.exe pkcs7 -in public.p7b -print_certs -out public.pem

Также, как и для конвертации в формат PKCS#12 вы должны будете открыть в редакторе файл public.pem, чтобы вручную отделить индивидуальный приватный ключ, сертификат и файлы промежуточных сертификатов.

Создание собственного удостоверяющего центра.

Процесс создания собственного удостоверяющего центра описан на сайте https://www.feistyduck.com/library/openssl-cookbook/online/ch-openssl.html в разделе "Creating a Root CA".

четверг, 17 июня 2021 г.

Monkey patch XMLHttpRequest

Monkey patch XMLHttpRequest.


 const xhrLogs: any[] = [];


monkeyPatchXMLHttpRequest(xhrLogs);


function monkeyPatchXMLHttpRequest (xhrLogs: any[]): void {

    const open: any = XMLHttpRequest.prototype.open;

    XMLHttpRequest.prototype.open = function (method: string, url: string, async?: boolean, username?: string, password?: string): void {

        xhrLogs.push({method: method, requestURL: url});

        open.apply(this, arguments);

    };

   const send: any = XMLHttpRequest.prototype.send;

    XMLHttpRequest.prototype.send = function (data): void {

        const logIndex: number = xhrLogs.length - 1;

        xhrLogs[logIndex].date = new Date();

        xhrLogs[logIndex].data = data;

        const self: any = this;

        const onreadystatechange: any = self.onreadystatechange;

        if (onreadystatechange) {

            self.onreadystatechange = function () {

                xhrLogs[logIndex].readyState = self.readyState;

                if (self.readyState === 4) {

                    xhrLogs[logIndex].url = self.responseURL;

                    xhrLogs[logIndex].readyState = 4;

                    xhrLogs[logIndex].responseHeaders = self.getAllResponseHeaders();

                    xhrLogs[logIndex].status = self.status;

                    xhrLogs[logIndex].statusText = self.statusText;

                    xhrLogs[logIndex].responseText = self.responseText.indexOf('PNG') !== -1 ? 'Картинка PNG' : self.responseText;

                }

                onreadystatechange.apply(self, arguments);

            }

        }

        send.apply(self, arguments);

    };

}

четверг, 25 марта 2021 г.

Package JavaScript code with Node.js in one executable file using PKG

Package JavaScript code with Node.js in one executable file using PKG.

1) Install library PKG:

npm install pkg

2) Open in your code editor file node_modules/pkg/lib-es5/fabricator.js

3) Find in this file row:

child = children[key] = (0, _child_process.spawn)(cmd, bakes.concat('-e', script), {

4) After this row add line of code to fix administarrtor rights problem:

shell: true,

5) Save your changes in file node_modules/pkg/lib-es5/fabricator.js

6) Open command line ("CMD") and type in it:

cd "... here is path to folder with your source code..."

Then press button "Enter" on your keyboard.

7) Then type in command line:

set NODE_TLS_REJECT_UNAUTHORIZED=0

and press "Enter" again.

This will fix SSL problem.

(If your want to run PKG library from your custom source code you can also write in it:

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

to do the same.)

8) Then type in command line for example:

node "D:\Work\Your application\node_modules\pkg\lib-es5\bin.js" your-start-file.js --debug --targets node14-windows-x64

to package your JavaScript application files together with Node.js in one executable file.


Execute JavaScript code in browser address bar

 How to execute JavaScript code in browser address bar?

1) Clear your browser address bar.

2) Copy this line of JavaScript code:

function showlog (string) {var pre = document.createElement('pre'); pre.innerHTML = string; document.getElementById('sbpllogs').appendChild(pre);} var d = document.createElement('div'); d.style.position = 'absolute'; d.style.zIndex = 100000; d.style.top = '0px'; d.style.left = '0px'; d.innerHTML = '<div style="position: relative;"><button id="sbplhideshow" onclick="(function () {' + "var self = document.getElementById('sbplhideshow'); var helpers = Array.prototype.slice.call(document.getElementsByClassName('sbplhelper')); if (self.innerHTML === 'HIDE') {self.innerHTML = 'SHOW'; helpers.forEach(function (helper) {helper.style.display = 'none';});} else {self.innerHTML = 'HIDE'; helpers.forEach(function (helper) {helper.style.display = 'inline-block';});}" + '})()" style="width: 100px; height: 25px; border: 1px solid black; cursor: pointer;">HIDE</button><button class="sbplhelper" onclick="(function () {' + "document.getElementById('sbpleditor').value = '';" + '})()" style="width: 100px; height: 25px; border: 1px solid black; cursor: pointer;">CLEAR</button><button class="sbplhelper" onclick="(function () {' + "var sbpleditor = document.getElementById('sbpleditor'); try {eval(sbpleditor.value); sbpleditor.value = '';} catch (e) {showlog(e); sbpleditor.value = 'ERROR'}" + '})()" style="width: 100px; height: 25px; border: 1px solid black; cursor: pointer;">RUN</button><br /><textarea id="sbpleditor" class="sbplhelper" style="display: inline-block; width: 500px; height: 200px; padding: 4px; background-color: white; border: 1px solid black; font-size: 16px;"></textarea><div id="sbpllogs" class="sbplhelper" style="overflow: auto; display: inline-block; width: 500px; height: 200px; padding: 0px 4px 0px 4px; background-color: white; border: 1px solid black; font-size: 16px;"></div></div>'; document.body.appendChild(d);

3) Paste this line into address bar.

4) Press together on keyboard buttons "Ctrl" and "A" to select all pasted line in the borwser address bar.

5) After that press "Left arrow" on keyboard. In result cursor in the address bar will move to the start of the line.

6) Now type on keyboard (with colon and without space);

javascript:

Result in your address bar will look like that:

[javasript:function showlog (string) {var pre = docu...]

7) Then just press "Enter" on your keyboard. This will execute JavaScript code in address bar.

8) This code will show on your page custom debug window with buttons: "HIDE", "CLEAR", "RUN" and two panels. 

In left panel you can enter your JavaScript code. 

In right panel you can see logs that will show there if you execute in the left panel custom function "showlog()".

For example.

Type in left panel this code:

var a = 10;

showlog("a equals " + a);

Then click on button "RUN".

In right panel you will see:

a equals 10

If you click on button "CLEAR" you will erase all code in the left panel.

If you click on button "HIDE" you will minimize custom debug window. 

After that you can click on button "SHOW" to show custom debug window in full size.